違い - チェリーピック git




チェリーピックの仕事の後、gitはどのようにマージされますか? (2)

短い答え

心配しないで、Gitはそれを処理します。

長い答え

例えばSVN 1とは異なり、Gitはコミットをデルタ形式ではなくスナップショットベースの 2,3に格納します。 SVNは各マージされたコミットをパッチとして適用しようとしますが(あなたが記述した理由で失敗します)、Gitは一般的にこのシナリオを処理することができます。

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

ソース

1 Subversionのスキップデルタ
2 Gitの基礎
3 Gitオブジェクトモデル

masterブランチがあるとしましょう。

次に、私たちはnewbranchを作ります

git checkout -b newbranch

newbranch 2つの新しいコミットをnewbranchます。commit1commit2

それからmasterに切り替えてcherry-pickを作って

git checkout master
git cherry-pick hash_of_commit1

gitkを見ると、 commit1とそのチェリーピックバージョンには異なるハッシュがあることがわかります。したがって、技術的には2つの異なるコミットです。

最後に、 newbranchmasterにマージしnewbranch

git merge newbranch

異なったハッシュを持つこれらの2つのコミットは問題なくマージされていますが、同じ変更を2回適用する必要があることを暗示しています。

gitはマージ中にコミットの内容をスマートに分析して、変更を2回適用しないでください。あるいは、これらのコミットが内部的にリンクされているとマークされていますか?


そのようなマージの後、あなたはチェリーピックされたコミットを歴史の中で2回持っているかもしれません。

これを防ぐための解決策は、重複(チェリーピック)されたブランチに対して推奨するarticleから引用しarticle 。マージの前にrebaseを使用します。

git cherry-pickの後にgit merge:重複コミットを避ける

マスターブランチとブランチを持っていると想像してください。b:

   o---X   <-- master
    \
     b1---b2---b3---b4   <-- b

これで、マスターのコミットb1とb3が緊急に必要ですが、bの残りのコミットは必要ありません。 だから、私たちがやっているのは、masterブランチとcheck-checkがチェリーピックがb1とb3をコミットすることです。

$ git checkout master
$ git cherry-pick "b1's SHA"
$ git cherry-pick "b3's SHA"

結果は次のようになります。

   o---X---b1'---b3'   <-- master
    \
     b1---b2---b3---b4   <-- b

私たちがマスターについてもう一度コミットすると、次のようになります:

   o---X---b1'---b3'---Y   <-- master
    \
     b1---b2---b3---b4   <-- b

現在、ブランチbをマスターにマージするとします。

$ git merge b

私たちは次のようになるでしょう:

   o---X---b1'---b3'---Y--- M  <-- master
     \                     /
      b1----b2----b3----b4   <-- b

これは、b1とb3によって導入された変更が履歴に2回現れることを意味します。 マージの代わりにリベースできるようにするには:

$ git rebase master b

どちらが得られるか:

   o---X---b1'---b3'---Y   <-- master
                        \
                         b2'---b4'   <-- b

最後に:

$ git checkout master
$ git merge b

私たちに与える:

   o---X---b1'---b3'---Y---b2'---b4'   <-- master, b

David Lemonのコメントで修正されたEDITの修正





cherry-pick