1. ホーム
  2. git

[解決済み] Gitでコミットを部分的にチェリーピックする

2022-03-19 22:14:47

質問

2つの異なるブランチで作業しています。 リリース 開発 .

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

問題は、すべてのコミットが必要なわけではなく、特定のファイルの一部だけが必要なため、単純な

git cherry-pick bc66559

ではうまくいきません。

をすると

git show bc66559

diffを見ることはできますが、それを部分的に私の現在の作業ツリーに適用する良い方法をよく知りません。

どのように解決するのですか?

ここで必要になるのは git add -p ( -p の同義語です。 --patch ). これはコンテンツを追加するためのインタラクティブな方法を提供し、それぞれのハンクを入れるべきかどうかを決定させ、必要であればパッチを手動で編集することも可能にしています。

cherry-pickと組み合わせて使う場合。

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!

(を思い出させてくれたTim Heniganに感謝します)。 git-cherry-pick には --no-commit オプションが必要であることを指摘してくれた Felix Rabe に感謝します。 git reset . もし、コミットから少しだけ残したいだけなら git reset <path>... を使用して、これらのファイルだけをアンステージします)。

に特定のパスを指定することができます。 add -p が必要です。パッチから始めるのであれば cherry-pickapply .


本当に必要なら git cherry-pick -p <commit> (そのオプションは存在しません) を使用することができます。

git checkout -p <commit>

これは、現在のコミットと指定したコミットとの差分をとり、その差分から個別にハンクを適用できるようにするものです。このオプションは、引き込んだコミットの一部でマージマージが発生している場合に便利です。(ただし checkout とは異なります。 cherry-pick : checkout を適用しようとします。 <commit> の内容は完全に cherry-pick は、指定したコミットとその親コミットの差分を適用します。つまり checkout はそのコミット以上のものを適用することができ、それはあなたが望む以上のものであるかもしれません)。