2011-12-14 9 views
7

私は、リベースに3ウェイマージが必要な理由を理解しようとしています。我々はなぜgit rebaseは3-wayマージを必要としますか?

A1 - A2 
\ 
    B1 

とを持っている場合例えば、私はB1をチェックアウトしてきた、と私は実行したい:

git rebase A2 

はなぜGitはA2、B1とA1をマージしていますか? A2とB1で十分ではないのはなぜですか?つまり、コミットのA2とB1には、ツリーの現在の完全なスナップショットが含まれていないのでしょうか?

+1

ありがとうございました、私は私の質問に表示しようとしていたものです。 – worker1138

答えて

7

マージを実行するには、共通の祖先(A1)から2つのブランチで正確に何が起こったのかを調べる必要があります。あなたが正しく言ったように、Gitはコミット/ツリーのスナップショットを保存して実際の変更セットを取得するため、A2A1B1からA1を比較し、それらの個々の変更セットをマージする必要があります。

リベースでも同じことが起こります。 A2の変更セットをB1に適用するには、まず、A1A2の違いからその変更セットを計算する必要があります。そしてそれをB1に適用することができます。リベースは、パッチファイルの自動生成と同様のものと考えることができます。最初に、古いブランチからすべてのパッチファイルを生成し、それを現在のHEADに適用します。

したがって、実際に差分を計算するには、これらの3つのコミットがすべて必要です。コミットを見るだけで、コミットで何が起きたか把握できません。

+0

ありがとう、それは非常に良い意味があります。 – worker1138

関連する問題