git stash
Die Änderungen eines geänderten Arbeitsverzeichnisses beiseitelegen
Der Befehl 'git stash' nimmt deine nicht committeten Änderungen (gestagt und ungestagt), legt sie für später beiseite und setzt deine Arbeitskopie zurück. Mit 'git stash pop' oder 'git stash apply' wendest du sie später wieder an. Stashen ist nützlich, wenn du schnell den Kontext wechseln und an etwas anderem arbeiten musst, aber mitten in einer Änderung steckst, die noch nicht committet werden kann. Der Stash ist ein Stapel, du kannst also mehrere Stashes haben.
Syntax
git stash list [<log-options>]
git stash show [-u | --include-untracked | --only-untracked] [<diff-options>] [<stash>]
git stash drop [-q | --quiet] [<stash>]
git stash pop [--index] [-q | --quiet] [<stash>]
git stash apply [--index] [-q | --quiet] [<stash>]
git stash branch <branchname> [<stash>]
git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet] [-u | --include-untracked] [-a | --all] [(-m | --message) <message>] [--] [<pathspec>...]]
git stash clearOptionen
Die richtige Option wählen
Gestashte Änderungen wiederherstellen
Den passenden Befehl wählen, um deine gestashte Arbeit zurückzuholen
| Befehl | Behält Stash? | Wirkt auf | Bei Konflikt |
|---|---|---|---|
git stash pop | Nein – nach dem Anwenden entfernt | Aktueller Branch | Stash bleibt, Konflikt lösen |
git stash apply | Ja – bleibt im Stapel | Aktueller Branch | Stash bleibt, Konflikt lösen |
git stash branch <name> | Nein – nach dem Anwenden entfernt | Neuer Branch an der Stash-Basis | Keine Konflikte (frischer Branch) |
Was wird gestasht?
Steuern, welche Dateien in deinen Stash kommen
| Befehl | Verfolgte geänderte | Gestagt | Unverfolgt | Ignorierte |
|---|---|---|---|---|
git stash | Ja | Ja | No | No |
git stash -u | Ja | Ja | Ja | No |
git stash -a | Ja | Ja | Ja | Ja |
git stash -k | Ja | Ja (und bleiben auch gestagt) | No | No |
Stash und andere Sicherungswege
Wann Stash und wann Alternativen
| Befehl | Wo es liegt | Teilbar | Am besten für |
|---|---|---|---|
git stash | Lokales Reflog | No | Schneller Kontextwechsel, vorübergehende Sicherung |
git commit (WIP) | Branch-Historie | Ja (wenn gepusht) | Arbeit, die du vielleicht teilen oder nachschlagen willst |
git worktree | Separates Verzeichnis | N/A | An mehreren Branches gleichzeitig arbeiten |
Mehrere Stashes verwalten
Befehle für den Stash-Stapel
| Befehl | Zeigt Inhalt | Ändert Stapel | Anwendungsfall |
|---|---|---|---|
git stash list | Index + Nachricht | No | Alle Stashes sehen |
git stash show | Diffstat | No | Schneller Blick auf die Änderungen |
git stash show -p | Vollständiger Diff | No | Genaue Prüfung vor dem Anwenden |
git stash drop | No | Ja (entfernt einen) | Bestimmten Stash löschen |
git stash clear | No | Ja (entfernt ALLE) | Neu anfangen (gefährlich) |
Beispiele
Aktuelle Änderungen stashen
git stashSichert alle nicht committeten Änderungen (gestagt und ungestagt) auf dem Stash-Stapel und setzt das Arbeitsverzeichnis auf HEAD zurück.
Stash mit aussagekräftiger Nachricht
git stash push -m "WIP: login feature"Stasht Änderungen mit eigener Nachricht, damit du sie bei mehreren Stashes leichter wiederfindest.
Neuesten Stash anwenden und entfernen
git stash popWendet den neuesten Stash (stash@{0}) auf dein Arbeitsverzeichnis an und entfernt ihn vom Stapel.
Alle Stashes auflisten
git stash listZeigt alle Stash-Einträge mit Index, Branch-Name und Nachricht. Nützlich bei mehreren Stashes.
Workflow-Beispiele
git stashAktuelle Änderungen in den Stash legen
git checkout other-branchAuf den anderen Branch wechseln
(do work, commit if needed)Die dringende Arbeit erledigen
git checkout original-branchZu deinem Branch zurückkehren
git stash popDie gestashten Änderungen wiederherstellen
git stash push -m "WIP: login validation"Stash mit aussagekräftiger Nachricht
(days later...)Zeit vergeht
git stash listAlle Stashes mit Nachrichten ansehen
git stash show stash@{0}Vorschau des Stash-Inhalts
git stash popAnwenden und entfernen, wenn du so weit bist
git stashDeine Änderungen stashen
git checkout branch-aAuf den ersten Branch wechseln
git stash applyAnwenden (behält den Stash)
git commit -m "Add feature"Auf branch-a committen
git checkout branch-bAuf den zweiten Branch wechseln
git stash applyDenselben Stash erneut anwenden
git stash dropDanach aufräumen
git add ready-file.jsDie fertigen Änderungen stagen
git stash -kUngestagtes stashen, Gestagtes behalten
git commit -m "Ready feature"Die gestagten Änderungen committen
git stash popDen Rest deiner Arbeit wiederherstellen
Fehlerbehebung
error: Your local changes to the following files would be overwritten by merge
Ursache: Einen Stash anwenden wollen, der mit dem aktuellen Arbeitsverzeichnis kollidiert
Committe oder stashe zuerst die aktuellen Änderungen, oder lege mit 'git stash branch <name>' aus dem Stash einen neuen Branch an
No stash entries found
Ursache: Der Stash-Stapel ist leer, oder du schaust auf den falschen Index
Führe 'git stash list' aus, um die vorhandenen Stashes zu sehen. Denk daran: stash@{0} ist der neueste.
Stash hat meine neuen Dateien nicht gesichert
Ursache: Standardmäßig sichert git stash nur verfolgte Dateien
Nutze 'git stash -u', um unverfolgte Dateien einzuschließen, oder 'git stash -a' für zusätzlich ignorierte Dateien
Falschen Stash angewendet / pop rückgängig machen
Ursache: Versehentlich den falschen Stash-Eintrag gepoppt
Ist pop an Konflikten gescheitert, ist der Stash noch da. Hat es geklappt, liegen deine Änderungen im Arbeitsverzeichnis – stashe bei Bedarf einfach erneut mit 'git stash'
Stash nach clear/drop verloren
Ursache: git stash clear/drop löscht Stash-Einträge endgültig
Versuche 'git fsck --unreachable | grep commit' und dann 'git show <hash>', um verlorene Stash-Commits zu finden. Rettung nicht garantiert.
Tipps & Stolperfallen
Best Practices
- ✓Nutze immer aussagekräftige Nachrichten mit 'git stash push -m "description"' – du wirst es dir später danken
- ✓Nutze lieber 'git stash apply' statt 'git stash pop', wenn du den Stash vielleicht noch brauchst
- ✓Nutze 'git stash -u', wenn du neue unverfolgte Dateien sichern willst
- ✓Lass keine Stashes auflaufen – räume alte regelmäßig mit 'git stash drop' auf
- ✓Für längeres Aufbewahren lieber einen WIP-Commit statt eines Stash anlegen
- ✓Nutze 'git stash show -p', um den Inhalt eines Stash vor dem Anwenden zu prüfen
- ✓Scheitert stash pop an Konflikten, bleibt der Stash erhalten – löse die Konflikte und lösche ihn dann von Hand
Häufige Fehler
- ✗Vergessen, dass 'git stash' standardmäßig nur verfolgte Dateien sichert. Nutze '-u' oder '--include-untracked', um neue unverfolgte Dateien mitzustashen.
- ✗'git stash pop' nutzen, obwohl du denselben Stash vielleicht auf mehrere Branches anwenden willst. Nutze stattdessen 'git stash apply', um den Stash zu behalten.
- ✗Stashes keine aussagekräftigen Nachrichten geben und dann vergessen, was in welchem steckt. Nutze immer 'git stash push -m "description"'.
- ✗'git stash clear' ausführen, ohne zu merken, dass es ALLE Stashes ohne Rückfrage löscht. Retten lassen sie sich nur, indem man mit 'git fsck' verwaiste Commits ausgräbt.
- ✗Die Reihenfolge des Stapels verwechseln: stash@{0} ist der NEUESTE Stash, nicht der älteste.
FAQ
Pop wendet den Stash an UND entfernt ihn vom Stapel. Apply wendet ihn nur an und lässt ihn verfügbar. Nutze apply, wenn du denselben Stash vielleicht noch woanders brauchst.
Standardmäßig sichert Stash nur verfolgte Dateien. Nutze 'git stash -u', um unverfolgte Dateien einzuschließen, oder 'git stash -a' für zusätzlich ignorierte Dateien.
Nutze 'git stash show' für eine kurze Übersicht oder 'git stash show -p' für den vollständigen Diff. Mit stash@{n} siehst du einen bestimmten Stash.
Ja! Nutze 'git stash push -m "message" -- file1.js file2.js', um nur bestimmte Dateien zu stashen, oder 'git stash -p', um Hunks interaktiv auszuwählen.
Bei Konflikten wird der Stash NICHT entfernt. Löse die Konflikte von Hand und entferne den Stash danach mit 'git stash drop'.
Stashes sind branchunabhängig. Checke einfach den Ziel-Branch aus und führe 'git stash apply' aus. Oder nutze 'git stash branch <name>', um einen neuen Branch anzulegen.