Git Branching & Merging

6 Kernkonzepte
Die wichtigsten Git-Befehle für Branching und Merging: git branch · git checkout · git switch · git merge · git rebase · Konflikte lösen Branching und Merging sind die Kernkonzepte von Git für parallele Entwicklung und Zusammenarbeit. Diese Befehle sind essenziell für die Arbeit mit Feature-Branches, Releases und Hotfixes.

Branches – Anzeigen, Erstellen, Löschen

git branch · git checkout -b · git branch -d
git branch # Branches anzeigen git branch feature/new-login # Branch erstellen git checkout feature/new-login # Branch wechseln git switch - # Vorherigen Branch wechseln

Branches sind unabhängige Entwicklungslinien in einem Git-Repository. Sie ermöglichen parallele Arbeit an verschiedenen Features ohne sich zu behindern.

Wichtige Branch-Befehle

Befehl Beschreibung
git branch Alle lokalen Branches anzeigen (aktueller mit * markiert)
git branch -r Remote-Branches anzeigen
git branch -a Alle Branches (lokal + remote) anzeigen
git branch <name> Neuen Branch erstellen (bleibt auf aktuellem Branch)
git checkout -b <name> Neuen Branch erstellen und wechseln
git switch -c <name> Neuen Branch erstellen und wechseln (modern)
git branch -d <name> Branch löschen (nur wenn gemerged)
git branch -D <name> Branch erzwingen löschen (auch ungemerged)
git branch -m <alt> <neu> Branch umbenennen
Beispiele
# Branches anzeigen
git branch
* main
develop
feature/login
# Neuen Feature-Branch erstellen und wechseln
git checkout -b feature/payment
# Branch umbenennen
git branch -m feature/payment feature/checkout
# Branch löschen (nach Merge)
git branch -d feature/checkout
Tipp: Verwenden Sie git switch - um zum vorherigen Branch zurückzuwechseln – praktisch für häufige Wechsel zwischen zwei Branches.

Merge – Branches zusammenführen

git merge · --no-ff · --squash
git checkout main git merge feature/new-feature git merge --no-ff feature/new-feature

git merge führt einen anderen Branch in den aktuellen Branch ein. Es gibt verschiedene Merge-Strategien – Fast-Forward, 3-Way-Merge und Squash.

Merge-Optionen

Option Beschreibung
--no-ff Erzwingt einen Merge-Commit (auch bei Fast-Forward)
--squash Fasst alle Commits des Branches zu einem Commit zusammen
--abort Merge bei Konflikten abbrechen
--continue Merge nach Konfliktlösung fortsetzen
--no-commit Merge durchführen, aber automatischen Commit unterdrücken
Beispiele
# Feature-Branch in main mergen
git checkout main
git merge feature/new-feature
# Merge mit Squash (alle Commits zu einem zusammengefasst)
git merge --squash feature/new-feature
git commit -m "Neues Feature implementiert"
# Merge mit --no-ff (immer Merge-Commit)
git merge --no-ff feature/new-feature
Tipp: --no-ff ist besonders bei Feature-Branches sinnvoll, um die Historie lesbar zu halten – jeder Merge erzeugt einen eigenen Commit, der den Branch-Zusammenhang zeigt.

Rebase – Branches neu aufsetzen

git rebase · git rebase -i · interactive
git checkout feature/new-feature git rebase main git rebase -i HEAD~3

git rebase verschiebt die Commits eines Branches auf die Spitze eines anderen Branches. Es erzeugt eine lineare Historie, ist aber bei gemeinsam genutzten Branches mit Vorsicht zu verwenden.

Rebase-Optionen

Option Beschreibung
--continue Rebase nach Konfliktlösung fortsetzen
--abort Rebase abbrechen und in Ausgangszustand zurückkehren
--skip Commit überspringen (bei Konflikten)
-i, --interactive Interaktiver Rebase (squash, reword, edit, drop)
Beispiele
# Feature-Branch auf main rebasen
git checkout feature/new-feature
git rebase main
# Interaktiver Rebase (letzte 3 Commits bearbeiten)
git rebase -i HEAD~3
# Editor öffnet sich mit Commits:
pick a1b2c3d Commit 1
squash e5f6g7h Commit 2
reword i9j0k1l Commit 3
# Rebase auf main und dann per Fast-Forward mergen
git checkout main
git merge feature/new-feature # Fast-Forward möglich
⚠️ Vorsicht: git rebase sollte NICHT auf Branches angewendet werden, die bereits mit anderen geteilt wurden (public branches). Rebase verändert die Commit-Historie – das führt zu Konflikten bei anderen Entwicklern!

Konflikte lösen – Merge-Konflikte beheben

git status · git diff · git mergetool
# Merge-Konflikt erkennen CONFLICT (content): Merge conflict in file.txt git status git diff git mergetool # GUI-Tool öffnen

Merge-Konflikte entstehen, wenn zwei Branches Änderungen an den gleichen Zeilen einer Datei haben. Git markiert die Konflikte in der Datei, die Sie manuell lösen müssen.

Konflikt-Marker

Marker Bedeutung
<<<<<<< HEAD Beginn des aktuellen Branches (HEAD)
======= Trenner zwischen den Versionen
>>>>>>> branch-name Ende des zu mergenden Branches
Beispiele
# Konflikt in einer Datei
<<<<<<< HEAD
console.log("Version von main");
=======
console.log("Version von feature");
>>>>>>> feature/new-feature
# Nach manueller Lösung:
git add file.txt
git commit # Merge-Commit erstellen
# Bei Rebase-Konflikten:
git add file.txt
git rebase --continue
# Konflikt abbrechen
git merge --abort
git rebase --abort
Tipp: Nutzen Sie git mergetool für eine visuelle Konfliktlösung (z.B. mit VSCode, KDiff3 oder Meld). Vergessen Sie nicht, nach der Lösung git add und git commit auszuführen.

Fast-Forward – Lineare Historie

Fast-Forward · --no-ff · --ff-only
# Fast-Forward (Standard) git checkout main git merge feature/new-feature # main zeigt jetzt auf feature

Fast-Forward ist der Standard-Merge-Modus, wenn der Ziel-Branch keine neuen Commits hat. Der Branch-Zeiger wird einfach auf den neuesten Commit des anderen Branches verschoben – es entsteht kein separater Merge-Commit.

Beispiele
# Fast-Forward erzwingen (nur wenn möglich)
git merge --ff-only feature/new-feature
# Kein Fast-Forward (erzwingt Merge-Commit)
git merge --no-ff feature/new-feature
# Szenario: main hat sich nicht weiterentwickelt
A---B---C (main) \ D---E (feature)
# Nach git merge feature (Fast-Forward)
A---B---C---D---E (main, feature)
Tipp: Verwenden Sie --no-ff für Feature-Branches, um die Historie lesbar zu halten. --ff-only ist sicher, wenn Sie keine Merge-Commits wünschen und Konflikte vermeiden möchten.

Squash – Commits zusammenfassen

git merge --squash · git rebase -i · squash
# Squash-Merge git checkout main git merge --squash feature/new-feature git commit -m "Neues Feature implementiert"

Squash fasst alle Commits eines Branches zu einem einzigen Commit zusammen. Das ist besonders nützlich, um unordentliche Commit-Historien aufzuräumen, bevor ein Feature in den main-Branch gemerged wird.

Beispiele
# Squash-Merge durchführen
git checkout main
git merge --squash feature/new-feature
git commit -m "Feature XYZ implementiert"
# Interaktiver Rebase mit Squash
git rebase -i HEAD~4
pick a1b2c3d Commit 1
squash e5f6g7h Commit 2
squash i9j0k1l Commit 3
# Nach dem Squash wird ein neuer Commit erstellt
# Commit-Nachricht kann im Editor angepasst werden
Tipp: Squash-Merges sind besonders in Teams beliebt, um die Historie sauber zu halten. Der Feature-Branch selbst bleibt erhalten und kann gelöscht werden, nachdem der Squash-Merge abgeschlossen ist.

Git Branching-Strategien im Überblick

Git Flow Klassische Strategie mit main, develop, feature, release, hotfix
Für große Projekte
GitHub Flow Einfache Strategie mit main und feature-Branches
Für Continuous Delivery
GitLab Flow main + environment-Branches (staging, production)
Für CI/CD
Trunk-Based Kurze Feature-Branches, oft in main mergen
Für schnelle Entwicklung
PR/MR Code-Review über Pull/Merge Requests
Qualitätssicherung
Semantic Semantic Versioning (major.minor.patch)
Versionierung

Quick Summary

git branch
Branches verwalten
git merge
Branches zusammenführen
git rebase
Branches neu aufsetzen
git mergetool
Konflikte lösen
--no-ff
Fast-Forward
--squash
Squash-Merge
git checkout -b feature/xyz · git checkout main && git merge feature/xyz · git merge --squash feature/xyz