2010-11-08 15 views
98

Wikipedia besagt, dass eine 3-Wege-Zusammenführung weniger fehleranfällig ist als eine 2-Wege-Zusammenführung und häufig keine Benutzereingriffe erforderlich sind. Warum ist das der Fall?Warum ist eine 3-Wege-Zusammenführung vorteilhaft gegenüber einer 2-Wege-Zusammenführung?

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

+0

Link zur Wikipedia-Seite (oder noch besser, Abschnitt) in Frage? – dmckee

Antwort

154

Sagen Sie und Ihr Freund verändern sich sowohl eine Datei ausgecheckt, und machte es einige Änderungen. 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 zweiseitige Zusammenführung (mit anderen Worten, ein Unterschied), das Tool konnte die beiden Dateien vergleichen, und sehen, dass die ersten und letzten Zeilen 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 Drei-Wege-Zusammenführung kann es die zwei Dateien vergleichen, aber es kann auch jedes 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.

+0

Beim Synchronisieren mit Remote-Repo in Eclipse habe ich eine Reihe von Zeilen im Remote-Code bekommen, die mit einer einzelnen Leerzeile im lokalen Code verglichen wurden und daher widersprüchlich waren. Aber diese Zeilen waren auch in meinem lokalen Code vorhanden. Ich weiß nicht, warum das Eclipse-Plugin es mit einer leeren Zeile verglichen hat. Tatsächlich gab es viele solcher Fälle in vielen Dateien. Ich wechsle zurück in den Zwei-Wege-Vergleich und alles sieht richtig aus. Früher habe ich nie versucht, in zwei Richtungen zu vergleichen. Ich rate mal, ob ich den Zweiwege-Vergleichsmodus standardmäßig auf ON setzen soll, weil ich sowieso durch den Code beim Konflikt lösen und Merge durchführen muss. – Mahesha999

11

Eine dreifache Zusammenführung, bei der zwei Änderungsmengen zu einer Basisdatei zusammengeführt werden, wenn sie angewendet werden, im Gegensatz zu einer Anwendung, und dann das Ergebnis mit der anderen zusammenführen.

Zum Beispiel, zwei Änderungen, wo eine Zeile an der gleichen Stelle hinzugefügt wird, könnte als zwei Ergänzungen interpretiert werden, nicht eine Änderung einer Zeile.

Zum Beispiel

Datei eines wird von zwei Personen modifiziert worden, ein Hinzufügen von Elch, ein Hinzufügen von Maus.

#File a 
    dog 
    cat 

#diff b, a 
    dog 
+++ mouse 
    cat 

#diff c, a 
    dog 
+++ moose 
    cat 

Nun, wenn wir die Differenzmengen fusionieren, wie wir sie anwenden, werden wir (3-Wege-Merge)

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

bekommen, aber wenn wir b anwenden, dann bei der Änderung aussehen von b bis c es sieht wie wir nur ein ‚u‘ zu einem ‚o‘ (2-Wege-Merge)

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

This slide von einer notgedrungen Präsentation ist interessant:

alt text

Die wesentliche Logik eines Merge-Tool Drei-Wege ist einfach:

  • Vergleichen Basis, Quelle und Zieldateien
  • Identifizieren Sie die "Chunks" in der Quell- und Zieldatei:
    • Die Stücke, die sie in alle entsprechen:
      • Chunks, dass die Basis
      • Chunks nicht übereinstimmen, dass die Basis von
    • zusammen aus einem fusionierten Ergebnis setzt Dann tun passen 3 Dateien
    • Die Chunks, die nicht mit der Basis übereinstimmen, weder in der Quelle noch im Ziel, aber nicht in beiden
    • sie (d. h. 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 aufgelöst werden sollen.

Beachten Sie, dass die "Brocken" in dieser Darstellung sind rein symbolisch. 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 über eine 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 und ob ein Konflikt sich ändert oder nicht.

+0

"ob sich der Konflikt ändert oder nicht." - nicht 2-wege merge (diff) zeigt auch einen Konflikt an (obwohl die Info als Quelle des Konflikts verloren gegangen ist)/ – Vlad

+1

Es ist jedoch in Git üblich, eine 4-Wege-Zusammenführung zu haben, wo die Basis eigentlich nicht ist das Gleiche. Immer noch ein 3-Wege-Merge ist besser und 2-Wege. – Wernight

+0

@Wernight, Gibt es eine 5-Wege-Zusammenführung? – Pacerier

14

Ich schrieb eine very detailed post about it. Grundsätzlich kann man Deletes/Adds nicht mit Zweiwege verfolgen, sehr, sehr unproduktiv.

+0

@pablo, Wenn ich eine Funktion vor X hinzufügen und Sie eine andere Funktion nach X hinzufügen und wir eine Drei-Wege-Zusammenführung machen, würde das Werkzeug ** beide Änderungen ** automatisch anwenden. Aber was passiert, wenn meine Änderung tatsächlich mit Ihrer Änderung in Konflikt steht (z. B. jeder von uns erstellt eine neue Funktion mit demselben Funktionsnamen)? Wie soll die automatische Verschmelzung wissen, dass einige unserer "langweilig leichten" Verschmelzungen tatsächlich einen Konflikt auslösen können? – Pacerier

+1

Lesen Sie einfach Ihr Tutorial, und es ist wirklich hilfreich für mich. Ich fühle mich genauso wie die von dir beschriebenen Entwickler. Ich habe immer die Drei-Wege-Fusion befürchtet. – racl101

+0

Ich würde vorschlagen, dass Sie Teile Ihres Artikels kopieren und einfügen. Ich denke, das wird Ihnen helfen, Upvotes zu bekommen und wird mehr mit der Philosophie von stackoverflow übereinstimmen. – Samuel