git checkout

Branches und Merges

Branches wechseln oder Dateien im Arbeitsbaum wiederherstellen


git checkout ist ein vielseitiger Befehl: Er wechselt Branches, legt neue an, stellt Dateien aus bestimmten Commits wieder her und kann dein Repository in den Zustand „detached HEAD“ versetzen. Auch wenn neuere Git-Versionen einen Teil davon auf „git switch“ und „git restore“ verteilt haben, ist checkout weiterhin verbreitet und bekannt.

Syntax

git checkout <branch>
git checkout -b <new-branch> [<start-point>]
git checkout -B <branch> [<start-point>]
git checkout --detach [<branch>]
git checkout [--] <pathspec>...
git checkout <commit> -- <pathspec>...
[ ] optional| oder<arg> Platzhalter... wiederholbar--flag Option

Optionen

Klicke auf eine Option, um sie aufzuklappen

Einsteiger (3)

Einen neuen Branch anlegen und sofort dorthin wechseln. Entspricht git branch <name> gefolgt von git checkout <name>.

EmpfohlenAnlegen und wechseln in einem Schritt (moderne Form: git switch -c)

Beispiel

git checkout -b feature-login

Ungestagte Änderungen in den angegebenen Dateien verwerfen und sie aus dem Staging-Bereich (Index) wiederherstellen, nicht aus HEAD. Gestagte Änderungen bleiben erhalten. Das -- trennt Dateipfade von Branch-Namen.

Bei BedarfVerwirft ungestagte Änderungen endgültig – git restore <file> ist die moderne Form

Beispiel

git checkout -- src/app.js

Rückmeldungen unterdrücken. Nützlich in Skripten, in denen du keine „Switched to branch“-Bestätigungen brauchst.

Bei BedarfUnterdrückt Rückmeldungen; vor allem für Skripte

Beispiel

git checkout -q main

Fortgeschritten (8)

Einen neuen Branch anlegen oder ihn zurücksetzen, falls er existiert, und dann dorthin wechseln. Nützlich, um einen Branch auf den aktuellen Commit zu setzen.

Nicht empfohlenSetzt einen bestehenden Branch stillschweigend zurück und kann seine Commits verwaisen lassen

Beispiel

git checkout -B feature-login

Beim Anlegen eines neuen Branches die Tracking-Konfiguration für den Upstream-Branch einrichten. Ermöglicht git pull/push ohne Angabe des Remotes.

EmpfohlenLegt einen lokalen Branch an, der mit einem Remote-Branch verknüpft ist

Beispiel

git checkout --track origin/feature

Beim Anlegen eines neuen Branches von einem Remote-Tracking-Branch kein Tracking einrichten. Der Branch ist unabhängig.

Bei BedarfLegt einen Branch von einem Remote-Branch an, ohne ihn als Upstream zu verknüpfen

Beispiel

git checkout --no-track -b feature origin/main

HEAD am angegebenen Commit lösen (detach). Du kannst alten Code ansehen oder experimentieren, ohne einen Branch zu verändern.

Bei BedarfEinen alten Commit ansehen; vor dem Committen dort einen Branch anlegen

Beispiel

git checkout --detach v1.0.0

Eine Datei auf ihren Stand in einem bestimmten Commit zurücksetzen. Die Datei landet in deinem Arbeitsverzeichnis und im Staging-Bereich.

Bei BedarfHolt die alte Version einer Datei gestagt zurück, ohne den Branch zu wechseln

Beispiel

git checkout a1b2c3d -- src/app.js

Checkout auch mit nicht committeten Änderungen erzwingen. Wirft ALLE lokalen Änderungen an verfolgten Dateien weg (nicht nur die kollidierenden) und alle unverfolgten Dateien, die im Weg sind.

Nicht empfohlenWirft alle nicht committeten Änderungen an getrackten Dateien weg – lieber stashen

Beispiel

git checkout -f main

Bei Merge-Konflikten unsere Version (der Branch, auf dem du warst) der Konfliktdatei auschecken. Nützlich, um Konflikte durch Wahl einer Seite zu lösen. Achtung: Beim Rebase sind ours/theirs vertauscht.

Bei BedarfLöst eine Konfliktdatei, indem deine Seite behalten wird (beim Rebase sind die Seiten vertauscht)

Beispiel

git checkout --ours config.js

Bei Merge-Konflikten ihre Version (der Branch, der hineingemergt wird) der Konfliktdatei auschecken. Übernimmt die eingehenden Änderungen. Achtung: Beim Rebase sind ours/theirs vertauscht.

Bei BedarfLöst eine Konfliktdatei, indem die eingehende Seite genommen wird

Beispiel

git checkout --theirs config.js

Erfahren (3)

Einen neuen, noch ungeborenen Branch ohne Commit-Historie anlegen. Die aktuellen Dateien bleiben im Arbeitsbaum und im Staging-Bereich; der erste Commit auf diesem Branch hat keinen Elternteil und startet eine unabhängige Historie.

Bei BedarfStartet eine unabhängige Historie (gh-pages, Doku); selten nötig

Beispiel

git checkout --orphan gh-pages

Beim Wechsel mit lokalen Änderungen an Dateien, die sich zwischen den beiden Branches unterscheiden, diese per Drei-Wege-Merge mitnehmen statt zu verweigern; Konflikte bleiben zum Lösen im Arbeitsbaum. Seit Git 2.55 werden die lokalen Änderungen zuerst als Stash-Eintrag gesichert, sodass ein Wechsel mit Konflikt sie nicht mehr verlieren kann.

Bei BedarfNimmt lokale Änderungen auf einen anderen Branch mit; kann Konflikte hinterlassen

Beispiel

git checkout -m feature

Interaktiv Hunks auswählen, die im Arbeitsverzeichnis verworfen werden. So behältst du manche Änderungen und machst andere in derselben Datei rückgängig.

Bei BedarfVerwirft nur ausgewählte Hunks – prüfe jede Abfrage sorgfältig

Beispiel

git checkout -p -- app.js

Die richtige Option wählen

Branches anlegen

Verschiedene Wege, einen neuen Branch anzulegen und zu ihm zu wechseln

BefehlWenn der Branch existiertHistorieAm besten für
-b <name>Scheitert mit FehlerNormal (verbunden)Normale Arbeit an einem neuen Feature
-B <name>Wird auf den aktuellen Commit gesetztNormal (verbunden)Einen Branch neu beginnen
--orphan <name>Scheitert mit FehlerKeine (unverbunden)gh-pages, Doku, leere Seite

Wechseln mit nicht committeten Änderungen

Was beim Branch-Wechsel mit deinen lokalen Änderungen passiert

BefehlNicht committete ÄnderungenRisikoWann verwenden
git checkout <branch>Bei Konflikt blockiertSicherStandardverhalten – verhindert Unfälle
git checkout -f <branch>Endgültig verworfenGefährlichAlle lokalen Änderungen absichtlich aufgeben
git checkout -m <branch>Per Drei-Wege-Merge übernommenMittelÄnderungen auf einen anderen Branch mitnehmen
git stash + checkoutFür später gesichertSicherVorübergehender Kontextwechsel

Dateien wiederherstellen

Dateiinhalte aus verschiedenen Quellen verwerfen oder wiederherstellen

BefehlQuelleBetrifft StagingWiederherstellbar
-- <file>Index (gestagte Version)NoNein – Änderungen für immer verloren
<commit> -- <file>Bestimmter CommitJa (gestagt)Nein – aber zum Prüfen gestagt
-p -- <file>Index (interaktiv)NoTeilweise – Hunks wählen

Remote-Branch-Tracking

Die Beziehung zwischen lokalen und Remote-Branches steuern

BefehlRichtet Tracking einAnwendungsfallgit push/pull
--track origin/featJa (automatisch)Am Branch eines Kollegen arbeitenFunktioniert ohne Argumente
--no-track -b exp origin/mainNein (unabhängig)Gefahrlos experimentierenRemote muss angegeben werden
<remote-branch>Ja (wenn eindeutig)Schnell einen Remote-Branch auscheckenFunktioniert ohne Argumente

Merge-Konflikte lösen

Bei Merge-Konflikten eine Seite wählen

BefehlBehältVerwirftWann verwenden
--ours <file>Die Version deines BranchesEingehende ÄnderungenDeine Änderungen sind richtig
--theirs <file>Eingehende VersionDeine ÄnderungenIhre Umsetzung übernehmen
(manual edit)Kombiniertes ErgebnisNichtsTeile von beiden Seiten nötig

checkout und die modernen Befehle

Git 2.23+ hat checkout in gezielte Befehle aufgeteilt

BefehlWechselt BranchesStellt Dateien wieder herEmpfohlen für
git checkoutJaJaGewohnheit, ältere Git-Versionen
git switchJaNoKlare Absicht: nur Branch-Operationen
git restoreNoJaKlare Absicht: nur Datei-Operationen

Workflow-Beispiele

1
git stash

Aktuelle nicht committete Arbeit sichern

2
git checkout other-branch

Auf den anderen Branch wechseln

3
(review or make quick fix)

Die nötige Arbeit auf diesem Branch erledigen

4
git checkout -

Zurück zum vorherigen Branch (Abkürzung)

5
git stash pop

Die gesicherte Arbeit wiederherstellen

1
git checkout main

Auf den Branch main wechseln

2
git pull origin main

Die neuesten Änderungen vom Remote holen

3
git checkout -b feature-name

Neuen Feature-Branch anlegen und dorthin wechseln

4
(make changes and commits)

Am Feature arbeiten

5
git push -u origin feature-name

Branch pushen und Tracking einrichten

1
git status

Sehen, welche Dateien geändert wurden

2
git diff file.js

Die Änderungen prüfen, die du verwerfen wirst

3
git checkout -- file.js

Änderungen an einer bestimmten Datei verwerfen

4
git checkout -- .

Oder ALLE ungestagten Änderungen an verfolgten Dateien verwerfen

1
git log --oneline

Den benötigten Commit-Hash finden

2
git checkout <commit-hash>

Genau diesen Commit auschecken (Detached HEAD)

3
(inspect, test, or debug)

Den alten Code untersuchen

4
git checkout main

Danach zum Branch main zurückkehren

1
git log --oneline -- file.js

Commits finden, die diese Datei geändert haben

2
git show <commit>:file.js

Vorschau der alten Version

3
git checkout <commit> -- file.js

Datei aus diesem Commit wiederherstellen (wird gestagt)

4
git commit -m 'Restore file.js'

Die wiederhergestellte Version committen

1
git fetch origin

Die neuesten Infos zu Remote-Branches holen

2
git branch -r

Verfügbare Remote-Branches anzeigen

3
git checkout --track origin/feature

Lokalen Branch anlegen, der dem Remote folgt

4
git pull

Jetzt funktioniert pull ohne Angabe des Remotes

Fehlerbehebung

error: Your local changes to the following files would be overwritten by checkout

Ursache: Du hast nicht committete Änderungen, die mit dem Ziel-Branch kollidieren

Committe deine Änderungen, stashe sie oder erzwinge mit -f (verwirft die Änderungen)

git stash && git checkout branch && git stash pop

error: pathspec 'branch-name' did not match any file(s) known to git

Ursache: Der Branch existiert nicht, oder du hast dich beim Namen vertippt

Sieh dir die verfügbaren Branches mit git branch -a an oder lege den Branch mit -b an

git branch -a | grep branch-name

You are in 'detached HEAD' state

Ursache: Du hast einen Commit-Hash oder Tag statt eines Branch-Namens ausgecheckt

Wenn du weiterarbeiten willst, lege einen Branch an. Sonst checke einen vorhandenen Branch aus

git checkout -b new-branch-name

Im Detached HEAD gemachte Commits sind verloren

Ursache: Du hast im Detached HEAD committet und dann auf einen anderen Branch gewechselt

Finde die Commits über das Reflog und lege einen Branch an, um sie zu sichern

git reflog && git branch recovered-work <commit-hash>

Checkout nicht möglich: Eine unverfolgte Datei würde überschrieben

Ursache: Du hast unverfolgte Dateien, die im Ziel-Branch existieren

Lösche, verschiebe oder stashe die unverfolgten Dateien zuerst

git stash --include-untracked && git checkout branch

Mit checkout -- versehentlich Änderungen verworfen

Ursache: git checkout -- <file> löscht nicht committete Änderungen endgültig

Leider kann Git sie nicht wiederherstellen. Sieh im lokalen Verlauf deines Editors nach

(check IDE local history if available)

fatal: 'name' could be both a local file and a tracking branch

Ursache: Eine Datei oder ein Ordner heißt genauso wie der Remote-Branch, den du auschecken willst

Hänge ein -- an, damit Git weiß, dass der Name ein Branch ist, oder nutze git switch

git checkout branch-name --

Branch aktualisiert sich nach dem Checkout nicht

Ursache: Du hast vielleicht direkt einen Remote-Tracking-Branch ausgecheckt

Lege einen lokalen Tracking-Branch an, statt origin/branch direkt auszuchecken

git checkout --track origin/branch-name

Tipps & Stolperfallen

Best Practices

  • ✓Nutze 'git stash', bevor du den Branch wechselst, wenn du nicht committete Arbeit behalten willst
  • ✓Nutze lieber 'git checkout -b' statt getrennt 'git branch' + 'git checkout', um anzulegen und zu wechseln
  • ✓Nutze '--', um Dateipfade klar von Branch-Namen zu trennen: 'git checkout -- file.txt'
  • ✓Nutze lieber die modernen Befehle 'git switch' für Branches und 'git restore' für Dateien – die Absicht ist klarer
  • ✓Nutze 'git checkout -', um schnell zum vorherigen Branch zurückzuwechseln (wie 'cd -')
  • ✓Bevor du mit '-f' einen Checkout erzwingst, stelle sicher, dass du deine Änderungen wirklich verwerfen willst
  • ✓Lege im Detached HEAD sofort einen Branch an, wenn du Commits machen willst
  • ✓Nutze '--track' beim Auschecken von Remote-Branches, um Push/Pull automatisch einzurichten
  • ✓Nutze 'git checkout <commit> -- <file>', um einzelne Dateien wiederherzustellen, ohne den Branch zu wechseln
  • ✓Checke Commits nur zum Nachforschen direkt aus – für die normale Arbeit nutze Branch-Namen
  • ✓Nutze '-p' (Patch-Modus), wenn du nur einige Änderungen in einer Datei verwerfen willst
  • ✓Prüfe vor Arbeitsbeginn immer mit 'git branch' oder 'git status', ob du auf dem richtigen Branch bist

Häufige Fehler

  • ✗Mit nicht committeten Änderungen auschecken wollen. Git verweigert den Wechsel, wenn er deine Änderungen überschreiben würde – committe, stashe oder erzwinge mit -f (verwirft die Änderungen).
  • ✗Checkout für Branches mit Checkout für Dateien verwechseln. Beim Branch-Wechsel versehentlich Dateien wiederherstellen – setze -- vor Dateipfade: git checkout -- file.txt
  • ✗Im Detached HEAD committen. Die Commits werden verwaist, sobald du einen anderen Branch auscheckst – lege zuerst einen Branch an: git checkout -b my-branch
  • ✗-B nutzen, ohne zu wissen, dass es überschreibt. Dabei kann die Position des vorhandenen Branches verloren gehen – nutze -b für neue Branches und -B nur für absichtliches Zurücksetzen.

FAQ

A:

'git switch' ist ein neuerer Befehl (Git 2.23+), der nur Branches wechselt – dadurch klarer und sicherer. 'git checkout' kann Branches wechseln UND Dateien wiederherstellen, was verwirren kann. Nutze 'git switch' für Branches und 'git restore' für Dateien, wenn du den modernen Weg bevorzugst.

A:

Leider geht das mit Git allein nicht – die Änderungen sind endgültig verworfen. Manche IDEs haben einen lokalen Verlauf, der helfen kann. Deshalb ist bei diesem Befehl Vorsicht wichtig.

A:

Detached HEAD heißt, du hast einen bestimmten Commit statt eines Branches ausgecheckt. Du kannst dich umsehen und committen, aber diese Commits gehören zu keinem Branch. Lege mit 'git checkout -b name' einen Branch an, um deine Arbeit zu sichern.

A:

'-b' legt einen neuen Branch an und scheitert, wenn er schon existiert. '-B' legt einen neuen Branch an oder setzt einen vorhandenen auf die aktuelle Position zurück. Nutze '-B', wenn du einen Branch absichtlich zurücksetzen willst.

A:

Nutze 'git checkout other-branch -- path/to/file'. Das kopiert die Datei aus diesem Branch in dein Arbeitsverzeichnis und den Staging-Bereich. Danach kannst du sie auf deinem aktuellen Branch committen.

A:

Git schützt dich vor Arbeitsverlust. Würde der Branch-Wechsel deine Änderungen überschreiben, verweigert Git. Committe deine Änderungen, stashe sie mit 'git stash' oder erzwinge mit 'git checkout -f' (das verwirft die Änderungen).

A:

Es wechselt zum vorher ausgecheckten Branch, ähnlich wie 'cd -' in der Shell. Ein schneller Weg, zwischen zwei Branches hin und her zu springen.

A:

Fetche zuerst mit 'git fetch origin', dann entweder 'git checkout branch-name' (Git legt automatisch einen Tracking-Branch an, wenn origin/branch-name existiert) oder ausdrücklich 'git checkout --track origin/branch-name'.

A:

Ja, nutze 'git checkout -p <commit> -- <file>' für den interaktiven Modus, oder einfach 'git checkout <commit> -- <specific-files>', um nur bestimmte Dateien aus diesem Commit wiederherzustellen.

A:

Weil es zwei sehr verschiedene Dinge tut: Branches wechseln UND Dateien wiederherstellen. Git 2.23 hat 'git switch' und 'git restore' eingeführt, um diese Aufgaben zu trennen. 'git checkout' funktioniert weiterhin und ist weit verbreitet.