1. ホーム
  2. ギット

[解決済み】cherry-pick後のgit mergeはどのように機能するのでしょうか?

2022-04-21 23:57:24

質問

があるとします。 master という分岐があります。

次に newbranch

git checkout -b newbranch

に新たに2回コミットし newbranch : コミット1 コミット2

そして、masterに切り替えて、make cherry-pick

git checkout master
git cherry-pick hash_of_commit1

を見ると gitk を見ると コミット1 とそのチェリーピック版のハッシュは異なるので、厳密にはこれらはふたつの異なるコミットです。

最後に newbranchmaster :

git merge newbranch

で、ハッシュが異なるこれら二つのコミットは問題なくマージされたことがわかります。しかし、同じ変更を二度適用することを意味しているので、どちらかが失敗するはずです。

gitは本当にマージ中にコミットの内容を賢く分析して、変更を二度適用すべきではないと判断しているのでしょうか、それともこれらのコミットは内部的にリンクされているとマークされているのでしょうか?

解決方法は?

簡単な答え

心配しないでください、Gitが処理します。

長い回答

SVNなどとは異なり 1 の場合、Git はコミットをデルタ形式で保存しません。 スナップショットベース 2,3 . SVNでは、マージされた各コミットをパッチとして適用しようと素朴に試みますが(そして、あなたが言った通りの理由で失敗します)、Gitは一般にこのシナリオを処理することができます。

マージするとき、Gitは両方のHEADコミットのスナップショットを新しいスナップショットに結合しようとします。もしコードの一部やファイルが両方のスナップショットで同じであれば(つまり、あるコミットがすでにチェリーピックされていたため)、Gitはそれに手をつけません。

情報源

1 Subversionのスキップデルタ

2 Gitの基礎知識

3 Git のオブジェクトモデル