Kurs
Wenn du schon einmal an einem Projekt mit mehreren Entwicklern gearbeitet hast (oder sogar selbst mehrere Funktionen verwaltet hast), weißt du, dass Verzweigungen wichtig sind, um die Dinge zu organisieren. Aber irgendwann müssen all diese Zweige wieder zusammenkommen - und da kommt git merge
ins Spiel.
In diesem Tutorial gehe ich auf die verschiedenen Arten von Git-Zusammenführungen ein, wie sie funktionieren und wie man Zusammenführungskonflikte auflöst, wenn etwas nicht so läuft wie geplant. Zum Schluss verrate ich dir einige Best Practices, die dir helfen, git merge
effektiv zu nutzen und häufige Fallstricke zu vermeiden.
Was ist Git Merge?
In einem Team arbeiten Entwickler oft an verschiedenen Funktionen, Fehlerbehebungen und Verbesserungen in separaten Zweigen. Sobald ihre Arbeit abgeschlossen ist, nutzen sie git merge
, um die Änderungen zu integrieren.
Beim Zusammenführen werden Änderungen aus einem Zweig in einem anderen Zweig zusammengefasst, wobei die gesamte Versionsgeschichte erhalten bleibt. Sie vereinheitlicht die Commit-Historie beider Zweige.
Lass uns den Arbeitsablauf anhand eines Beispiels verstehen.
Ein gemeinsamer Basis-Commit spaltet sich in zwei Zweige auf, die zu separaten Haupt- und Feature-Tipps führen, bevor sie zusammengeführt werden. Bild vom Autor.
In der obigen Abbildung haben der Feature- und der Main-Zweig neue Commits erstellt, seit der Feature-Zweig erstellt wurde.
Ein Funktionszweig und der Hauptzweig weichen von einer gemeinsamen Basis ab und werden später zu einem einzigen Merge Commit zusammengefasst. Bild vom Autor.
Git merge nimmt alle neuen Commits aus beiden Zweigen, ausgehend von ihrer gemeinsamen Basis, und kombiniert sie zu einem einzigen Merge-Commit. Dann wird der Kopfzeiger aktualisiert, damit er auf diese neue Zusammenführung verweist.
Grundlegende Verwendung des Befehls git merge
Beim Merging geht es nicht nur darum, git merge auszuführen und Feierabend zu machen - es gibt ein paar wichtige Schritte, um alles in Ordnung zu bringen. In diesem Abschnitt gehen wir den gesamten Prozess durch, von der Vorbereitung deiner Zweige bis zur erfolgreichen Zusammenführung.
Schritt 1: Vorbereitung auf einen Zusammenschluss
Nur übertragene Änderungen in beiden Zweigen können zusammengeführt werden. Verwende also den Befehl git status
, um nach unübertragenen Änderungen zu suchen und diese mit dem Befehl git commit
vor dem Zusammenführen zu übertragen.
Schritt 2: Checke den Zielzweig aus
Bevor du git merge
ausführst, solltest du zum Zielzweig wechseln, in der Regel zum Hauptzweig. Wechsle mit git checkout main
oder git switch main
zum Hauptzweig.
Schritt 3: Zusammenführen eines Zweigs
Stelle sicher, dass der Hauptzweig mit dem Remote-Repository auf dem neuesten Stand ist. Führe dazu git pull origin main
aus.
Jetzt bist du endlich bereit, den Funktionszweig mit dem Hauptzweig zusammenzuführen! Du kannst einen Befehl wie den folgenden verwenden:
git merge feature-branch
Schritt 4: Auflösen von Konflikten beim Zusammenführen (falls vorhanden)
Git versucht, Konflikte, die beim Zusammenführen auftreten können, automatisch zu lösen. Allerdings kann ein manuelles Eingreifen erforderlich sein, wenn das System den Konflikt nicht selbst lösen kann.
Wenn zum Beispiel dieselben Zeilen in derselben Datei in verschiedenen Zweigen geändert werden, kann es zu Konflikten beim Zusammenführen kommen.
Wenn Git einen Konflikt entdeckt, hält es die Zusammenführung an und fordert dich auf, ihn zu lösen. In diesem Fall:
- Führe
git status
aus, um zu sehen, welche Dateien Konflikte haben. - Öffne diese Dateien.
- Überprüfe die widersprüchlichen Codezeilen und aktualisiere sie, um die Konsistenz in beiden Zweigen sicherzustellen.
Schritt 5: Bestätigen der Zusammenführung
Nachdem du die Konflikte gelöst hast, verwende den Befehl git add .
, um die korrigierten Dateien bereitzustellen. Schließe dann die Zusammenführung ab, indem du eine Nachricht übermittelst:
git merge -m “resolved conflicts”
In den folgenden Abschnitten werden wir uns genauer ansehen, wie man Zusammenführungskonflikte auflöst.
Für Anfängergibt es hier einen kompletten Git-Spickzettel mit allen wichtigen Befehlen zum Erstellen, Aktualisieren, Löschen und Verwalten von Zweigen.
Wenn du bereits etwas Erfahrung mit Git hast und eine Auffrischung der wichtigsten Befehle brauchst, schau dir dieses Tutorial zu den am häufigsten verwendeten Git-Befehlen mit Beispielen an.
Lerne heute die Git-Grundlagen
Arten von Zusammenführungen in Git
Das Verständnis der Git-Zusammenführungsarten hilft dir, die richtige Strategie für dein Szenario zu wählen. Hier sind die drei gängigen Ansätze für die Zusammenführung.
Schnelles Zusammenführen
Wenn der Basiszweig keine neuen Commits hat, seit der Feature-Zweig erstellt wurde, verwendet Git eine Schnellvorlaufmethode.
Wenn dein neuer Funktionszweig aktualisiert wird, während der Hauptzweig unverändert bleibt, verschiebt der Merge Commit den Kopfzeiger des Hauptzweigs auf den Funktionszweig.
Es wird kein zusätzlicher Merge-Commit erstellt, so dass der Commit-Verlauf sauber und linear bleibt.
Dreifacher Zusammenschluss
Wenn sowohl der Basis- als auch der Feature-Zweig neue Commits haben, findet Git ihren gemeinsamen Vorgänger und erstellt einen neuen Merge-Commit. Dieser Commit kombiniert die Historie beider Zweige, wobei die individuelle Historie des Feature-Zweigs und des Hauptzweigs erhalten bleibt.
Im folgenden Beispiel sind "E" und "G" neue Commits für den Hauptzweig, nachdem der Feature-Zweig erstellt wurde.
C---D---F (feature-branch)
/
A---B---E---G (main)
Es wird ein neuer Merge Commit "M" erstellt, der die Geschichte des Haupt- und des Funktionszweigs beibehält.
C---D---F
/ \
A---B---E---G---M (main)
Squash fusionieren
Squash merge cofasst alle Änderungen eines Feature-Branches in einem einzigen Commit zusammen und fügt ihn in den Zielzweig ein. Die individuelle Commit-Historie des Feature-Branches bleibt nicht erhalten.
git merge --squash feature_branch_name
Ein Squash Merge ist besonders hilfreich, um Unordnung durch mehrere kleine Commits zu vermeiden und trotzdem den endgültigen Zustand des Features im Zielzweig zu erhalten.
Mehrere Zweige zusammenführen
Wenn du an großen Projekten arbeitest, musst du vielleicht mehrere Zweige zusammenführen - entweder einen nach dem anderen oder alle auf einmal. Welchen Ansatz du wählst, hängt von deinem Arbeitsablauf und der Komplexität der Änderungen ab. In diesem Abschnitt gehe ich auf beide Methoden ein und zeige dir, wann du sie effektiv einsetzen kannst.
Mehr als einen Zweig nacheinander zusammenführen
Wenn du Zweige einzeln zusammenführen möchtest, verwende den Befehl "Zusammenführen" nacheinander für jeden Feature-Zweig.
Schritt 1: Wechsle zu dem Zielzweig, in dem du die Änderungen zusammenführen willst.
git checkout target_branch_name
Schritt 2: Führe den ersten Feature-Zweig zusammen, wie unten gezeigt.
git merge feature_branch_1
Schritt 3: Führe den zweiten Funktionszweig wie gezeigt zusammen.
git merge feature_branch_2
Wiederhole diesen Vorgang, bis alle anderen Zweige zusammengeführt sind.
Mehr als einen Zweig parallel zusammenführen
Befolge diese Schritte, um mehrere Feature-Zweige auf einmal zusammenzuführen.
Schritt 1: Wechsle zu dem Zielzweig, in dem du die Änderungen zusammenführen willst.
git checkout target_branch_name
Schritt 2: Führe den folgenden Befehl mit mehreren Feature-Zweigen aus
git merge feature_branch_1 feature_branch_2 feature_branch_3
Wenn Git mehrere Zweige parallel zusammenführt, kann es zu Konflikten kommen. Wenn das passiert, fordert Git dich auf, sie manuell zu lösen.
Umgang mit Konflikten bei mehreren Zusammenführungen
Das Zusammenführen mehrerer Zweige ist nicht immer einfach - vor allem, wenn ein Zweig von einem anderen abhängt.
Wenn du zum Beispiel feature_x
in main
vor feature_y
zusammenführst, kann das zu Konflikten führen. Wenn verschiedene Zweige dieselben Dateien ändern, können parallele Zusammenführungen zu Konflikten führen, die sorgfältig gelöst werden müssen.
Befolge diese Schritte, um Zusammenführungskonflikte zu lösen:
- Schritt 1: Führe
git status
aus, um zu sehen, welche Dateien Konflikte verursachen. - Schritt 2: Öffne die widersprüchlichen Dateien und korrigiere sie.
- Schritt 3: Füge die Änderungen zur Bühne hinzu und bestätige sie.
Die Historie von Merge Commits verstehen
Bei komplexen Konflikten brauchst du vielleicht mehr Informationen als das, was git status
bietet. In solchen Fällen kannst du Befehle wie git log
oder git show
verwenden, um tief in die Geschichte einzutauchen.
git log
: zeigt die gesamte Commit-Historie an, einschließlich der Merge-Commits. So kannst du einen bestimmten Zusammenschluss identifizieren, bei dem das Problem auftritt.git show
: Wenn du mit dem obigen Befehl einen verdächtigen Merge Commit findest, kannst du ihn mitgit show
untersuchen. Dieser Befehl bietet eine detaillierte Ansicht der Übergabe und zeigt, was während der Zusammenführung geändert wurde. Sie gibt auch eine eindeutige Kennung für den übergeordneten Zweig aus, bevor eine bestimmte Zusammenführung stattfindet.git diff
: Du kannst die eindeutigen Bezeichner der übergeordneten und zusammengeführten Zweige aus den vorherigen Befehlen nehmen undgit diff
verwenden, um die Änderungen zwischen diesen beiden Zuständen zu vergleichen.
Git Merging Best Practices
Das Zusammenführen kann manchmal chaotisch sein, vor allem, wenn mehrere Entwickler an der gleichen Codebasis arbeiten.
Wir haben zwar besprochen, wie man Konflikte löst, wenn sie entstehen, aber der beste Ansatz ist, sie zu verhindern, bevor sie entstehen. In diesem Abschnitt gehen wir auf praktische Tipps ein, damit deine Zusammenführungen reibungslos funktionieren und dein Git-Verlauf sauber bleibt.
Halte die Zweige klein und konzentriert
Große Zweige erhöhen das Risiko von sich überschneidenden Bearbeitungen, was zu mehr Konflikten führt. Um dies zu minimieren, solltest du an einem einzigen Feature pro Zweig arbeiten und die Zweige klein und konzentriert halten.
Häufiges Ziehen und Zusammenführen
Ziehe die neuesten Änderungen aus dem Remote-Repository , um deinen Basiszweig vor dem Zusammenführen zu aktualisieren. Ziehe regelmäßig Aktualisierungen aus dem Hauptzweig in deinen Feature-Zweig, um sie synchron zu halten. Diese verhindern später große und komplexe Konflikte.
Verwende die in Git integrierten Zusammenführungswerkzeuge
Anstatt Dateien manuell zu bearbeiten, kannst du die in Git integrierten Werkzeuge verwenden, um Konflikte in einer visuellen Benutzeroberfläche zu lösen. Wenn du git mergetool
aufrufst, stehen dir drei Möglichkeiten zur Verfügung:
- LOCAL - Version des Hauptzweigs. Wenn du diese Option wählst, wird der Inhalt der konfliktbehafteten Datei aus dem Hauptzweig beibehalten und die Änderungen aus dem Feature-Zweig werden ignoriert.
- REMOTE - Die Version des Funktionszweigs. Wenn du dies auswählst, wird der Inhalt des Feature-Zweiges auf die konfliktbehaftete Datei angewendet.
- BASE - Damit werden die Änderungen der beiden Zweige, die miteinander in Konflikt stehen, kombiniert und zusammengeführt.
Der Reihe nach zusammenführen
Wenn du mehrere Zweige zusammenführst, ist die Reihenfolge wichtig - vor allem, wenn ein Merkmal von einem anderen abhängt. Wenn feature_x
auf feature_y
aufbaut, kann es zu Konflikten kommen, wenn du feature_x
zuerst zusammenführst. Um dies zu vermeiden, führe Zweige immer in der Reihenfolge ihrer Abhängigkeiten zusammen, damit der Prozess reibungslos verläuft und Konflikte minimiert werden.
Squash fusionieren
Wie bereits erwähnt, werden beim Squash Merging alle Commits eines Feature-Branches zu einem einzigen Commit zusammengefasst, um die Commit-Historie sauber zu halten und potenzielle Merge-Konflikte zu reduzieren.
Ein alternativer Ansatz ist das Rebasing, bei dem die Änderungen des Funktionszweigs direkt auf den Basiszweig angewendet werden. So entsteht ein linearer Verlauf und es werden unnötige Merge Commits vermieden. Beide Methoden schreiben jedoch die Geschichte um und bewahren keine einzelnen Commits aus dem Feature-Branch.
Fazit
In diesem Git-Tutorial zum Zusammenführen haben wir alles von den Grundlagen des Zusammenführens bis hin zu den besten Methoden zur Vermeidung von Konflikten behandelt. Wenn du weißt, wie du git merge
effektiv nutzen kannst, können Teams nahtlos zusammenarbeiten, Arbeitsabläufe reibungslos gestalten und den Codeverlauf sauber halten.
Wenn du deine Git-Kenntnisse vertiefen möchtest, schau dirdiesen Git-Kurs für Fortgeschrittene an, umfortgeschrittene Arbeitsabläufe und Techniken zu beherrschen!
Lerne heute die Git-Grundlagen
FAQs
Was ist der Unterschied zwischen "git merge" und "git rebase"?
Während beide Befehle Änderungen von einem Zweig in einen anderen integrieren, erstellt git merge
einen neuen Merge Commit, der die Historie beider Zweige beibehält. Im Gegensatz dazu wendet git rebase
Commits aus dem Feature-Branch direkt auf den Target-Branch an, was zu einer linearen Commit-Historie führt, aber die Geschichte dabei umschreibt.
Kann ich eine Zusammenführung in Git rückgängig machen?
Ja, wenn du den Zusammenschluss noch nicht gepusht hast, kannst du ihn verwenden:
git reset --hard HEAD~1
Dadurch wird dein Zweig auf den Stand vor der Zusammenführung zurückgesetzt. Wenn die Zusammenführung bereits gepusht wurde, musst du git revert
verwenden, um die Änderungen sicher rückgängig zu machen, während die Historie intakt bleibt.
Wie führe ich einen entfernten Zweig mit meinem lokalen Zweig zusammen?
Um einen entfernten Zweig mit deinem lokalen Zweig zusammenzuführen, befolge diese Schritte:
git fetch origin
git checkout my-branch
git merge origin/feature-branch
So stellst du sicher, dass du die neuesten Updates aus dem Remote-Repository zusammenführst.
Wie kann ich unnötige Konflikte beim Zusammenführen verhindern?
Um Konflikte zu minimieren:
- Ziehe regelmäßig die neuesten Änderungen, bevor du mit neuer Arbeit beginnst (
git pull
). - Führe in der Reihenfolge der Abhängigkeiten zusammen, wenn mehrere Zweige voneinander abhängen.
- Verwende Feature Flags, um den Code schrittweise zu integrieren, anstatt langlebige Zweige zu verwenden.
Was passiert, wenn ich einen Zweig zusammenführe, der bereits zusammengeführt wurde?
Wenn ein Zweig bereits zusammengeführt wurde, ändert ein erneuter Aufruf von git merge feature-branch
nichts mehr. Git erkennt, dass die Zweige eine gemeinsame Geschichte haben und bestätigt einfach, dass alles auf dem neuesten Stand ist.
Kann ich mehrere Zweige auf einmal zusammenführen?
Nein, Git unterstützt nicht das Zusammenführen mehrerer Zweige mit einem einzigen Befehl. Du musst sie der Reihe nach zusammenführen:
git merge feature-branch-1
git merge feature-branch-2
Bei Bedarf kannst du einen Integrationszweig erstellen, in dem du mehrere Zweige zusammenführst, und diesen dann in main
zusammenführen.
Soll ich git merge --no-ff oder git merge --ff verwenden?
--no-ff
(kein Fast-Forward-Merge) erstellt einen neuen Merge-Commit, so dass es einfacher ist, den Lernpfad zu verfolgen.--ff
(fast-forward merge) wendet die Änderungen wenn möglich direkt an und vermeidet zusätzliche Commits.
Für Projekte, bei denen das Verfolgen von Feature-Zweigen wichtig ist, wird --no-ff
empfohlen.
Srujana ist freiberufliche Tech-Autorin und hat einen vierjährigen Abschluss in Informatik. Das Schreiben über verschiedene Themen wie Data Science, Cloud Computing, Entwicklung, Programmierung, Sicherheit und viele andere ist für sie selbstverständlich. Sie liebt klassische Literatur und erkundet gerne neue Reiseziele.