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


回答:


259

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

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

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


「しかし、どうすればその違いをどうしたらいいのでしょうか?」わかりませんでした。(元のファイルを参照せずに)2つのファイルの違いをすでに確認できる場合、なぜ両方の変更をファイルのタイムスタンプの昇順で順次適用できないのですか?つまり、それは私の友人のコミットされたコピーが(新しい)オリジナルである(最初に行が追加された)もので始まり、次にその上に私のローカルな変更(ボタンでの行の削除)を適用します。
ハリー

7
@ハリーは、オリジナルには3行(ABC)があったと言います。それは私の友人のコピー(ABCD)から始まり、私のもの(BC)と比較します。オリジナルを見ないで、AとDの両方を削除して、最終的な結果はBCになると思うかもしれません。
JW。

80

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

スライド画像

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

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

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

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


「変更が競合するかどうか。」-双方向マージではない(diff)競合も表示されます(ただし、競合の原因で情報は失われます)/
Vlad

1
ただし、ベースが実際には同じではない4方向のマージがあることは、Gitでは一般的です。それでも、3ウェイマージの方が適切であり、2ウェイです。
2014年

@今夜、5方向のマージはありますか?
Pacerier 2015年

@Pacerier私が知っていることではありませんが、gitチェリーピック、またはリベース中に実際に起こっていることです。
2015年

非常に詳細で有用な説明
Kaneg

20

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


@ pablo、Xの前に関数を追加し、Xの後に別の関数を追加して3方向マージを行うと、ツールは両方の変更を自動的に適用します。しかし、私の変更が実際に変更と競合する場合はどうなりますか(たとえば、それぞれが同じ関数名で新しい関数を作成します)?自動マージは、「退屈なほど簡単」なマージが実際に競合を引き起こす可能があることをどのようにして認識しているのでしょうか?
Pacerier 2015年

1
あなたのチュートリアルを読んでください、そしてそれは私にとって本当に役に立ちます。私はあなたが説明した開発者と同じように感じます。私は常に3者間合併を恐れていました。
racl101 2015年

3
記事の一部をコピーして貼り付けることをお勧めします。これはあなたが賛成票を獲得するのに役立ち、stackoverflowの哲学とより一致すると思います。
Samuel

良い記事。以前はパッチを使用してリベースし、より多くのコンテキストを確認し、エディターと環境を使用して物事をチェックできるのが好きでしたが、簡単なものを手動で変更する方法は多すぎます。
残念なことに

20

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.