git branch

Branches und Merges

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>]
[ ] optional| oder<arg> Platzhalter... wiederholbar--flag Option

Optionen

Klicke auf eine Option, um sie aufzuklappen

Einsteiger (7)

Branches auflisten, die auf Shell-Platzhaltermuster passen. Ohne Muster werden alle lokalen Branches gelistet. Beim Filtern ist --list nötig – sonst hält Git das Muster für den Namen eines neuen Branches.

EmpfohlenNötig zum Filtern per Muster; ohne legt ein Muster einen Branch an

Beispiel

git branch --list "feature-*"

Sowohl Remote-Tracking-Branches als auch lokale Branches auflisten. Zeigt alle lokal vorhandenen Branches und alle Remote-Branches, die dein Repository kennt.

EmpfohlenLokale und Remote-Tracking-Branches nach einem Fetch zusammen sehen

Beispiel

git branch -a

Nur die Remote-Tracking-Branches auflisten. Das sind lokale Referenzen (refs/remotes/...), die den Zustand der Branches in Remote-Repositories zum Zeitpunkt des letzten Fetch abbilden.

Bei BedarfListet nur Remote-Tracking-Branches; zuerst git fetch ausführen

Beispiel

git branch -r

Einen Branch löschen. Er muss vollständig in seinen Upstream-Branch gemergt sein, oder in HEAD, wenn kein Upstream gesetzt ist. Ein sicheres Löschen, das dich vor Arbeitsverlust schützt.

EmpfohlenSicheres Aufräumen: verweigert, wenn der Branch ungemergte Arbeit hat

Beispiel

git branch -d feature-complete

Einen Branch samt Konfiguration und Reflog verschieben/umbenennen. Wenn du auf dem Branch bist, kannst du den alten Namen weglassen.

EmpfohlenBenennt einen Branch um und behält sein Reflog; scheitert sicher, wenn der Name existiert

Beispiel

git branch -m old-name new-name

Hash und Betreff jedes Branches zeigen, plus wie weit er seinem Upstream voraus oder hinterher ist. Mit -vv wird zusätzlich der Name des Upstream-Branches (und der Pfad eines verknüpften Worktrees) ausgegeben.

Empfohlen-vv zeigt auf einen Blick den Upstream und Vorsprung/Rückstand

Beispiel

git branch -v

Den Namen des aktuellen Branches ausgeben. Im Detached-HEAD-Zustand wird nichts ausgegeben. Saubere Ausgabe, ideal für Skripte und Automatisierung.

Bei BedarfGibt nur den Branch-Namen aus; praktisch in Skripten und Prompts

Beispiel

git branch --show-current

Fortgeschritten (10)

Einen Branch auch mit nicht gemergten Änderungen erzwungen löschen. Kurzform für --delete --force. Mit Vorsicht nutzen, da Commits unerreichbar werden können.

Nicht empfohlenLöscht ungemergte Arbeit – nur, wenn du sicher bist, dass die Commits weg können

Beispiel

git branch -D abandoned-feature

Einen Branch erzwungen umbenennen und das Ziel überschreiben, falls es schon existiert. Kurzform für --move --force. Der überschriebene Branch geht verloren.

Nicht empfohlenÜberschreibt stillschweigend einen bestehenden Branch; nutze -m, außer du willst ihn bewusst ersetzen

Beispiel

git branch -M main master

Einen Branch samt Konfiguration und Reflog kopieren. Legt einen neuen Branch auf demselben Commit wie die Quelle an. Der ursprüngliche Branch bleibt erhalten (anders als bei --move).

Bei BedarfDupliziert einen Branch samt Konfiguration; im Alltag selten nötig

Beispiel

git branch -c feature feature-backup

Branches auflisten, deren Spitzen vom angegebenen Commit aus erreichbar sind (ohne Angabe: HEAD). Diese Branches sind vollständig eingeflossen und können sicher mit -d gelöscht werden.

EmpfohlenZeigt vollständig gemergte Branches, die sicher gelöscht werden können

Beispiel

git branch --merged main

Nur Branches auflisten, deren Spitzen NICHT vom angegebenen Commit aus erreichbar sind (ohne Angabe: HEAD). Diese Branches enthalten noch nicht integrierte Arbeit und brauchen vor dem Löschen Aufmerksamkeit.

Bei BedarfZeigt Branches mit noch nicht integrierter Arbeit

Beispiel

git branch --no-merged

Die Tracking-Beziehung zwischen einem lokalen und einem Remote-Branch einrichten. Dann funktionieren git pull/push ohne Angabe von Remote und Branch-Namen.

EmpfohlenVerknüpft einen Branch mit seinem Remote, damit einfaches pull und push funktionieren

Beispiel

git branch -u origin/main

Die Upstream-Tracking-Informationen eines Branches entfernen. Danach brauchen git pull und git push ausdrücklich Remote- und Branch-Angaben.

Bei BedarfEntfernt die Tracking-Verknüpfung, z. B. wenn der Remote-Branch weg ist

Beispiel

git branch --unset-upstream

Einen neuen lokalen Branch anlegen, der einem Remote-Branch folgt. Der neue Branch bekommt den Upstream für git pull/push automatisch eingerichtet.

Bei BedarfSetzt den Upstream beim Anlegen; von einem Remote-Branch aus ohnehin der Standard

Beispiel

git branch --track feature origin/feature

Nur Branches auflisten, deren Spitzen-Commit vom angegebenen Commit abstammt (ihn enthält). Praktisch, um herauszufinden, welche Branches einen bestimmten Bugfix oder ein Feature haben. Standard ist HEAD, wenn kein Commit angegeben ist.

Bei BedarfFindet, welche Branches einen bestimmten Fix oder Commit schon enthalten

Beispiel

git branch --contains a1b2c3d

Branches nach dem angegebenen Schlüssel sortieren. Präfix - für absteigende Reihenfolge. Übliche Schlüssel: committerdate, authordate, refname.

Bei Bedarf--sort=-committerdate zeigt zuletzt aktive Branches zuerst

Beispiel

git branch --sort=-committerdate

Die richtige Option wählen

Branches anzeigen

Verschiedene Wege, Branches aufzulisten und zu untersuchen

BefehlZeigt lokaleZeigt RemoteZusatzinfosAnwendungsfall
git branchJaNoAktueller Branch mit * markiertSchneller Blick auf lokale Branches
git branch -rNoJaRemote-Tracking-RefsSehen, was auf dem Server liegt
git branch -aJaJaAlle RefsGesamtbild aller Branches
git branch -vJaNoLetzter Commit pro BranchBranch-Aktivität auf einen Blick
git branch -vvJaNoUpstream + Vorsprung/RückstandSync-Status mit dem Remote prüfen
git branch --show-currentNur der aktuelleNoNur der NameSkripte, Shell-Prompts

Branches löschen

Sicheres oder erzwungenes Löschen – kenne den Unterschied

BefehlMuss gemergt seinKann Arbeit verlierenWann verwenden
-d (--delete)JaNoNach dem PR-Merge, Routine-Aufräumen
-D (--delete --force)NoJaExperimentelle Arbeit aufgeben

Branches umbenennen und kopieren

Optionen, um deine Branch-Namen neu zu ordnen

BefehlÜberschreibt vorhandenenBehält das OriginalTypische Nutzung
-m (--move)Nein (scheitert)NoUmbenennen: feature → feature-v2
-M (--move --force)JaNoVorhandenen Branch-Namen ersetzen
-c (--copy)Nein (scheitert)JaBranch zum Experimentieren duplizieren
-C (--copy --force)JaJaKopieren, vorhandenen überschreiben

Branches nach Merge-Status filtern

Branches finden, die weg können oder noch in Arbeit sind

BefehlZeigtZweckÜblicher nächster Schritt
--mergedIn HEAD gemergte BranchesKandidaten zum Aufräumen findengit branch -d <branch>
--merged mainIn main gemergte BranchesBranches finden, die sicher gelöscht werden könnenGemergte Branches gesammelt löschen
--no-mergedNICHT gemergte BranchesLaufende Arbeit findenVor dem Release prüfen
--contains <commit>Branches, die einen Commit enthaltenVerfolgen, wohin ein Fix gingHotfix-Deployment prüfen

Upstream-Tracking

Die Beziehung zwischen lokalen und Remote-Branches konfigurieren

BefehlAktionWirkungWann verwenden
-u origin/mainUpstream setzengit push/pull funktionieren ohne ArgumenteNach dem Anlegen eines lokalen Branches
--track origin/featureAnlegen + Upstream setzenNeuer lokaler Branch, der einem Remote folgtMit der Arbeit an einem Remote-Branch beginnen
--unset-upstreamUpstream entfernenVom Remote trennenEinem gelöschten Remote-Branch nicht mehr folgen

Workflow-Beispiele

1
git branch feature-login

Einen neuen Branch für das Feature anlegen

2
git switch feature-login

Auf den neuen Branch wechseln

3
(make changes and commits)

Mit mehreren Commits am Feature arbeiten

4
git switch main && git merge feature-login

Das fertige Feature zurück in main mergen

5
git branch -d feature-login

Den Feature-Branch nach dem Merge löschen

1
git branch --merged

Bereits gemergte Branches auflisten

2
git branch -d branch-name

Gemergte Branches einzeln sicher löschen

3
git fetch --prune

Veraltete Remote-Tracking-Referenzen entfernen

4
git branch -r

Prüfen, dass die Remote-Branches aufgeräumt sind

1
git fetch origin

Die neuesten Infos zu Remote-Branches holen

2
git branch -r

Verfügbare Remote-Branches auflisten

3
git branch --track feature origin/feature

Lokalen Branch anlegen, der dem Remote folgt

4
git switch feature

Auf den neuen Tracking-Branch wechseln

1
git branch -m old-name new-name

Den lokalen Branch umbenennen

2
git push origin -u new-name

Den neuen Branch-Namen zum Remote pushen

3
git push origin --delete old-name

Den alten Branch-Namen vom Remote löschen

1
git log --oneline -1

Den gesuchten Commit-Hash ermitteln

2
git branch --contains <commit-hash>

Lokale Branches mit diesem Commit finden

3
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-name

Aktueller 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-branch

Branch-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-name

Remote-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 origin

Detached 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-name

Branch 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-branch

Nicht alle Branches sichtbar

Ursache: Standardmäßig werden nur lokale Branches angezeigt

Nutze die Option -a, um lokale und Remote-Tracking-Branches anzuzeigen

git branch -a

Tipps & 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

A:

'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>'.

A:

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.

A:

-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.

A:

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.

A:

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.

A:

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.

A:

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.

A:

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.

A:

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'.

A:

Nutze 'git branch --sort=-committerdate', um die Branches mit den neuesten Commits zuerst aufzulisten. Mit -v siehst du zusätzlich Commit-Hash und Nachricht.