git branch
Branches auflisten, anlegen oder löschen
Mit dem Befehl 'git branch' kannst du Branches anlegen, auflisten, umbenennen und löschen. Zum Wechseln zwischen Branches dient er nicht – dafür gibt es 'git switch' oder 'git checkout'. Branches sind in Git leichtgewichtige Zeiger auf Commits, deshalb geht das Anlegen und Wechseln extrem schnell. Ohne Argumente listet git branch die vorhandenen Branches und hebt den aktuellen hervor. Mit einem Branch-Namen legt es einen neuen Branch an, der auf den aktuellen HEAD zeigt. Branches sind für parallele Entwicklung unverzichtbar: Mehrere Features oder Fixes können gleichzeitig entstehen, ohne sich gegenseitig zu stören.
Syntax
git branch [--list] [-a | -r] [-v [--abbrev=<n> | --no-abbrev]] [--merged | --no-merged] [<pattern>...]
git branch <branch-name> [<start-point>]
git branch (-d | -D) [-r] <branch-name>...
git branch (-m | -M) [<old-branch>] <new-branch>
git branch (-c | -C) [<old-branch>] <new-branch>
git branch [--set-upstream-to=<upstream> | -u <upstream>] [<branch-name>]Optionen
Die richtige Option wählen
Branches anzeigen
Verschiedene Wege, Branches aufzulisten und zu untersuchen
| Befehl | Zeigt lokale | Zeigt Remote | Zusatzinfos | Anwendungsfall |
|---|---|---|---|---|
git branch | Ja | No | Aktueller Branch mit * markiert | Schneller Blick auf lokale Branches |
git branch -r | No | Ja | Remote-Tracking-Refs | Sehen, was auf dem Server liegt |
git branch -a | Ja | Ja | Alle Refs | Gesamtbild aller Branches |
git branch -v | Ja | No | Letzter Commit pro Branch | Branch-Aktivität auf einen Blick |
git branch -vv | Ja | No | Upstream + Vorsprung/Rückstand | Sync-Status mit dem Remote prüfen |
git branch --show-current | Nur der aktuelle | No | Nur der Name | Skripte, Shell-Prompts |
Branches löschen
Sicheres oder erzwungenes Löschen – kenne den Unterschied
| Befehl | Muss gemergt sein | Kann Arbeit verlieren | Wann verwenden |
|---|---|---|---|
-d (--delete) | Ja | No | Nach dem PR-Merge, Routine-Aufräumen |
-D (--delete --force) | No | Ja | Experimentelle Arbeit aufgeben |
Branches umbenennen und kopieren
Optionen, um deine Branch-Namen neu zu ordnen
| Befehl | Überschreibt vorhandenen | Behält das Original | Typische Nutzung |
|---|---|---|---|
-m (--move) | Nein (scheitert) | No | Umbenennen: feature → feature-v2 |
-M (--move --force) | Ja | No | Vorhandenen Branch-Namen ersetzen |
-c (--copy) | Nein (scheitert) | Ja | Branch zum Experimentieren duplizieren |
-C (--copy --force) | Ja | Ja | Kopieren, vorhandenen überschreiben |
Branches nach Merge-Status filtern
Branches finden, die weg können oder noch in Arbeit sind
| Befehl | Zeigt | Zweck | Üblicher nächster Schritt |
|---|---|---|---|
--merged | In HEAD gemergte Branches | Kandidaten zum Aufräumen finden | git branch -d <branch> |
--merged main | In main gemergte Branches | Branches finden, die sicher gelöscht werden können | Gemergte Branches gesammelt löschen |
--no-merged | NICHT gemergte Branches | Laufende Arbeit finden | Vor dem Release prüfen |
--contains <commit> | Branches, die einen Commit enthalten | Verfolgen, wohin ein Fix ging | Hotfix-Deployment prüfen |
Upstream-Tracking
Die Beziehung zwischen lokalen und Remote-Branches konfigurieren
| Befehl | Aktion | Wirkung | Wann verwenden |
|---|---|---|---|
-u origin/main | Upstream setzen | git push/pull funktionieren ohne Argumente | Nach dem Anlegen eines lokalen Branches |
--track origin/feature | Anlegen + Upstream setzen | Neuer lokaler Branch, der einem Remote folgt | Mit der Arbeit an einem Remote-Branch beginnen |
--unset-upstream | Upstream entfernen | Vom Remote trennen | Einem gelöschten Remote-Branch nicht mehr folgen |
Workflow-Beispiele
git branch feature-loginEinen neuen Branch für das Feature anlegen
git switch feature-loginAuf den neuen Branch wechseln
(make changes and commits)Mit mehreren Commits am Feature arbeiten
git switch main && git merge feature-loginDas fertige Feature zurück in main mergen
git branch -d feature-loginDen Feature-Branch nach dem Merge löschen
git branch --mergedBereits gemergte Branches auflisten
git branch -d branch-nameGemergte Branches einzeln sicher löschen
git fetch --pruneVeraltete Remote-Tracking-Referenzen entfernen
git branch -rPrüfen, dass die Remote-Branches aufgeräumt sind
git fetch originDie neuesten Infos zu Remote-Branches holen
git branch -rVerfügbare Remote-Branches auflisten
git branch --track feature origin/featureLokalen Branch anlegen, der dem Remote folgt
git switch featureAuf den neuen Tracking-Branch wechseln
git branch -m old-name new-nameDen lokalen Branch umbenennen
git push origin -u new-nameDen neuen Branch-Namen zum Remote pushen
git push origin --delete old-nameDen alten Branch-Namen vom Remote löschen
git log --oneline -1Den gesuchten Commit-Hash ermitteln
git branch --contains <commit-hash>Lokale Branches mit diesem Commit finden
git branch -r --contains <commit-hash>Remote-Branches mit diesem Commit finden
Fehlerbehebung
Branch kann nicht gelöscht werden – nicht vollständig gemergt
Ursache: Der Branch hat Commits, die nicht in seinen Upstream gemergt sind (oder in HEAD, wenn er keinen Upstream hat)
Merge den Branch zuerst, oder erzwinge das Löschen mit -D, wenn du die Arbeit sicher verwerfen willst
git branch -D branch-nameAktueller Branch kann nicht gelöscht werden
Ursache: Du versuchst, den Branch zu löschen, auf dem du gerade bist
Wechsle zuerst auf einen anderen Branch und lösche dann den gewünschten
git switch main && git branch -d old-branchBranch-Name existiert bereits
Ursache: Du versuchst, einen Branch mit einem Namen anzulegen, den es schon gibt
Wähle einen anderen Namen, lösche zuerst den vorhandenen Branch oder setze ihn mit -f auf einen neuen Startpunkt
git branch -f existing-name <start-point>Kein Upstream für den Push konfiguriert
Ursache: Der lokale Branch hat keine Tracking-Beziehung zu einem Remote-Branch
Die Upstream-Tracking-Beziehung einrichten
git push -u origin branch-nameRemote-Branch erscheint nicht in git branch -r
Ursache: Das lokale Repository hat nicht die neuesten Infos zu den Remote-Branches
Fetche vom Remote, um deine Remote-Tracking-Branches zu aktualisieren
git fetch originDetached HEAD nach einem Checkout
Ursache: Du hast direkt einen Commit ausgecheckt statt eines Branches
Lege auf dem aktuellen Commit einen neuen Branch an oder wechsle zurück auf einen vorhandenen
git switch -c new-branch-nameBranch folgt dem falschen Remote
Ursache: Der Upstream ist so konfiguriert, dass er einem falschen Remote-Branch folgt
Setze das Upstream-Tracking auf den richtigen Remote-Branch
git branch -u origin/correct-branchNicht alle Branches sichtbar
Ursache: Standardmäßig werden nur lokale Branches angezeigt
Nutze die Option -a, um lokale und Remote-Tracking-Branches anzuzeigen
git branch -aTipps & Stolperfallen
Best Practices
- ✓Nutze sprechende Branch-Namen, die den Zweck zeigen: feature/user-auth, bugfix/login-error, hotfix/security-patch
- ✓Lösche Branches nach dem Merge, damit das Repository aufgeräumt bleibt – mit 'git branch --merged' findest du, was sicher weg kann
- ✓Lege Feature-Branches immer von einem aktuellen main an, um Merge-Konflikte gering zu halten
- ✓Nutze 'git branch -vv', um Tracking-Beziehungen und den Vorsprung/Rückstand zu sehen
- ✓Richte beim Anlegen von Branches das Tracking mit 'git push -u origin branch-name' ein, damit Push/Pull einfacher werden
- ✓Arbeite nicht direkt auf main/master – lege für Änderungen immer einen Branch an
- ✓Nutze 'git branch --no-merged', um Branches mit noch laufender Arbeit zu finden
- ✓Synchronisiere Remote-Branches regelmäßig mit 'git fetch --prune', um veraltete Referenzen zu entfernen
- ✓Nutze lieber 'git switch' statt 'git checkout', damit beim Branch-Wechsel die Absicht klarer ist
- ✓Nutze '--sort=-committerdate', um die zuletzt aktiven Branches zuerst zu sehen
- ✓Bevor du einen Branch mit -D löschst, prüfe mit 'git log branch-name', dass du ihn nicht mehr brauchst
- ✓Schreibe Branch-Namen klein und mit Bindestrichen, für Einheitlichkeit und Kompatibilität
Häufige Fehler
- ✗Erwarten, dass 'git branch <name>' auf den neuen Branch wechselt. Es legt ihn nur an – nutze 'git switch <name>' oder 'git checkout -b <name>', um anzulegen und zu wechseln.
- ✗Versuchen, den aktuellen Branch zu löschen. Du musst zuerst auf einen anderen Branch wechseln, bevor du den löschst, auf dem du bist.
- ✗-d auf nicht gemergten Branches nutzen und Arbeit verlieren. -d schützt dich – wenn du nicht gemergte Arbeit wirklich löschen willst, nutze -D.
- ✗Vergessen, neue Branches zum Remote zu pushen. Lokale Branches werden erst geteilt, wenn du 'git push -u origin <branch>' ausführst.
- ✗Alte Branches nicht aufräumen. Nutze regelmäßig 'git branch --merged', um gemergte Branches zu finden und zu löschen.
FAQ
'git branch <name>' legt nur einen neuen Branch an, wechselt aber nicht dorthin. 'git checkout -b <name>' legt einen neuen Branch an UND wechselt in einem Befehl dorthin. Die moderne Entsprechung ist 'git switch -c <name>'.
Nutze 'git branch -m old-name new-name', um einen Branch umzubenennen. Bist du auf dem Branch, reicht 'git branch -m new-name'. Bei Remote-Branches musst du den neuen Namen pushen und den alten löschen.
-d ist ein sicheres Löschen, das nur klappt, wenn der Branch vollständig in seinen Upstream gemergt ist (oder in HEAD, wenn kein Upstream gesetzt ist). -D ist ein erzwungenes Löschen, das den Branch unabhängig vom Merge-Status entfernt. Nutze -D nur, wenn du nicht gemergte Commits sicher verwerfen willst.
Nutze 'git push origin --delete branch-name' oder die kürzere Syntax 'git push origin :branch-name'. Das entfernt den Branch aus dem Remote-Repository.
Remote-Tracking-Branches (wie origin/main) sind lokale Referenzen, die den Zustand der Branches in Remote-Repositories abbilden. Sie werden bei fetch oder pull aktualisiert und zeigen dir, wohin die Remote-Branches zeigen.
Nutze 'git branch --show-current' für nur den Namen oder 'git branch', um alle Branches zu sehen, der aktuelle mit * markiert. Auch 'git status' zeigt den aktuellen Branch.
Git erlaubt nicht, den Branch zu löschen, auf dem du gerade bist. Wechsle zuerst mit 'git switch other-branch' auf einen anderen und lösche dann den gewünschten.
Nutze 'git branch branch-name commit-hash', um einen Branch ab einem beliebigen Commit anzulegen. Als Startpunkt geht ein Commit-Hash, ein Tag oder ein anderer Branch-Name.
Der Upstream- (oder Tracking-)Branch ist der Remote-Branch, zu dem dein lokaler Branch standardmäßig pusht und von dem er pullt. Setze ihn mit 'git branch -u origin/branch-name' oder 'git push -u origin branch-name'.
Nutze 'git branch --sort=-committerdate', um die Branches mit den neuesten Commits zuerst aufzulisten. Mit -v siehst du zusätzlich Commit-Hash und Nachricht.