547

私は2つの異なるブランチに取り組んでいます:リリース開発

リリースブランチにコミットされたいくつかの変更を開発ブランチに統合する必要があることに気づきました。

問題は、すべてのコミットを必要とせず、特定のファイルの一部のハンクだけを必要とするため、単純なことです。

git cherry-pick bc66559

トリックをしません。

私がするとき

git show bc66559

差分は表示されますが、現在の作業ツリーに部分的に適用する良い方法がわかりません。

4

8 に答える 8

889

ここで必要になるのは、 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-pickcheckout

于 2009-10-06T14:51:44.257 に答える
80

古い質問に答えていることはわかっていますが、インタラクティブにチェックアウトすることでこれを行う新しい方法があるようです。

git checkout -p bc66559

クレジット別のgitcommitからインタラクティブにハンクを選択できますか?

于 2013-06-29T04:46:33.153 に答える
37

必要な変更が変更元のブランチの先頭にあると仮定して、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
于 2010-02-01T06:06:38.880 に答える
15

Mike Monkiewiczの回答に基づいて、提供されたsha1/branchからチェックアウトする1つ以上のファイルを指定することもできます。

git checkout -p bc66559 -- path/to/file.java 

これにより、現在のバージョンのファイルに適用する変更をインタラクティブに選択できます。

于 2014-10-24T12:48:17.430 に答える
2

コマンドラインでファイルのリストを指定し、すべてを1つのアトミックコマンドで実行する場合は、次のことを試してください。

git apply --3way <(git show -- list-of-files)

--3way:パッチが適切に適用されない場合、Gitはマージの競合を作成するため、を実行できますgit mergetool。省略--3wayすると、Gitはきれいに適用されないパッチをあきらめます。

于 2019-08-18T04:00:58.250 に答える
1

git format-patch気になるコミットの一部を切り取り、git amそれを別のブランチに適用するために使用します

git format-patch <sha> -- path/to/file
git checkout other-branch
git am *.patch
于 2020-03-16T22:24:18.677 に答える
0

「部分的にチェリーピッキング」が「ファイル内で、いくつかの変更を選択し、他の変更を破棄する」ことを意味する場合は、次のものを取り込むことで実行できますgit stash

  1. フルチェリーピックを行います。
  2. git reset HEAD^厳選されたコミット全体をステージングされていない作業変更に変換します。
  3. git stash save --patch:隠しておくべき不要な素材をインタラクティブに選択します。
  4. Gitは、作業コピーから隠された変更をロールバックします。
  5. git commit
  6. 不要な変更の隠し場所を捨てます:git stash drop

ヒント:不要な変更の隠し場所に名前を付ける場合:git stash save --patch junk今(6)を忘れると、後で隠し場所が何であるかがわかります。

于 2014-05-14T05:25:11.977 に答える
0

実際、この質問に対する最善の解決策は、checkoutcommendを使用することです。

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からのみ更新されます。

于 2021-01-27T15:47:05.863 に答える