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