Back

Ein vollständiger Leitfaden zu Git Stash

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 stash speichert uncommittete Änderungen auf einem lokalen Stack und setzt Ihr Working Directory auf den Stand von HEAD zurü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 -u für untracked Files und -a für ignorierte Dateien.
  • Verwenden Sie git stash pop, wenn Sie die Änderungen zurückhaben und den Stash entfernt haben möchten, oder git stash apply, wenn Sie den Stash zur Wiederverwendung behalten möchten.
  • Wenn Konflikte beim Anwenden eines Stashes unbeherrschbar werden, erstellt git stash branch einen neuen Branch ausgehend vom ursprünglichen Commit und wendet den Stash sauber an.
  • Fügen Sie immer eine aussagekräftige Nachricht mit -m hinzu, 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 stattdessen git 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 popgit stash apply
Stellt Änderungen wieder her✅ Ja✅ Ja
Entfernt vom Stack✅ Ja (nur wenn das Apply ohne Konflikt erfolgreich ist)❌ Nein
Bei KonfliktBehält Stash im StackBehält Stash im Stack
Am besten geeignet fürEinmaliges WiederherstellenAnwenden 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

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:

  1. Führen Sie git status aus, um konfliktbehaftete Dateien zu finden.
  2. Öffnen Sie jede Datei und lösen Sie die Konfliktmarker auf.
  3. Stagen Sie die aufgelösten Dateien: git add src/api/client.js.
  4. 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 clear ist 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 mit git apply my-stash.patch anwenden.
  • 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 anonymer WIP 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 apply gegenüber pop im Zweifel. Sie können den Stash jederzeit manuell verwerfen, sobald Sie bestätigt haben, dass alles richtig aussieht.

Schnellreferenz: Git-Stash-Befehle

BefehlWas er tut
git stashStasht getrackte Änderungen (Kurzform für push)
git stash push -m "msg"Stasht mit aussagekräftiger Nachricht
git stash push -uSchließt untracked Files ein
git stash push -aSchließt untracked und ignorierte Dateien ein
git stash push -- <path>Stasht nur bestimmte Dateien
git stash push -pWählt Hunks interaktiv zum Stashen aus
git stash push --stagedStasht nur staged Änderungen
git stash push --keep-indexStasht alles, behält aber staged Änderungen im Index
git stash listListet alle Stashes auf
git stash show -p stash@{n}Zeigt den vollständigen Diff eines Stashes
git stash popWendet den letzten Stash an und entfernt ihn
git stash apply stash@{n}Wendet einen Stash an, ohne ihn zu entfernen
git stash pop --indexStellt staged/unstaged Status wieder her
git stash drop stash@{n}Löscht einen bestimmten Stash
git stash clearLö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.

OpenReplay