Von Gast (nicht überprüft) , 29 April 2026

Einführung

Ein Merge kombiniert zwei Entwicklungslinien. Der häufigste Fall ist das Zurückführen eines Feature-Branches in main. Diese Seite führt durch einen sauberen Merge, einen Fast-Forward und einen konfliktbehafteten Merge.

Vorbereitung

git switch -c feature/greeting
echo "hello world" > greeting.txt
git add greeting.txt
git commit -m "Add greeting"
git switch main
git merge feature/greeting

Wenn sich main seit der Branch-Erstellung nicht bewegt hat, führt Git ein Fast-Forward durch: Es bewegt einfach den Zeiger von main auf die Spitze von feature/greeting. Es wird kein Merge-Commit erstellt.

Echte Three-Way-Merges

Wenn beide Branches neue Commits haben, erstellt Git einen Merge-Commit mit zwei Eltern:

git switch main
echo "main change" >> notes.txt
git commit -am "Update notes on main"
git merge feature/greeting
# Merge made by the 'ort' strategy.

Der erste Elternteil des Merge-Commits ist das vorherige HEAD von main; der zweite Elternteil ist die Spitze des gemergten Branches.

Einen Merge-Commit erzwingen

Um die Historie sichtbar zu erhalten, auch wenn Fast-Forward möglich ist:

git merge --no-ff feature/greeting -m "Merge feature/greeting"

Konflikte

Wenn beide Seiten dieselben Zeilen bearbeitet haben, hält Git an und schreibt Konfliktmarker:

<<<<<<< HEAD
line from main
=======
line from feature
>>>>>>> feature/greeting

Lösen Sie auf, indem Sie die Datei bearbeiten, dann:

git add notes.txt
git status
git commit               # nutzt die vorbereitete Merge-Nachricht

Abbrechen

Wenn Sie es sich mitten im Merge anders überlegen:

git merge --abort

Dies stellt den Working Tree auf den Zustand vor dem Merge zurück.

Das Ergebnis prüfen

git log --oneline --graph --decorate -n 10

Der Graph zeigt die durch den Merge erzeugte Rautenform.

Einen Merge inspizieren

Merge-Commits haben zwei Eltern, daher benötigen Diffs explizite Behandlung. git show auf einem Merge zeigt standardmäßig einen "kombinierten Diff", der nur Änderungen hervorhebt, die mit beiden Eltern in Konflikt stehen:

git show HEAD                       # kombinierter Diff
git show -m HEAD                    # Diff gegen jeden Elternteil separat
git show --first-parent HEAD        # nur gegen den ersten Elternteil
git log --merges --oneline          # nur Merge-Commits
git log --no-merges --oneline       # ohne Merge-Commits

Für Code-Archäologie offenbart --first-parent auf einem langlebigen Branch die Integrationsgeschichte: wann jedes Feature in chronologischer Trunk-Reihenfolge gelandet ist.

Häufige Fehler

Während eines Merges Dateien bearbeiten, aber vergessen, sie per git add hinzuzufügen, sodass git commit sich weiterhin über unmerged paths beschwert. Führen Sie nach dem Bearbeiten immer git status aus. Auflösen, indem Sie die Konfliktmarker löschen, aber veralteten Text einer Seite stehen lassen; bauen Sie und führen Sie Tests aus, bevor Sie den Merge committen. --no-ff bei jedem Merge in einem schnellen Repository verwenden, was die Historie mit leeren Merge-Commits verschmutzt. Schließlich: An der Eingabeaufforderung in Panik geraten und mitten im Merge git reset --hard ausführen; git merge --abort ist sicherer, weil es ORIG_HEAD berücksichtigt.