Zum Inhalt springen

git merge

Definition

Der Befehl git merge integriert unabhängige Entwicklungslinien in einen einzigen Branch. Er arbeitet zusammen mit git checkout, um den aktuellen Branch auszuwählen, und mit git branch zusammen mit dem Flag -d, um veraltete Branches zu löschen. Lesen Sie in unseren vorherigen Kapiteln mehr über diese Befehle.

Wie es funktioniert

Die Hauptverwendung von git merge besteht darin, zwei Branches zusammenzuführen. Es wird auch verwendet, um mehrere Commits von einem Branch in einen anderen zu integrieren. In der folgenden Abbildung nimmt git merge zwei Branch-Spitzen und findet einen gemeinsamen Vorfahren-Commit zwischen ihnen. Der gemeinsame Basis-Commit wird verwendet, um einen neuen Merge-Commit zu erstellen, der die Änderungen beider Branches kombiniert. Hier haben wir zwei Branches: master und stage. Wir sollten den stage-Branch in den master-Branch zusammenführen.

gitmerge

Merge-Commits sind einzigartig, weil sie zwei Eltern-Commits haben. Git kombiniert automatisch getrennte Historien beim Erstellen eines neuen Merge-Commits. Wenn jedoch beide Branches dieselben Zeilen ändern, kann Git sie nicht automatisch zusammenführen, was zu einem Merge-Konflikt führt.

gitmerge1

Merging-Prozess

Bevor Sie mit dem Merging-Prozess beginnen, befolgen Sie diese Schritte:

  • Stellen Sie sicher, dass Sie sich auf dem richtigen Branch befinden, der die Zusammenführung empfängt. Führen Sie git checkout <receiving branch> aus, um zu ihm zu wechseln.
  • Aktualisieren Sie den Ziel-Branch mit den neuesten Remote-Änderungen. Führen Sie git pull aus, um die neuesten Remote-Commits abzurufen und zu integrieren.
  • Der letzte Schritt ist das Ausführen von git merge <branch name>, wodurch der Branch angegeben wird, der in den empfangenden Branch zusammengeführt werden soll.

Fast-Forward-Merge

Ein Fast-Forward-Merge tritt auf, wenn der Pfad vom aktuellen Branch zum Ziel-Branch linear ist. Der Fast-Forward-Merge kombiniert die Historien, da alle Commits, die vom Ziel-Branch aus erreichbar sind, auch über den aktuellen Branch verfügbar sind. Hier ist ein Beispiel für einen Fast-Forward-Merge:

gitmerge2

Wenn die beiden Historien auseinanderlaufen, verwendet Git alternativ den 3-Wege-Merge. Der 3-Wege-Merge verwendet einen speziellen Commit, um zwei Historien zusammenzuführen.

gitmerge3

Fast-Forward-Merges werden typischerweise für kleine Features oder Bugfixes verwendet, während 3-Wege-Merges zur Integration langfristiger Features eingesetzt werden. Die folgenden Beispiele verwenden einen Fast-Forward-Merge:

git merge

bash
# Start the stage
git checkout -b stage master
# Edit some files
git add <file>
git commit -m "Start with the stage"
# Edit some files
git add <file>
git commit -m "Finish with the stage"
# Merge in the stage branch
git checkout master
git merge stage
git branch -d stage

Wir führen git branch -d aus, um den stage-Branch zu löschen, da stage nun vom master-Branch aus erreichbar ist.

Der Befehl git merge mit der Option --no-ff wird ausgeführt, wenn Sie während eines Fast-Forward-Merges einen Merge-Commit benötigen, um den angegebenen Branch in den aktuellen Branch zusammenzuführen, wobei immer ein Merge-Commit erzeugt wird (auch im Fall eines Fast-Forward-Merges):

git merge --no-ff

bash
git merge --no-ff <branch>

3-Wege-Merge

Dieses Szenario erfordert einen 3-Wege-Merge, wenn der master-Branch weiterentwickelt wird, während der stage-Branch noch in Entwicklung ist. Dies wird verwendet, wenn Teammitglieder gleichzeitig an einem großen Feature arbeiten:

the git merge command

bash
# Start the stage
git checkout -b stage master
# Edit some files
git add <file>
git commit -m "Start with the stage"
# Edit some files
git add <file>
git commit -m "Finish with the stage"
# Develop the master branch
git checkout master
# Edit some files
git add <file>
git commit -m "Make some super-stable changes to master"
# Merge in the stage branch
git merge stage
git branch -d stage

Im obigen Beispiel wäre stage ein größeres Feature, dessen Entwicklung viel Zeit in Anspruch nimmt, weshalb wir einen 3-Wege-Merge verwenden. Wenn Ihr Feature klein ist, sollten Sie besser einen Fast-Forward-Merge verwenden, um unnötige Commits zu vermeiden, die die Projekt-Historie überladen.

Konflikt auflösen

Wenn zwei Branches zusammengeführt werden und derselbe Teil derselben Datei geändert wurde, treten Merge-Konflikte auf, weil Git nicht bestimmen kann, welche Version verwendet werden soll. Wenn das passiert, stoppt Git, bevor der Merge-Commit erstellt wird, damit Sie den Konflikt auflösen können. Der Git-Merging-Prozess verwendet einen Editieren/Stagen/Committen-Workflow zur Auflösung von Merge-Konflikten. Wenn ein Konflikt auftritt, zeigt git status die Dateien an, die aufgelöst werden müssen. Das folgende Bild wird angezeigt, wenn dieselben Teile der Datei example.txt geändert wurden:

git status

bash
On branch master
Unmerged paths:
(use "git add/rm ..." as appropriate to mark resolution)
both modified: example.txt

Wenn Sie den Merge nicht fortsetzen möchten, können Sie ihn jederzeit mit git merge --abort abbrechen.

Wie Konflikte dargestellt werden

Im Falle von Konflikten bearbeitet Git den Inhalt der betroffenen Dateien mit visuellen Markierungen auf beiden Seiten des konfliktbehafteten Inhalts. Merge-Konflikte treten nur im Fall eines 3-Wege-Merges auf.

Die primären Marker sind <<<<<<<, ======= und >>>>>>>. Sie helfen Ihnen, die konfliktbehafteten Abschnitte in Ihren Dateien zu finden.

git conflicts

bash
here is some content not affected by the conflict
<<<<<<< master
this is conflicted text from master
=======
this is conflicted text from stage branch
>>>>>>> stage

Nachdem Sie die Konflikte aufgelöst haben, führen Sie git add <file> auf der konfliktbehafteten Datei aus, um sie als gelöst zu markieren. Führen Sie anschließend git commit aus, um den Merge-Commit zu erstellen.

Practice

What are the key features and processes involved in the 'git merge' command?

Finden Sie das nützlich?

Dual-run-Vorschau — vergleichen Sie mit den Symfony-Routen live.