ウィキペディアによると、3 方向のマージは 2 方向のマージよりもエラーが発生しにくく、多くの場合、ユーザーの介入は必要ありません。これはなぜですか?
3 方向のマージが成功し、2 方向のマージが失敗する例が参考になります。
ウィキペディアによると、3 方向のマージは 2 方向のマージよりもエラーが発生しにくく、多くの場合、ユーザーの介入は必要ありません。これはなぜですか?
3 方向のマージが成功し、2 方向のマージが失敗する例が参考になります。
あなたとあなたの友人の両方がファイルをチェックアウトし、それにいくつかの変更を加えたとします。あなたは最初の行を削除し、友人は最後に行を追加しました。その後、彼は自分のファイルをコミットしたので、あなたは彼の変更をあなたのコピーにマージする必要があります。
双方向のマージ (つまり、差分) を行っていた場合、ツールは 2 つのファイルを比較し、最初と最後の行が異なることを確認できます。しかし、違いをどう処理するかをどのように知るのでしょうか? マージされたバージョンに最初の行を含める必要がありますか? 最後の行を含める必要がありますか?
3 者間マージでは、2 つのファイルを比較できますが、それぞれのファイルを (どちらかが変更する前の) 元のコピーと比較することもできます。したがって、最初の行が削除され、友人が最後の行を追加したことがわかります。そして、その情報を使用して、マージされたバージョンを生成できます。
perforce プレゼンテーションのこのスライドは興味深いものです。
3 者間マージ ツールの本質的なロジックは単純です。
- ベース、ソース、およびターゲット ファイルを比較する
- ソース ファイルとターゲット ファイルの「チャンク」を特定します。
- ベースに一致しないチャンク
- ベースに一致するチャンク
- 次に、以下で構成されるマージ結果をまとめます。
- 3 つのファイルすべてで互いに一致するチャンク
- ソースまたはターゲットのいずれかでベースと一致しないが、両方で一致しないチャンク
- ベースには一致しないが、互いに一致するチャンク (つまり、ソースとターゲットの両方で同じように変更されている)
- ユーザーが解決する、競合するチャンクのプレースホルダー。
この図の「チャンク」は純粋に象徴的なものであることに注意してください。それぞれがファイル内の行、階層内のノード、さらにはディレクトリ内のファイルを表すことができます。それはすべて、特定のマージ ツールの機能に依存します。
2 方向マージよりも 3 方向マージの方がどのような利点があるかを尋ねているかもしれません。実際には、双方向マージのようなものはなく、2 つのファイルを比較し、一方のファイルまたは他方のファイルからチャンクを選択して「マージ」できるツールのみがあります。
チャンクがオリジンからの変更であるかどうか、および変更が競合するかどうかを知ることができるのは、3 方向マージだけです。
3 者間マージは、1 つのベース ファイルへの 2 つの変更セットが適用されるときにマージされます。一方を適用してから結果を他方とマージするのとは対照的です。
たとえば、同じ場所に行が追加された 2 つの変更がある場合、1 行の変更ではなく、2 つの追加と解釈される可能性があります。
たとえば、ファイルa
が 2 人のユーザーによって変更され、1 人が を追加しmoose
、もう 1 人が を追加したとしmouse
ます。
#File a
dog
cat
#diff b, a
dog
+++ mouse
cat
#diff c, a
dog
+++ moose
cat
ここで、変更セットを適用しながらマージすると、(3 方向マージ) が得られます。
#diff b and c, a
dog
+++ mouse
+++ moose
cat
しかし、b を適用すると、b から c への変更を見ると、'u' を 'o' に変更しているように見えます (双方向マージ)。
#diff b, c
dog
--- mouse
+++ moose
cat