回答:
ここで必要なのはgit add -p
(-p
の同意語です--patch
)です。これにより、コンテンツをインタラクティブにチェックインする方法が提供され、各ハンクを入れるかどうかを決定したり、必要に応じてパッチを手動で編集したりすることもできます。
チェリーピックと組み合わせて使用するには:
git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset # unstage the changes from the cherry-picked commit
git add -p # make all your choices (add the changes you do want)
git commit # make the commit!
(git-cherry-pickに--no-commitオプションがあることを思い出させてくれたTim Heniganに感謝します。また、リセットする必要があることを指摘してくれたFelix Rabeに感謝します! 、git reset <path>...
それらのファイルのみをステージング解除するために使用できます。)
もちろんadd -p
、必要に応じて特定のパスを指定できます。パッチから始める場合は、cherry-pick
をに置き換えることができますapply
。
あなたが本当にgit cherry-pick -p <commit>
(そのオプションが存在しない)を望んでいるなら、あなたは使うことができます
git checkout -p <commit>
これにより、現在のコミットと指定したコミットが比較され、そのdiffのハンクを個別に適用できるようになります。あなたがの一部にしているマージの競合に引っ張っているコミットあなたに興味を持っていないならコミット場合、このオプションは、より有用である可能性がある(ただし、こと。checkout
から異なりcherry-pick
:checkout
試行を適用し<commit>
、完全に内容の、cherry-pick
の差分を適用します親からの指定されたコミット。これは、checkout
そのコミットだけではなく、必要以上に適用される可能性があることを意味します。)
cherry-pick -n
明らかにしませんでした -規則があること間違いなく、段階的変化を残す--no-commit
オプションが停止し、右コミットする前に、すなわち、すべての変更が上演で。リセットをリセットに追加します。
git checkout -p <F>
んではないあなたにFから変更を取得するだけで、それはあなたがABCDEFすべて一緒につぶしますし、あなたが望むことのどの部分を整理することができます。それをFからの変更点のいくつかにまで下げるのは苦痛です。一方、git cherry-pick -n <F>
はFからの変更のみを取得します。これらの変更の一部が競合する場合、適切にマージする方法を理解できるように役立ちます。
git reset
段階的なファイルを削除してしまうと、add -p
ちょうど「を追加することは何も」言わないでしょう。
私は古い質問に答えていることを知っていますが、インタラクティブにチェックアウトしてこれを行う新しい方法があるようです:
git checkout -p bc66559
必要な変更が変更元のブランチの先頭にあると想定して、git checkoutを使用します
単一ファイルの場合:
git checkout branch_that_has_the_changes_you_want path/to/file.rb
複数のファイルの場合はデイジーチェーンのみ:
git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb
上の構築マイクMonkiewiczの答えは、あなたはまた、付属のSHA1 /ブランチからチェックアウトまで、単一または複数のファイルを指定することができます。
git checkout -p bc66559 -- path/to/file.java
これにより、現在のバージョンのファイルに適用したい変更をインタラクティブに選択できます。
「部分的なチェリーピッキング」が「ファイル内で、一部の変更を選択し、他の変更を破棄する」ことを意味する場合は、次のコマンドを実行することで実行できますgit stash
。
git reset HEAD^
厳選されたコミット全体をステージングされていない作業上の変更に変換します。git stash save --patch
:不要な材料をインタラクティブに選択して隠しておきます。git commit
git stash drop
。ヒント:不要な変更の隠し場所に名前を付けると、git stash save --patch junk
(6)を忘れてしまった場合は、後でその隠し場所が何であるかがわかります。