git checkout
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>...Optionen
Die richtige Option wählen
Branches anlegen
Verschiedene Wege, einen neuen Branch anzulegen und zu ihm zu wechseln
| Befehl | Wenn der Branch existiert | Historie | Am besten für |
|---|---|---|---|
-b <name> | Scheitert mit Fehler | Normal (verbunden) | Normale Arbeit an einem neuen Feature |
-B <name> | Wird auf den aktuellen Commit gesetzt | Normal (verbunden) | Einen Branch neu beginnen |
--orphan <name> | Scheitert mit Fehler | Keine (unverbunden) | gh-pages, Doku, leere Seite |
Wechseln mit nicht committeten Änderungen
Was beim Branch-Wechsel mit deinen lokalen Änderungen passiert
| Befehl | Nicht committete Änderungen | Risiko | Wann verwenden |
|---|---|---|---|
git checkout <branch> | Bei Konflikt blockiert | Sicher | Standardverhalten – verhindert Unfälle |
git checkout -f <branch> | Endgültig verworfen | Gefährlich | Alle lokalen Änderungen absichtlich aufgeben |
git checkout -m <branch> | Per Drei-Wege-Merge übernommen | Mittel | Änderungen auf einen anderen Branch mitnehmen |
git stash + checkout | Für später gesichert | Sicher | Vorübergehender Kontextwechsel |
Dateien wiederherstellen
Dateiinhalte aus verschiedenen Quellen verwerfen oder wiederherstellen
| Befehl | Quelle | Betrifft Staging | Wiederherstellbar |
|---|---|---|---|
-- <file> | Index (gestagte Version) | No | Nein – Änderungen für immer verloren |
<commit> -- <file> | Bestimmter Commit | Ja (gestagt) | Nein – aber zum Prüfen gestagt |
-p -- <file> | Index (interaktiv) | No | Teilweise – Hunks wählen |
Remote-Branch-Tracking
Die Beziehung zwischen lokalen und Remote-Branches steuern
| Befehl | Richtet Tracking ein | Anwendungsfall | git push/pull |
|---|---|---|---|
--track origin/feat | Ja (automatisch) | Am Branch eines Kollegen arbeiten | Funktioniert ohne Argumente |
--no-track -b exp origin/main | Nein (unabhängig) | Gefahrlos experimentieren | Remote muss angegeben werden |
<remote-branch> | Ja (wenn eindeutig) | Schnell einen Remote-Branch auschecken | Funktioniert ohne Argumente |
Merge-Konflikte lösen
Bei Merge-Konflikten eine Seite wählen
| Befehl | Behält | Verwirft | Wann verwenden |
|---|---|---|---|
--ours <file> | Die Version deines Branches | Eingehende Änderungen | Deine Änderungen sind richtig |
--theirs <file> | Eingehende Version | Deine Änderungen | Ihre Umsetzung übernehmen |
(manual edit) | Kombiniertes Ergebnis | Nichts | Teile von beiden Seiten nötig |
checkout und die modernen Befehle
Git 2.23+ hat checkout in gezielte Befehle aufgeteilt
| Befehl | Wechselt Branches | Stellt Dateien wieder her | Empfohlen für |
|---|---|---|---|
git checkout | Ja | Ja | Gewohnheit, ältere Git-Versionen |
git switch | Ja | No | Klare Absicht: nur Branch-Operationen |
git restore | No | Ja | Klare Absicht: nur Datei-Operationen |
Workflow-Beispiele
git stashAktuelle nicht committete Arbeit sichern
git checkout other-branchAuf den anderen Branch wechseln
(review or make quick fix)Die nötige Arbeit auf diesem Branch erledigen
git checkout -Zurück zum vorherigen Branch (Abkürzung)
git stash popDie gesicherte Arbeit wiederherstellen
git checkout mainAuf den Branch main wechseln
git pull origin mainDie neuesten Änderungen vom Remote holen
git checkout -b feature-nameNeuen Feature-Branch anlegen und dorthin wechseln
(make changes and commits)Am Feature arbeiten
git push -u origin feature-nameBranch pushen und Tracking einrichten
git statusSehen, welche Dateien geändert wurden
git diff file.jsDie Änderungen prüfen, die du verwerfen wirst
git checkout -- file.jsÄnderungen an einer bestimmten Datei verwerfen
git checkout -- .Oder ALLE ungestagten Änderungen an verfolgten Dateien verwerfen
git log --onelineDen benötigten Commit-Hash finden
git checkout <commit-hash>Genau diesen Commit auschecken (Detached HEAD)
(inspect, test, or debug)Den alten Code untersuchen
git checkout mainDanach zum Branch main zurückkehren
git log --oneline -- file.jsCommits finden, die diese Datei geändert haben
git show <commit>:file.jsVorschau der alten Version
git checkout <commit> -- file.jsDatei aus diesem Commit wiederherstellen (wird gestagt)
git commit -m 'Restore file.js'Die wiederhergestellte Version committen
git fetch originDie neuesten Infos zu Remote-Branches holen
git branch -rVerfügbare Remote-Branches anzeigen
git checkout --track origin/featureLokalen Branch anlegen, der dem Remote folgt
git pullJetzt 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 poperror: 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-nameYou 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-nameIm 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 branchMit 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-nameTipps & 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
'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.
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.
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.
'-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.
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.
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).
Es wechselt zum vorher ausgecheckten Branch, ähnlich wie 'cd -' in der Shell. Ein schneller Weg, zwischen zwei Branches hin und her zu springen.
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'.
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.
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.