私は2つの異なるブランチに取り組んでいます:リリースと開発。
リリースブランチにコミットされたいくつかの変更を開発ブランチに統合する必要があることに気づきました。
問題は、すべてのコミットを必要とせず、特定のファイルの一部のハンクだけを必要とするため、単純なことです。
git cherry-pick bc66559
トリックをしません。
私がするとき
git show bc66559
差分は表示されますが、現在の作業ツリーに部分的に適用する良い方法がわかりません。
私は2つの異なるブランチに取り組んでいます:リリースと開発。
リリースブランチにコミットされたいくつかの変更を開発ブランチに統合する必要があることに気づきました。
問題は、すべてのコミットを必要とせず、特定のファイルの一部のハンクだけを必要とするため、単純なことです。
git cherry-pick bc66559
トリックをしません。
私がするとき
git show bc66559
差分は表示されますが、現在の作業ツリーに部分的に適用する良い方法がわかりません。
ここで必要になるのは、 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
(オプションがあることを私に思い出させてくれたTim Heniganに--no-commit
感謝し、必要があることを指摘してくれたFelix Rabeに感謝しますgit reset
。コミットからいくつかのものだけを残したい場合は、git reset <path>...
それらのファイルだけをアンステージするために使用できます。)
必要に応じて、への特定のパスを提供できますadd -p
。パッチから始めている場合は、をに置き換えることができcherry-pick
ますapply
。
本当にしたい場合git cherry-pick -p <commit>
(そのオプションは存在しません)、次を使用できます
git checkout -p <commit>
これにより、現在のコミットと指定したコミットが差分され、その差分からハンクを個別に適用できるようになります。このオプションは、プルしているコミットに、関心のないコミットの一部でマージの競合がある場合に役立つ可能性があります(ただし、 :とcheckout
は異なりますcherry-pick
:の内容を完全にcheckout
適用しようとしますが、差分を適用しますその親からの指定されたコミットの。これは、そのコミットだけでなく、必要以上に適用できることを意味します。)<commit>
cherry-pick
checkout
古い質問に答えていることはわかっていますが、インタラクティブにチェックアウトすることでこれを行う新しい方法があるようです。
git checkout -p bc66559
必要な変更が変更元のブランチの先頭にあると仮定して、gitcheckoutを使用します
単一ファイルの場合:
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
Mike Monkiewiczの回答に基づいて、提供されたsha1/branchからチェックアウトする1つ以上のファイルを指定することもできます。
git checkout -p bc66559 -- path/to/file.java
これにより、現在のバージョンのファイルに適用する変更をインタラクティブに選択できます。
コマンドラインでファイルのリストを指定し、すべてを1つのアトミックコマンドで実行する場合は、次のことを試してください。
git apply --3way <(git show -- list-of-files)
--3way
:パッチが適切に適用されない場合、Gitはマージの競合を作成するため、を実行できますgit mergetool
。省略--3way
すると、Gitはきれいに適用されないパッチをあきらめます。
git format-patch
気になるコミットの一部を切り取り、git am
それを別のブランチに適用するために使用します
git format-patch <sha> -- path/to/file
git checkout other-branch
git am *.patch
「部分的にチェリーピッキング」が「ファイル内で、いくつかの変更を選択し、他の変更を破棄する」ことを意味する場合は、次のものを取り込むことで実行できますgit stash
。
git reset HEAD^
厳選されたコミット全体をステージングされていない作業変更に変換します。git stash save --patch
:隠しておくべき不要な素材をインタラクティブに選択します。git commit
git stash drop
。ヒント:不要な変更の隠し場所に名前を付ける場合:git stash save --patch junk
今(6)を忘れると、後で隠し場所が何であるかがわかります。
実際、この質問に対する最善の解決策は、checkout
commendを使用することです。
git checkout <branch> <path1>,<path2> ..
たとえば、マスターにいると仮定し、 dev1以降project1/Controller/WebController1.java
の変更を行いたい場合は、次のproject1/Service/WebService1.java
ように使用できます。
git checkout dev1 project1/Controller/WebController1.java project1/Service/WebService1.java
つまり、マスターブランチはこれら2つのパスでdev1からのみ更新されます。