web-dev-qa-db-ja.com

Gitとのコミットを部分的にチェリーピッキング

私は2つの異なるブランチに取り組んでいます:releasedevelopment

releaseブランチにコミットされたいくつかの変更をdevelopmentブランチに戻す必要があることに気づきました。

問題は、コミットのすべてを必要とするのではなく、特定のファイルの中にいくつかのハンクだけを必要とすることです。

git cherry-pick bc66559

トリックはしません。

私がするとき

git show bc66559

差分を見ることはできますが、現在の作業ツリーに部分的に適用する良い方法を実際には知りません。

468
oliver

私は古い質問に答えていることを知っていますが、対話的にチェックアウトしてこれを行うための新しい方法があるようです。

git checkout -p bc66559

への功績別のgitコミットから対話的にハンクを選ぶことができますか?

67
Mike Monkiewicz

必要な変更が変更を必要とするブランチの先頭にあると仮定して、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
36
Jay Swain

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

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

これにより、現在のバージョンのファイルに適用したい変更を対話的に選択することができます。

14
Christian.D

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

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

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

1
jimbo1qaz

「部分的にチェリーピッキング」が「ファイル内で、いくつかの変更を選択し、他の変更を破棄する」ことを意味する場合、それは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)の実行を忘れると、後でその隠し場所がわかります。

0
Kaz