2016-05-03 1 views
0

Ich this Lesen:Warum wird ein gemeinsamer Vorgänger in einem 3-fachen Merge-Commit benötigt?

In diesem Fall tut Git einen einfachen Drei-Wege-Merge, indem die beide Schnappschüsse von den Zweigspitzen und dem gemeinsamen Vorfahren der zwei spitz.

3-way

Drei in einem typischen merge verwendet Schnappschüsse. Abbildung 3-16. Drei Snapshots , die in einer typischen Zusammenführung verwendet werden Statt den Verzweigungszeiger vorwärts zu verschieben, erstellt Git einen neuen Snapshot, der aus dieser dreiseitigen -Zusammenführung resultiert, und erstellt automatisch eine neue Festschreibung, die darauf verweist. Diese wird als ein Zusammenführen-Commit bezeichnet und ist insofern speziell, als es mehr als ein Elternteil hat.

Die zwei Tipps machen Sinn ... aber warum brauchen Sie den gemeinsamen Vorfahren?

Antwort

2

Git muss wissen, was sich in jedem Zweig geändert hat, also sagen wir, dass master Datei A ändern und iss53 Datei B ändern. Ohne den gemeinsamen Vorfahren zu finden, würde Git nur wissen, dass beide Dateien A und B unterschiedlich sind Tipps, aber nicht welche Version von A und B zu wählen.

durch die Spitzen des gemeinsamen Vorfahren vergleicht, kann Git zuverlässig erkennen, dass A für iss53 nicht geändert hat, und verwendet daher master ‚s Version von A, und umgekehrt für B.

Natürlich Sache mehr bekommen kompliziert, wenn die gleiche Datei von beiden Zweigen geändert wird, aber dies sollte Dinge klären.

-1

Der Hauptgrund ist, weil Git nicht von Spitze zu Spitze verschmelzen. Stattdessen wird die Verzweigung schrittweise von Zweig zu Zweig zusammengeführt. Bedeutung: Es verbindet jedes Commit in jedem Zweig separat.

Im obigen Beispiel führt git C4 und C5 nicht direkt zusammen. Stattdessen führt es zuerst C3 und C4 zusammen und dann verbindet es C5 und C4. Um dies zu tun, muss es herausfinden, wo es mit dem Zusammenführen beginnen muss. Beginnt es bei C0? Beginnt es als C1? Der Prozess, herauszufinden, wo mit der Verschmelzung begonnen werden soll, besteht darin, den gemeinsamen Vorfahren zu finden.

Warum fusioniert git so?

Weil es sich als die Technik erwiesen hat, die mit der geringsten Anzahl von Merge-Konflikten * endet. Frühere Versionskontrollsysteme tun einfach einen Diff-Patch-Prozess, der dazu neigt, viele Zusammenführungskonflikte zu erzeugen.


* Anmerkung: In der Tat die genaue Algorithmus (Folge der Verschmelzung) git verwendet wird als Plugin implementiert, so dass Sie die Freiheit von mehreren Algorithmen zur Auswahl, um Konflikte zu reduzieren verschmelzen auf Ihren Workflow abhängig.

+0

Nein, es gibt keine Zusammenführung zwischen C3 und C4. Das wäre ziemlich sinnlos, und Sie können sich davon überzeugen, indem Sie einen Konflikt in C3 einführen und ihn in C4 entfernen. Die Zusammenführung zwischen C4 und C5 wird sauber zusammengeführt. –

+0

@ EdwardThomson: Aber C5 ALONE enthält nicht die Änderungen in C3. Es ist möglich, C5 alleine auszuwählen, ohne die Änderungen in C3 zu berücksichtigen. Wenn Sie C5 mit C4 verschmelzen, wird git zuerst C3 mit C4 verbinden. Ja, wenn Sie C4 mit C5 verbinden, müssen Sie es nicht zuerst auf C3 anwenden, aber das ist nicht das, was das Diagramm zeigt, oder? – slebetman

+0

Nr. C3 hat nichts mit dem Ergebnis zu tun. C5 wird mit C4 zusammengeführt, wobei C2 als Zusammenführungsbasis verwendet wird. C3 wird komplett ignoriert, das intermediäre Commit ist für 'git merge' einfach egal. –

Verwandte Themen