Ein vollständiger Leitfaden zu Git Stash
Sie stecken mitten in einem Feature, tief in einem Refactoring, als ein Teamkollege Sie wegen eines kritischen Bugs in der Produktion anspricht. Ihr Working Directory ist ein Chaos aus halbfertigen Änderungen. Sie sind noch nicht bereit zum Committen, können aber auch nicht den Branch wechseln, solange uncommittete Arbeit herumliegt.
Genau dafür ist git stash da. Dieser Leitfaden behandelt jeden git-stash-Befehl, den Sie wirklich brauchen werden, wie Sie mit Konflikten umgehen und die Workflow-Tipps, die das Stashen natürlich statt riskant wirken lassen.
Wichtige Erkenntnisse
git stashspeichert uncommittete Änderungen auf einem lokalen Stack und setzt Ihr Working Directory auf den Stand vonHEADzurück, sodass Sie den Kontext wechseln können, ohne halbfertige Arbeit committen zu müssen.- Standardmäßig enthalten Stashes nur Änderungen an getrackten Dateien. Verwenden Sie
-ufür untracked Files und-afür ignorierte Dateien. - Verwenden Sie
git stash pop, wenn Sie die Änderungen zurückhaben und den Stash entfernt haben möchten, odergit stash apply, wenn Sie den Stash zur Wiederverwendung behalten möchten. - Wenn Konflikte beim Anwenden eines Stashes unbeherrschbar werden, erstellt
git stash brancheinen neuen Branch ausgehend vom ursprünglichen Commit und wendet den Stash sauber an. - Fügen Sie immer eine aussagekräftige Nachricht mit
-mhinzu, halten Sie Ihre Stash-Liste kurz und betrachten Sie Stashes als temporären Speicher, nicht als Backups.
Was ist Git Stash?
git stash speichert Ihre uncommitteten Änderungen – sowohl staged als auch unstaged – auf einem lokalen Stack und setzt Ihr Working Directory auf den letzten Commit (HEAD) zurück. Sie können diese Änderungen später wiederherstellen, auf demselben Branch oder einem anderen.
Stashes sind nur lokal. Sie werden mit git push nicht an Ihr Remote gepusht und nicht mit Teamkollegen geteilt.
Was standardmäßig gestasht wird:
- Staged Changes (Index)
- Unstaged Changes an getrackten Dateien
Was standardmäßig NICHT gestasht wird:
- Untracked Files (neue Dateien, die noch nicht zu Git hinzugefügt wurden)
- Ignorierte Dateien
Die wichtigsten Git-Stash-Befehle
Änderungen mit git stash push speichern
git stash
Das einfache git stash ist eine Kurzform für git stash push. Es ist der schnellste Weg zu einem sauberen Working Directory.
Fügen Sie eine aussagekräftige Nachricht hinzu, damit Sie später wissen, was darin enthalten ist:
git stash push -m "WIP: refactor auth middleware"
Hinweis: Die ältere
git stash save-Syntax ist veraltet. Verwenden Sie stattdessengit stash push.
Untracked Files stashen
Standardmäßig bleiben neue Dateien, die Sie noch nicht gestaged haben, zurück. Verwenden Sie -u, um sie einzuschließen:
git stash push -u -m "WIP: new login component"
Um auch Dateien zu stashen, die von .gitignore erfasst werden, verwenden Sie -a (--all). Das wird selten gebraucht, ist aber nützlich, wenn ignorierte Dateien bei einem Branch-Wechsel oder Build stören würden.
Bestimmte Dateien stashen
Sie können mit einer Pathspec nur bestimmte Dateien stashen:
git stash push -m "WIP: api changes" -- src/api/client.js src/api/utils.js
Alles andere in Ihrem Working Directory bleibt unangetastet.
Ihre Stashes auflisten
git stash list
Ausgabe:
stash@{0}: On main: WIP: refactor auth middleware
stash@{1}: WIP on feature/login: 9ab3c12 Add login form
Stashes werden in einem Last-in-First-out-Stack (LIFO) gespeichert. stash@{0} ist immer der aktuellste.
Einen Stash vor dem Anwenden inspizieren
git stash show stash@{0} # Übersicht
git stash show -p stash@{0} # vollständiger Diff
Git Stash Pop vs. Apply: Welches sollten Sie verwenden?
Das ist einer der häufigsten Verwirrungspunkte bei git-stash-Befehlen.
git stash pop | git stash apply | |
|---|---|---|
| Stellt Änderungen wieder her | ✅ Ja | ✅ Ja |
| Entfernt vom Stack | ✅ Ja (nur wenn das Apply ohne Konflikt erfolgreich ist) | ❌ Nein |
| Bei Konflikt | Behält Stash im Stack | Behält Stash im Stack |
| Am besten geeignet für | Einmaliges Wiederherstellen | Anwenden auf mehrere Branches |
Verwenden Sie pop, wenn Sie mit dem Stash fertig sind und einfach nur Ihre Änderungen zurückhaben möchten.
Verwenden Sie apply, wenn Sie denselben Stash auf mehrere Branches anwenden möchten oder wenn Sie das Ergebnis testen möchten, bevor Sie den Stash endgültig entfernen.
Um einen bestimmten Stash anzuwenden:
git stash pop stash@{1}
git stash apply stash@{1}
Staged-Status mit --index wiederherstellen
Standardmäßig stellt das Anwenden eines Stashes alle Änderungen als unstaged wieder her. Wenn Sie die Unterscheidung zwischen staged und unstaged so wiederherstellen möchten, wie sie beim Stashen war, verwenden Sie --index:
git stash pop --index
Discover how at OpenReplay.com.
Konflikte beim Anwenden eines Stashes auflösen
Wenn sich der Branch seit dem Stashen geändert hat, können Konflikte auftreten:
CONFLICT (content): Merge conflict in src/api/client.js
The stash entry is kept in case you need it again.
Sowohl pop als auch apply behalten den Stash bei Konflikten im Stack. So lösen Sie sie auf:
- Führen Sie
git statusaus, um konfliktbehaftete Dateien zu finden. - Öffnen Sie jede Datei und lösen Sie die Konfliktmarker auf.
- Stagen Sie die aufgelösten Dateien:
git add src/api/client.js. - Verwerfen Sie den Stash manuell, sobald Sie zufrieden sind:
git stash drop stash@{0}.
Wenn Konflikte chaotisch werden: git stash branch verwenden
Wenn die Konflikte zu verworren sind, ist git stash branch der sauberste Ausweg. Es erstellt einen neuen Branch ausgehend von genau dem Commit, an dem Sie gestasht haben, und wendet den Stash dort an. Da der Branch von dem Commit ausgeht, an dem der Stash erstellt wurde, vermeidet dies oft Konflikte:
git stash branch fix/auth-refactor stash@{0}
Wenn das Apply erfolgreich ist, wird der Stash automatisch verworfen.
Stashes verwalten und aufräumen
git stash drop stash@{0} # einen bestimmten Stash entfernen
git stash clear # ALLE Stashes entfernen (unwiderruflich)
⚠️
git stash clearist endgültig. Es gibt kein Undo. Prüfen Sie zweimal, bevor Sie es ausführen.
Fortgeschritten: Teilweises Stashen und nur staged Änderungen stashen
Im interaktiven Patch-Modus können Sie auswählen, welche Hunks gestasht werden sollen:
git stash push -p
Git führt Sie durch jede Änderung und fragt, ob sie gestasht werden soll. Nützlich, wenn eine Datei sowohl zusammengehörige als auch unabhängige Änderungen enthält.
Nur staged Änderungen stashen (Git 2.35 und neuer):
git stash push --staged
Dies stasht, was sich in Ihrem Index befindet, und lässt unstaged Arbeit an Ort und Stelle – praktisch, um eine Änderung zu isolieren, die Sie beiseitelegen möchten, ohne Ihren aktuellen Fortschritt zu verlieren.
Staged Änderungen im Index behalten, während alles andere gestasht wird:
git stash push --keep-index
Beachten Sie, dass --keep-index weiterhin sowohl staged als auch unstaged Änderungen stasht; die staged Änderungen werden lediglich nach dem Stashen in Ihrem Working Directory belassen.
Einen gelöschten Git Stash wiederherstellen
Wenn Sie versehentlich Stashes droppen oder clearen, sind sie möglicherweise immer noch als dangling Commits in Ihrem Repository wiederherstellbar. Stash-Einträge werden als Merge-Commits gespeichert, sodass Sie sie suchen können mit:
git fsck --unreachable | grep commit | cut -d' ' -f3 | xargs git log --merges --no-walk --grep=WIP
Dies listet unerreichbare Merge-Commits auf, die wie Stash-Einträge aussehen. Sobald Sie den gewünschten Commit-Hash gefunden haben, stellen Sie ihn wieder her mit:
git stash apply <commit-hash>
Eine Wiederherstellung ist nicht garantiert – Gits Garbage Collector wird unerreichbare Objekte irgendwann bereinigen – handeln Sie also schnell.
Stashes zwischen Maschinen übertragen
Neuere Git-Versionen haben git stash export und git stash import hinzugefügt, mit denen Stashes über normale Fetch- und Push-Workflows übertragen werden können.
Für ältere Git-Versionen oder für einfache einmalige Übertragungen gibt es weiterhin praktische Alternativen:
- Als Patch exportieren:
git stash show -p stash@{0} > my-stash.patch, dann anderswo mitgit apply my-stash.patchanwenden. - Auf einen Wegwerf-Branch committen: Branch erstellen, Arbeit committen, an ein Remote pushen, dann auf der anderen Maschine pullen und resetten.
Patches sind in der Regel der einfachste Weg für einmalige Übertragungen.
Best Practices für Git Stash
- Fügen Sie immer eine Nachricht hinzu.
git stash push -m "WIP: was und warum"erspart Ihnen, eine Liste anonymerWIP on main-Einträge anzustarren. - Stash ist temporärer Speicher, kein Backup. Committen Sie Ihre Arbeit, wenn sie einen logischen Checkpoint erreicht.
- Halten Sie Ihre Stash-Liste kurz. Überprüfen Sie sie regelmäßig und verwerfen Sie Stashes, die Sie nicht mehr brauchen.
- Pullen Sie vor dem Poppen. Den Branch zu aktualisieren, bevor Sie einen Stash wiederherstellen, reduziert die Wahrscheinlichkeit von Konflikten.
- Bevorzugen Sie
applygegenüberpopim Zweifel. Sie können den Stash jederzeit manuell verwerfen, sobald Sie bestätigt haben, dass alles richtig aussieht.
Schnellreferenz: Git-Stash-Befehle
| Befehl | Was er tut |
|---|---|
git stash | Stasht getrackte Änderungen (Kurzform für push) |
git stash push -m "msg" | Stasht mit aussagekräftiger Nachricht |
git stash push -u | Schließt untracked Files ein |
git stash push -a | Schließt untracked und ignorierte Dateien ein |
git stash push -- <path> | Stasht nur bestimmte Dateien |
git stash push -p | Wählt Hunks interaktiv zum Stashen aus |
git stash push --staged | Stasht nur staged Änderungen |
git stash push --keep-index | Stasht alles, behält aber staged Änderungen im Index |
git stash list | Listet alle Stashes auf |
git stash show -p stash@{n} | Zeigt den vollständigen Diff eines Stashes |
git stash pop | Wendet den letzten Stash an und entfernt ihn |
git stash apply stash@{n} | Wendet einen Stash an, ohne ihn zu entfernen |
git stash pop --index | Stellt staged/unstaged Status wieder her |
git stash drop stash@{n} | Löscht einen bestimmten Stash |
git stash clear | Löscht alle Stashes |
git stash branch <name> [stash] | Erstellt einen Branch aus einem Stash |
Fazit
git stash ist einer dieser Befehle, der optional wirkt, bis Sie ihn wirklich brauchen – und dann wird er Teil Ihres täglichen Workflows. Die wichtigsten Gewohnheiten: Benennen Sie Ihre Stashes immer, halten Sie die Liste sauber und greifen Sie zu git stash branch, wenn Konflikte ein einfaches Pop unpraktisch machen. Gut genutzt, hält das Stashen Ihre Git-Historie sauber und Ihre Kontextwechsel schmerzlos.
FAQs
Nein. Standardmäßig speichert git stash nur getrackte Änderungen – sowohl staged als auch unstaged Modifikationen an Dateien, die Git bereits kennt. Neue Dateien, die noch nicht mit git add hinzugefügt wurden, bleiben in Ihrem Working Directory. Um sie einzuschließen, verwenden Sie git stash push -u oder --include-untracked. Um auch Dateien zu stashen, die von .gitignore erfasst werden, verwenden Sie -a oder --all.
Beide stellen Ihre gestashten Änderungen im Working Directory wieder her. Der Unterschied liegt darin, was danach passiert. git stash pop entfernt den Stash vom Stack, sobald er sauber angewendet wurde, während git stash apply ihn an Ort und Stelle belässt, sodass Sie ihn später oder auf einem anderen Branch erneut anwenden können. Wenn beim Pop ein Konflikt auftritt, wird der Stash beibehalten, damit Sie Ihre Arbeit nicht verlieren.
Oft ja, wenn Sie schnell handeln. Stash-Einträge werden als Merge-Commits gespeichert, und gedropte Stashes werden zu unerreichbaren Objekten, die Gits Garbage Collector irgendwann bereinigt. Führen Sie git fsck --unreachable aus, um dangling Commits zu finden, identifizieren Sie den Stash anhand seiner WIP-Nachricht und stellen Sie ihn dann mit git stash apply gefolgt vom Commit-Hash wieder her.
Nein. Stashes sind streng lokal und leben in der refs/stash-Referenz Ihres Repositories. Sie werden nie in git push, git fetch oder git pull eingeschlossen. Wenn Sie laufende Arbeit mit einem Teamkollegen teilen müssen, committen Sie sie auf einen temporären Branch und pushen Sie diesen Branch, oder exportieren Sie die Änderungen als Patch mit git stash show -p.
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.