Git Tutorial - Merge

  1. Schneller Vorlauf git merge
  2. Rekursives git merge
  3. Konflikte auflösen

Wir werden in diesem Tutorial lernen, wie man Zweige zusammenführt und auch Konflikte behandeln, wenn es sie gibt.

Im letzten Tutorial haben wir einen neuen Zweig erstellt, um an einigen neuen Funktionen zu arbeiten, die wir nicht den master-Zweig durcheinander bringen wollen.

Nachdem wir diese neuen Zweige erstellt haben und mit den neuen Funktionen zufrieden sind, müssen wir sie wieder in den master-Zweig einführen. So dass, wenn wir den nächsten Release-Code veröffentlichen, die neue Funktion ebenfalls enthalten ist.

Schneller Vorlauf git merge

Sagen wir, wir sind glücklich mit den Änderungen im new_test_branch Zweig und wir werden ihn wieder mit dem master zusammenführen.

  • Check out master Branch
    $ git checkout master
    
  • Den Zweig mit dem master verschmelzen
    $ git merge new_test_branch
    Updating 5fef94e..e7a7e81
    	Fast-forward
    	test3.txt | 3 ++-
    	1 file changed, 2 insertions(+), 1 deletion(-)
    

Wir haben das Feature aus dem Zweig new_test_branch genommen und in diesen master Zweig eingegliedert.

Der Fast-forward, der in der Nachricht nach dem Einmischen angezeigt wird, bedeutet, dass git einen Schnellvorlauf bis zu den Code-Änderungen durchführt, die wir im Zweig gemacht haben, weil wir in der Zeit zwischen dem Verzweigen und dem Zurückmischen in den Master-Zweig eigentlich keine Änderungen im master-Zweig gemacht haben.

Rekursives git merge

Bevor wir diesen unterschiedlichen git merge demonstrieren, müssen wir zwei Zweige test_branch_A und test_branch_B erstellen und verschiedene Änderungen an ihnen vornehmen. Dann werden wir den test_branch_A zurück zum master Zweig verschmelzen.

Jetzt werden wir den test_branch_B mit dem master zusammenführen.

$ git merge test_branch_B
Merge made by the 'recursive' strategy.
 test1_rename.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Der Unterschied zwischen diesem Merge und dem Fast-Forward Merge ist, dass der Merge durch die rekursive Strategie gemacht wird, weil dieser Zweigcode nicht die Funktion test_branch_A in sich hat. Mit anderen Worten, der master-Zweig hat sich geändert, nachdem der Zweig test_branch_B erzeugt wurde.

Nun ist master mit diesen beiden Features auf dem neuesten Stand, und es spielt keine Rolle, dass wir an ihnen zur gleichen Zeit gearbeitet haben, verschiedene Leute, die sie mit beiden machen, führen sie einfach wieder zusammen und alles ist in Ordnung.

Konflikte auflösen

Was wir in zwei Testzweigen modifiziert haben, hat keinen Konflikt, aber was ist, wenn es Konflikte gibt, wenn Sie einige Zweige mit dem master zusammenführen?

Lassen Sie uns zwei Zweige test_branch_C und test_branch_D erstellen, dann fügen wir den Text Der Buchstabe sollte C an die Datei test3.txt im Zweig test_branch_C und den Text The letter should be D an die Datei test3.txt im Zweig test_branch_D anhängen.

Dann fügen wir den test_branch_C wieder in den master Zweig ein.

Nun werden wir test_branch_D in den master einmischen,

$ git merge test_branch_D
Auto-merging test3.txt
CONFLICT (content): Merge conflict in test3.txt
Automatic merge failed; fix conflicts and then commit the result.

Sie konnten hier sehen, dass es nicht erfolgreich zusammengeführt werden konnte, weil es den Konflikt in der Datei test3.txt erkennt. Wir müssen den Konflikt manuell auflösen, indem wir die konfligierende Datei bearbeiten.

Die Datei test3.txt zeigt den Konflikt als

<<<<<<< HEAD
The letter should be C
=======
The letter should be D
>>>>>>> test_branch_D

Der Text zwischen HEAD und ========== ist der Text im master Zweig, der aus dem zusammengelegten Zweig test_branch_C stammt, der sich von dem Text im zu verbindenden Zweig test_branch_D unterscheidet.

Sie müssen wählen, welcher Text im master behalten werden soll, und alle Symbole wie <<<<<< und >>>>> löschen.

Sagen wir, der angehängte Text soll The letter should be D sein. Wir aktualisieren den Konfliktbereich auf The letter should be D sein.

Nachdem wir den Konflikt gelöst haben, können wir den gelösten Konflikt mit git commit übergeben.