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 sind unabhängige Entwicklungslinien in einem Git-Repository. Sie ermöglichen parallele Arbeit an verschiedenen Features ohne sich zu behindern.
| 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 |
git switch - um zum vorherigen Branch zurückzuwechseln – praktisch für häufige Wechsel zwischen zwei Branches.
git merge führt einen anderen Branch in den aktuellen Branch ein. Es gibt verschiedene Merge-Strategien – Fast-Forward, 3-Way-Merge und Squash.
| 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 |
--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.
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.
| 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) |
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!
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.
| Marker | Bedeutung |
|---|---|
| <<<<<<< HEAD | Beginn des aktuellen Branches (HEAD) |
| ======= | Trenner zwischen den Versionen |
| >>>>>>> branch-name | Ende des zu mergenden Branches |
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 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.
--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 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.
git branch
git merge
git rebase
git mergetool
--no-ff
--squash
git checkout -b feature/xyz ·
git checkout main && git merge feature/xyz ·
git merge --squash feature/xyz