git merge

Branches & Merges

Zwei oder mehr Entwicklungsverläufe zusammenführen


Der Befehl 'git merge' übernimmt die Änderungen der genannten Commits (seit ihre Historie vom aktuellen Branch abgezweigt ist) in den aktuellen Branch. Git macht wenn möglich einen „Fast-Forward“-Merge (wenn der aktuelle Branch ein Vorfahre des gemergten Branches ist) oder erzeugt einen „Merge-Commit“, wenn die Historien auseinandergelaufen sind. Gibt es Konflikte zwischen den Branches, hält Git an und bittet dich, sie zu lösen, bevor der Merge abgeschlossen wird.

Syntax

git merge [--no-ff | --ff-only] [--squash] [--no-commit] [-m <msg>] [--allow-unrelated-histories] [<commit>...]
git merge (--continue | --abort | --quit)
[ ] optional| oder<arg> Platzhalter... wiederholbar--flag Option

Optionen

Klicke auf eine Option, um sie aufzuklappen

Einsteiger (5)

Einen Merge-Commit erzeugen, auch wenn der Merge als Fast-Forward möglich wäre. Bewahrt die Branch-Historie und zeigt klar, wo die Feature-Arbeit begann und endete.

Bei BedarfErzeugt immer einen Merge-Commit – eine Teamkonvention

Beispiel

git merge --no-ff feature

Den Merge verweigern, außer der aktuelle HEAD ist schon aktuell oder der Merge lässt sich als Fast-Forward lösen. Verhindert versehentliche Merge-Commits.

EmpfohlenErzeugt nie überraschende Merge-Commits; scheitert, wenn die Historien auseinandergelaufen sind

Beispiel

git merge --ff-only feature

Die laufende Konfliktlösung abbrechen und das Repository in den Zustand vor dem Merge zurückversetzen. Nutze das, um einen Merge mit Konflikten abzubrechen.

EmpfohlenSteigt sicher aus einem Merge mit Konflikt aus und kehrt zum Zustand davor zurück

Beispiel

git merge --abort

Nach dem Lösen der Konflikte den Merge abschließen. Entspricht git commit nach der Konfliktlösung.

EmpfohlenSchließt den Merge ab, nachdem die Konflikte gelöst und gestagt sind

Beispiel

git merge --continue

Eine eigene Nachricht für den Merge-Commit setzen. Das erzwingt keinen Merge-Commit: Bei einem Fast-Forward wird die Nachricht ignoriert (mit --no-ff kombinieren, um immer einen zu bekommen).

Bei BedarfEigene Merge-Commit-Nachricht; bei einem Fast-Forward ignoriert

Beispiel

git merge -m "Integrate login feature" feature

Fortgeschritten (2)

Alle Commits des gemergten Branches zu einem einzigen Satz gestagter Änderungen zusammenfassen. Erzeugt keinen Commit und vermerkt keinen Merge (kein MERGE_HEAD) – du committest von Hand, und das Ergebnis ist ein normaler Commit mit einem Elternteil.

Bei BedarfEin sauberer Commit, aber kein echter Merge; der Branch braucht danach -D

Beispiel

git merge --squash feature

Den Merge durchführen, aber vor dem Commit anhalten. So kannst du das Ergebnis vor dem Commit prüfen und ändern. Ein Fast-Forward passiert trotzdem; mit --no-ff ist der Halt garantiert.

Bei BedarfErgebnis vor dem Commit prüfen; mit --no-ff kombinieren

Beispiel

git merge --no-commit feature

Erfahren (1)

Das Mergen von Historien ohne gemeinsamen Vorfahren erlauben. Nützlich, um zwei getrennte Repositories oder Projekte zusammenzuführen.

Bei BedarfNur, um getrennte Projekte absichtlich zu verbinden

Beispiel

git merge --allow-unrelated-histories other-project/main

Die richtige Option wählen

Merge-Strategien

Wie du steuerst, welche Art Merge Git durchführt

BefehlErzeugt Merge-CommitBewahrt HistorieAm besten für
git merge (default)Wenn auseinandergelaufenJaNormale Feature-Integration
git merge --no-ffImmerJaFeature-Merges dokumentieren
git merge --ff-onlyNieNur linearSaubere Historie erzwingen
git merge --squashNein (normaler Commit)Nein (flachgedrückt)Sauberer main-Branch

Konflikte behandeln

Was tun, wenn ein Merge Konflikte hat

BefehlAktionBehält ArbeitWann verwenden
(resolve manually)Dateien bearbeiten, git addJaTeile von beiden Seiten nötig
--continueMerge abschließenJaNach dem Lösen der Konflikte
--abortMerge abbrechenZustand vor dem MergeJetzt nicht bereit zum Lösen
checkout --ours/--theirsEine Seite wählenEine VersionEine Seite ist eindeutig richtig

merge oder rebase

Zwei Wege, Änderungen zu integrieren – mit unterschiedlichen Vor- und Nachteilen

BefehlHistorieKonfliktlösungAm besten für
git mergeBewahrt alle CommitsEinmalGeteilte Branches, PRs
git rebaseSchreibt linear umPro CommitLokales Aufräumen, private Branches
git merge --squashEin einziger CommitEinmalFeature mit unordentlicher Historie

Den Commit steuern

Optionen zum Anpassen des Merge-Commits

BefehlCommittet automatischAnwendungsfall
git merge featureJa (ohne Konflikte)Normaler Merge
git merge --no-commitNein (gestagt)Vor dem Commit prüfen
git merge -m "msg"Ja (bei Fast-Forward ignoriert)Aussagekräftige Merge-Commits
git merge --squashNein (Commit nötig)Alle Commits zu einem zusammenfassen

Workflow-Beispiele

1
git checkout main

Auf den Branch main wechseln

2
git pull origin main

Die neuesten Änderungen vom Remote holen

3
git merge --no-ff feature-branch

Das Feature mit einem Merge-Commit für die Historie mergen

4
git push origin main

Die gemergten Änderungen zum Remote pushen

5
git branch -d feature-branch

Den gemergten Feature-Branch löschen

1
git merge feature

Den Merge versuchen (es gibt Konflikte)

2
git status

Sehen, welche Dateien Konflikte haben

3
(edit conflicted files)

Nach <<<<<<<-Markern suchen und von Hand lösen

4
git add <resolved-files>

Die gelösten Dateien stagen

5
git merge --continue

Den Merge mit einem Commit abschließen

1
git checkout main

Auf den Branch main wechseln

2
git merge --squash feature-branch

Alle Commits zu gestagten Änderungen zusammenfassen

3
git commit -m "Add feature X"

Einen sauberen Commit mit allen Änderungen erzeugen

4
git branch -D feature-branch

Den Feature-Branch erzwungen löschen

1
git merge feature

Den Merge starten (es treten Probleme auf)

2
git status

Den Konfliktzustand ansehen

3
git merge --abort

Abbrechen und den Zustand vor dem Merge wiederherstellen

4
git status

Prüfen, dass du wieder in einem sauberen Zustand bist

Fehlerbehebung

CONFLICT (content): Merge conflict in file.js

Ursache: Beide Branches haben dieselben Zeilen der Datei geändert

Öffne die Datei, suche die <<<<<<<-Marker, löse den Konflikt, dann git add und git merge --continue

fatal: refusing to merge unrelated histories

Ursache: Die Branches haben keinen gemeinsamen Vorfahren (getrennte Repositories)

Nutze git merge --allow-unrelated-histories, wenn du absichtlich getrennte Projekte zusammenführen willst

Already up to date

Ursache: Der Branch, den du mergst, ist schon in deinem aktuellen Branch enthalten

Nichts zu tun – dein Branch enthält schon alle Commits des Ziels

error: Your local changes to the following files would be overwritten by merge

Ursache: Du hast nicht committete Änderungen, die mit dem Merge kollidieren

Committe deine Änderungen, stashe sie (git stash) oder verwirf sie vor dem Mergen

Merge ist passiert, aber ich wollte vorher prüfen

Ursache: Git hat den Merge automatisch committet

Nutze nächstes Mal --no-ff --no-commit. Zum Wiederholen: git reset --merge ORIG_HEAD, dann erneut mit --no-commit mergen

Tipps & Stolperfallen

Best Practices

  • ✓Pulle vor dem Mergen immer die neuesten Änderungen, um Konflikte gering zu halten
  • ✓Nutze --no-ff für Feature-Branches, damit der Merge-Kontext in der Historie erhalten bleibt
  • ✓Schreibe aussagekräftige Merge-Nachrichten, die erklären, was integriert wurde
  • ✓Lösche Feature-Branches nach dem Merge, damit das Repository aufgeräumt bleibt
  • ✓Teste deinen Code nach dem Merge und vor dem Push, um sicherzugehen, dass nichts kaputt ist
  • ✓Nutze git merge --abort, wenn du noch nicht bereit bist, Konflikte zu lösen – lass keinen halbfertigen Merge liegen
  • ✓Merge bei langlebigen Branches regelmäßig main in deinen Feature-Branch, um Konflikte beim finalen Merge zu verringern

Häufige Fehler

  • ✗Mergen, ohne vorher die neuesten Änderungen vom Remote zu pullen. Führe vor dem Mergen immer 'git pull' aus, um Konflikte zu vermeiden.
  • ✗Dateien stagen, die noch Konfliktmarker enthalten. Git blockiert Commits, solange Pfade ungemergt sind – aber sobald du eine Datei mit 'git add' stagst, committet es die <<<<<<<-Marker unverändert.
  • ✗Fast-Forward-Merges für Feature-Branches lassen die Branch-Historie verschwinden. Nutze '--no-ff', um den Kontext zu erhalten.
  • ✗'git merge --abort' nach dem manuellen Lösen von Konflikten verwirft die ganze Lösungsarbeit.
  • ✗In den falschen Branch mergen. Prüfe vor dem Mergen immer mit 'git branch', dass du auf dem richtigen Ziel-Branch bist.

FAQ

A:

Merge bewahrt die Historie und erzeugt einen Merge-Commit. Rebase schreibt die Historie linear um. Nutze merge für geteilte Branches, rebase zum lokalen Aufräumen.

A:

Nutze --no-ff, wenn du Feature-Branches in main mergst. Es erzeugt einen Merge-Commit, der festhält, wann das Feature integriert wurde – auch wenn ein Fast-Forward möglich gewesen wäre.

A:

Wenn nicht gepusht: git reset --hard ORIG_HEAD (funktioniert auch bei Fast-Forwards; verwirft nicht committete Änderungen). Wenn gepusht: git revert -m 1 <merge-commit>, um einen neuen Commit zu erzeugen, der den Merge rückgängig macht.

A:

Ein Fast-Forward passiert, wenn dein Branch seit dem Abzweigpunkt keine neuen Commits hat. Git schiebt einfach den Zeiger vor, statt einen Merge-Commit zu erzeugen.

A:

Öffne die Konfliktdateien, suche die <<<<<<<-Marker, behalte den gewünschten Code, entferne die Marker, dann git add auf die Dateien und git merge --continue.

A:

Ein normaler Merge bewahrt die ganze Commit-Historie. Ein Squash-Merge fasst alles zu einem Commit zusammen. Nutze Squash, wenn der Feature-Branch unordentliche WIP-Commits hat, die du nicht in main willst.