Warum ist eine 3-Wege-Zusammenführung gegenüber einer 2-Wege-Zusammenführung vorteilhaft?


165

Laut Wikipedia ist eine 3-Wege-Zusammenführung weniger fehleranfällig als eine 2-Wege-Zusammenführung und erfordert häufig keine Benutzereingriffe. Warum ist das so?

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

Antworten:


259

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

Wenn Sie eine bidirektionale Zusammenführung (mit anderen Worten einen Unterschied) durchführen, kann das Tool die beiden Dateien vergleichen und feststellen, dass die erste und die letzte Zeile unterschiedlich sind. Aber wie würde es wissen, was mit den Unterschieden zu tun ist? Sollte die zusammengeführte Version die erste Zeile enthalten? Sollte es die letzte Zeile enthalten?

Bei einer Drei-Wege-Zusammenführung können die beiden Dateien verglichen werden, aber es kann auch jede mit der Originalkopie verglichen werden (bevor einer von Ihnen sie geändert hat). So kann es sehen, dass Sie die erste Zeile entfernt haben und dass Ihr Freund die letzte Zeile hinzugefügt hat. Und diese Informationen können verwendet werden, um die zusammengeführte Version zu erstellen.


"Aber wie würde es wissen, was mit den Unterschieden zu tun ist?" Ich habe es nicht verstanden. Wenn die Unterschiede zwischen den beiden Dateien bereits erkennbar sind (ohne Bezug zum Original), warum können dann nicht beide Änderungen seriell in aufsteigender Reihenfolge der Zeitstempel der Dateien angewendet werden? Das heißt: Es beginnt damit, dass die festgeschriebene Kopie meines Freundes das (neue) Original ist (mit dem Zeilenzusatz oben) und dann meine lokalen Änderungen anwendet (Zeilenlöschung unten).
Harry

7
@ Harry Sagen Sie, das Original hatte drei Zeilen (ABC). Es beginnt mit der Kopie meines Freundes (ABCD) und vergleicht sie mit meiner (BC). Ohne das Original zu sehen, könnte es denken, dass ich sowohl A als auch D entfernt habe und dass das Endergebnis BC sein sollte.
JW.

80

Diese Folie aus einer Perforationspräsentation ist interessant:

Dia-Bild

Die wesentliche Logik eines Drei-Wege-Zusammenführungswerkzeugs ist einfach:

  • Vergleichen Sie Basis-, Quell- und Zieldateien
  • Identifizieren Sie die "Chunks" in der Quell- und Zieldateidatei:
    • Brocken, die nicht zur Basis passen
    • Stücke, die zur Basis passen
  • Stellen Sie dann ein zusammengeführtes Ergebnis zusammen, bestehend aus:
    • Die Chunks, die in allen 3 Dateien übereinstimmen
    • Die Chunks, die weder in der Quelle noch im Ziel mit der Basis übereinstimmen, aber nicht in beiden
    • Die Chunks, die nicht zur Basis passen, aber zueinander passen (dh sie wurden sowohl in der Quelle als auch im Ziel auf die gleiche Weise geändert).
    • Platzhalter für die Chunks, die in Konflikt stehen, müssen vom Benutzer aufgelöst werden.

Beachten Sie, dass die "Brocken" in dieser Abbildung rein symbolisch sind. Jedes kann Linien in einer Datei oder Knoten in einer Hierarchie oder sogar Dateien in einem Verzeichnis darstellen. Es hängt alles davon ab, wozu ein bestimmtes Zusammenführungswerkzeug in der Lage ist.

Möglicherweise fragen Sie sich, welchen Vorteil eine 3-Wege-Zusammenführung gegenüber einer 2-Wege-Zusammenführung bietet. Tatsächlich gibt es keine bidirektionale Zusammenführung, sondern nur Tools, die zwei Dateien unterscheiden und es Ihnen ermöglichen, "zusammenzuführen", indem Sie Blöcke aus der einen oder der anderen Datei auswählen.
Nur eine 3-Wege-Zusammenführung gibt Ihnen die Möglichkeit zu wissen, ob ein Block eine Änderung des Ursprungs ist oder nicht und ob sich der Konflikt ändert oder nicht.


"ob sich der Konflikt ändert oder nicht." - zeigt nicht 2-Wege-Zusammenführung (diff) auch einen Konflikt an (obwohl die Informationen ab der Quelle des Konflikts verloren gehen) /
Vlad

1
In Git ist es jedoch üblich, eine 4-Wege-Zusammenführung durchzuführen, bei der die Basis tatsächlich nicht dieselbe ist. Trotzdem ist eine 3-Wege-Zusammenführung besser und eine 2-Wege-Zusammenführung.
Wernight

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

@Pacerier Nicht das ich wüsste, aber genau das passiert tatsächlich während eines Git Cherry Pick oder Rebase.
Wernight

Sehr detaillierte und nützliche Erklärung
Kaneg

20

Ich habe einen sehr detaillierten Beitrag darüber geschrieben . Grundsätzlich kann man das Löschen / Hinzufügen nicht in beide Richtungen verfolgen, sehr, sehr unproduktiv.


@pablo, Wenn ich eine Funktion vor X hinzufüge und Sie nach X eine weitere Funktion hinzufügen und wir eine Drei-Wege-Zusammenführung durchführen, würde das Tool automatisch beide Änderungen anwenden. Aber was passiert, wenn meine Änderung tatsächlich mit Ihrer Änderung in Konflikt steht (z. B. erstellt jeder von uns eine neue Funktion mit demselben Funktionsnamen)? Wie soll die automatische Fusion wissen, dass einige unserer "langweilig einfachen" Zusammenschlüsse tatsächlich einen Konflikt verursachen können ?
Pacerier

1
Lesen Sie einfach Ihr Tutorial und es ist wirklich hilfreich für mich. Ich fühle mich genauso wie die Entwickler, die Sie beschrieben haben. Ich habe immer die Drei-Wege-Verschmelzung befürchtet.
racl101

3
Ich würde Ihnen empfehlen, Teile Ihres Artikels zu kopieren und einzufügen. Ich denke, dies wird Ihnen helfen, positive Stimmen zu erhalten, und wird mehr auf die Philosophie des Stackoverflow abgestimmt sein.
Samuel

Guter Artikel. Früher benutzte ich gerne Patches, um die Basis neu zu definieren, wenn Sie mehr Kontext sehen und Ihren Editor und Ihre Umgebung verwenden können, um Dinge zu überprüfen. Auf diese Weise wird jedoch viel zu viel manuelles Munging von einfachen Dingen durchgeführt. Es ist eine Schande, dass es keinen schönen Weg gibt, der die guten Teile von beiden kombiniert
JonnyRaa,

20

Eine Drei-Wege-Zusammenführung, bei der zwei Änderungssätze auf eine Basisdatei zusammengeführt werden, während sie angewendet werden, anstatt eine anzuwenden, und dann das Ergebnis mit der anderen zusammengeführt wird.

Zum Beispiel könnten zwei Änderungen, bei denen eine Zeile an derselben Stelle hinzugefügt wird, als zwei Ergänzungen interpretiert werden, nicht als Änderung einer Zeile.

Beispielsweise

Datei a wurde von zwei Personen geändert, von denen eine Elch und eine Maus hinzufügt.

#File a
    dog
    cat

#diff b, a
    dog
+++ mouse
    cat

#diff c, a
    dog
+++ moose
    cat

Wenn wir nun die Änderungssätze zusammenführen, während wir sie anwenden, erhalten wir (3-Wege-Zusammenführung)

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

Wenn wir jedoch b anwenden, sehen Sie sich die Änderung von b nach c an. Es sieht so aus, als würden wir nur ein 'u' in ein 'o' ändern (2-Wege-Zusammenführung).

    #diff b, c
    dog
--- mouse
+++ moose
    cat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.