Warum ist ein 3-Wege-Merge gegenüber einem 2-Wege-Merge vorteilhaft?

Laut Wikipedia ist eine 3-Wege-Zusammenführung weniger errorsanfällig als eine 2-Wege-Zusammenführung und benötigt häufig keinen Benutzereingriff. Warum ist das der Fall?

Ein Beispiel, bei dem eine 3-Wege-Zusammenführung erfolgreich ist und eine 2-Wege-Zusammenführung fehlschlägt, wäre hilfreich.

Angenommen, Sie und Ihr Freund haben beide eine Datei ausgecheckt und einige Änderungen daran vorgenommen. Du hast am Anfang eine Zeile entfernt und dein Freund hat am Ende eine Zeile hinzugefügt. Dann hat er seine Datei gespeichert, und Sie müssen seine Änderungen in Ihre Kopie zusammenführen.

Wenn Sie eine bidirektionale Zusammenführung (mit anderen Worten ein Diff) durchführen, könnte das Werkzeug die zwei Dateien vergleichen und sehen, dass die erste und die letzte Zeile unterschiedlich sind. Aber wie sollte es wissen, was mit den Unterschieden zu tun ist? Sollte die zusammengeführte Version die erste Zeile enthalten? Sollte es die letzte Zeile enthalten?

Mit einer dreifachen Zusammenführung kann es die zwei Dateien vergleichen, aber es kann auch jede von ihnen gegen die ursprüngliche Kopie vergleichen (bevor jeder von Ihnen es änderte). So kann es sehen, dass Sie die erste Zeile entfernt haben und dass Ihr Freund die letzte Zeile hinzugefügt hat. Und es kann diese Informationen verwenden, um die zusammengeführte Version zu erstellen.

Diese Folie aus einer Perforce-Präsentation ist interessant:

Alt-Text

Die essentielle Logik eines Dreiwege-Merge-Tools ist einfach:

  • Vergleichen Sie die Basis-, Quell- und Zieldateien
  • Identifizieren Sie die “Chunks” in der Quell- und Zieldatei:
    • Stücke, die nicht mit der Basis übereinstimmen
    • Stücke, die mit der Basis übereinstimmen
  • Stellen Sie dann ein Ergebnis zusammen, bestehend aus:
    • Die Chunks, die in allen 3 Dateien übereinstimmen
    • Die Blöcke, die weder in der Quelle noch im Ziel mit der Basis übereinstimmen, aber nicht in beiden
    • Die Blöcke, die nicht mit der Basis übereinstimmen, aber übereinstimmen (dh sie wurden sowohl in der Quelle als auch im Ziel auf dieselbe Weise geändert)
    • Platzhalter für die Blöcke, die Konflikte verursachen, die vom Benutzer aufgetriggers werden sollen.

Beachten Sie, dass die “Chunks” in dieser Abbildung rein symbolisch sind. Jeder könnte Zeilen in einer Datei oder Knoten in einer Hierarchie oder sogar Dateien in einem Verzeichnis darstellen. Es hängt alles davon ab, was ein bestimmtes Merge-Tool kann.

Sie fragen sich vielleicht, welchen Vorteil eine 3-Wege-Zusammenführung gegenüber einer 2-Wege-Zusammenführung bietet. Eigentlich gibt es keine Zwei-Wege-Zusammenführung, nur Werkzeuge, die zwei Dateien unterscheiden und es Ihnen ermöglichen, “zusammenzufassen”, indem Sie Stücke aus der einen oder anderen Datei auswählen.
Nur ein 3-Wege-Merge gibt Ihnen die Möglichkeit zu wissen, ob ein Chunk eine Änderung gegenüber dem Ursprung ist oder nicht und ob Änderungen sich ändern oder nicht.

Ich habe einen sehr ausführlichen Beitrag darüber geschrieben . Grundsätzlich kann man Deletes / Adds nicht mit Zweiwege verfolgen, sehr, sehr unproduktiv.

Ein Dreiwege-Merge, bei dem zwei Changesets zu einer Base-Datei zusammengeführt werden, wenn sie angewendet werden, im Gegensatz zu einem Apply-Ergebnis, das dann mit dem anderen Ergebnis zusammengeführt wird.

Wenn Sie beispielsweise zwei Änderungen vornehmen, bei denen eine Zeile an derselben Stelle hinzugefügt wird, könnte dies als zwei Additionen interpretiert werden, nicht als Änderung einer Zeile.

Beispielsweise

Die Datei a wurde von zwei Personen modifiziert, von denen eine Elche hinzufügt und eine Maus hinzugefügt wird.

#File a dog cat #diff b, a dog +++ mouse cat #diff c, a dog +++ moose cat 

Wenn wir jetzt die Änderungsmengen zusammenführen, wenn wir sie anwenden, erhalten wir (3-way merge)

 #diff b and c, a dog +++ mouse +++ moose cat 

Aber wenn wir b anwenden, dann schauen wir uns die Veränderung von b nach c an. Es sieht so aus, als würden wir nur ein ‘u’ in ein ‘o’ ändern (2-way merge)

  #diff b, c dog --- mouse +++ moose cat