221

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

次に、newbranch

git checkout -b newbranch

commit1commit2newbranchに 2つの新しいコミットを作成します。

次に、マスターに切り替えて作成しますcherry-pick

git checkout master
git cherry-pick hash_of_commit1

gitk調べてみると、 commit1とその厳選されたバージョンのハッシュが異なることがわかります。つまり、技術的には、これらは 2 つの異なるコミットです。

最後に、次のようにマージnewbranchmasterます。

git merge newbranch

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

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

4

2 に答える 2

150

簡潔な答え

心配する必要はありません。Git が処理します。

長い答え

たとえば SVN 1とは異なり、Git はコミットをデルタ形式で保存しませんが、スナップショット ベースです2,3。SVN はマージされた各コミットを単純にパッチとして適用しようとしますが (説明した正確な理由で失敗します)、Git は通常、このシナリオを処理できます。

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

ソース

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

于 2013-01-23T18:08:56.713 に答える