web-dev-qa-db-ja.com

3ウェイマージが2ウェイマージよりも有利なのはなぜですか?

Wikipedia は、3者間マージは2者間マージよりもエラーが発生しにくく、多くの場合、ユーザーの介入を必要としないと言います。これはなぜですか?

3者間マージが成功し、2者間マージが失敗する例が役立ちます。

139

あなたとあなたの友人の両方がファイルをチェックアウトし、いくつかの変更を加えたとします。最初に行を削除し、友人が最後に行を追加しました。それから彼は彼のファイルをコミットし、あなたは彼の変更をあなたのコピーにマージする必要があります。

双方向のマージ(つまり、差分)を行っている場合、ツールは2つのファイルを比較し、最初の行と最後の行が異なることを確認できます。しかし、違いをどう処理するかをどのように知るのでしょうか?マージされたバージョンには最初の行を含める必要がありますか?最後の行を含める必要がありますか?

3者間マージでは、2つのファイルを比較できますが、各ファイルを元のコピーと比較することもできます(どちらかが変更する前)。したがって、最初の行を削除し、友人が最後の行を追加したことがわかります。そして、その情報を使用して、マージされたバージョンを作成できます。

223
JW.

このスライド perforceプレゼンテーションから興味深いものです:

slide image

3者間マージツールの基本的なロジックは単純です。

  • ベース、ソース、およびターゲットファイルを比較する
  • ソースファイルとターゲットファイルの「チャンク」を特定します:
    • ベースと一致しないチャンク
    • ベースに一致するチャンク
  • 次に、で構成されるマージ結果をまとめます。
    • 3つのファイルすべてで互いに一致するチャンク
    • ソースまたはターゲットのいずれかでベースと一致するが、両方ではないチャンク
    • ベースとは一致しないが互いに一致するチャンク(つまり、ソースとターゲットの両方で同じ方法で変更されている)
    • ユーザーが解決する、競合するチャンクのプレースホルダー。

この図の「チャンク」は純粋に象徴的なものであることに注意してください。それぞれは、ファイル内の行、階層内のノード、またはディレクトリ内のファイルを表すことができます。それはすべて、特定のマージツールの能力に依存します。

3ウェイマージが2ウェイマージよりもどのような利点があるかを尋ねているかもしれません。実際には、双方向マージのようなものはありません。2つのファイルを比較し、1つのファイルからチャンクを選択して「マージ」できるツールのみです。
3方向マージのみが、チャンクがOriginからの変更であるかどうか、および変更が競合するかどうかを知ることができます。

68
VonC

それに関する非常に詳細な投稿 を書きました。基本的に、双方向の、非常に非生産的な削除/追加を追跡することはできません。

20
pablo

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
15
Theo Belaire