回答:
あなたとあなたの友人の両方がファイルをチェックアウトし、いくつかの変更を加えたとします。最初に行を削除し、友達が最後に行を追加しました。それから彼は彼のファイルをコミットしました、そしてあなたは彼の変更をあなたのコピーにマージする必要があります。
双方向のマージ(つまり、差分)を行っている場合、ツールは2つのファイルを比較し、最初と最後の行が異なることがわかります。しかし、どのようにして違いをどうするかを知るのでしょうか?マージされたバージョンに最初の行を含める必要がありますか?最後の行を含める必要がありますか?
3者間マージでは、2つのファイルを比較できますが、各ファイルを元のコピー(どちらかが変更する前)と比較することもできます。したがって、最初の行を削除し、友達が最後の行を追加したことがわかります。そして、その情報を使用して、マージされたバージョンを生成できます。
perforceプレゼンテーションのこのスライドは興味深いものです。
3者間マージツールの基本的なロジックは簡単です。
- ベースファイル、ソースファイル、ターゲットファイルを比較する
- ソースファイルとターゲットファイルの「チャンク」を特定します。
- ベースと一致しないチャンク
- ベースと一致するチャンク
- 次に、以下で構成されるマージされた結果をまとめます。
- 3つのファイルすべてで互いに一致するチャンク
- ソースまたはターゲットのいずれかでベースに一致しないが、両方では一致しないチャンク
- ベースとは一致しないが互いに一致するチャンク(つまり、ソースとターゲットの両方で同じように変更されている)
- ユーザーが解決する、競合するチャンクのプレースホルダー。
この図の「チャンク」は純粋に象徴的なものであることに注意してください。それぞれ、ファイル内の行、階層内のノード、またはディレクトリ内のファイルを表すこともできます。それはすべて、特定のマージツールで何ができるかによって異なります。
3ウェイマージが2ウェイマージよりも優れている点を尋ねているかもしれません。実際には、双方向のマージというようなものはなく、2つのファイルを比較して、どちらか一方のファイルからチャンクを選択して「マージ」できるツールのみです。
3ウェイマージのみが、チャンクが元の変更であるかどうか、および変更が競合しているかどうかを知ることができます。
私はそれについて非常に詳細な投稿を書きました。基本的に、双方向の非常に非生産的な方法で削除/追加を追跡することはできません。
1つのベースファイルへの2つのチェンジセットが適用されるときにマージされる3ウェイマージ。一方を適用してから、結果をもう一方とマージします。
たとえば、同じ場所に行が追加される2つの変更があると、1つの行の変更ではなく、2つの追加として解釈されます。
例えば
ファイルaは2人で変更されています。1人はムースを追加し、もう1人はマウスを追加しています。
#File a
dog
cat
#diff b, a
dog
+++ mouse
cat
#diff c, a
dog
+++ moose
cat
ここで、変更セットを適用するときにマージすると、(3-wayマージ)が得られます
#diff b and c, a
dog
+++ mouse
+++ moose
cat
しかし、bを適用すると、bからcへの変化を見ると、 'u'を 'o'に変更しているように見えます(2方向マージ)
#diff b, c
dog
--- mouse
+++ moose
cat