Git Stash
Lerne, wie du mit git stash unfertige Änderungen zwischenspeicherst, um schnell den Branch zu wechseln.
Du arbeitest gerade an einem Feature und ploetzlich kommt eine dringende Anfrage: “Kannst du schnell einen Bug auf main fixen?” Dein Code ist noch nicht fertig und du willst keinen halbfertigen Commit machen. Genau fuer solche Situationen gibt es git stash - eine Zwischenablage fuer deine unfertigen Aenderungen.
Was ist Git Stash?
git stash speichert deine aktuellen Aenderungen temporaer auf einem Stapel und setzt dein Working Directory auf den letzten Commit zurueck. So kannst du den Branch wechseln, etwas anderes erledigen und spaeter genau dort weitermachen, wo du aufgehoert hast.
Vor dem Stash: Nach dem Stash:
┌─────────────────┐ ┌─────────────────┐ ┌──────────┐
│ Working Dir │ │ Working Dir │ │ Stash │
│ (mit Aenderungen)│ ──→ │ (sauber) │ + │ (gespeichert)│
└─────────────────┘ └─────────────────┘ └──────────┘
Grundlegende Stash-Befehle
Aenderungen stashen
git stash
Saved working directory and index state WIP on feature/navigation: a3f4b2c feat: Navigation
Dein Working Directory ist jetzt sauber - als haettest du nie etwas geaendert.
Stash mit Beschreibung
git stash push -m "Navigation halb fertig - fehlt noch mobiles Menu"
Eine Beschreibung hilft dir, den Stash spaeter wiederzufinden.
Stash anzeigen
git stash list
stash@{0}: On feature/navigation: Navigation halb fertig - fehlt noch mobiles Menu
stash@{1}: WIP on main: 5c2a1b3 Initiales Projekt
Stash wiederherstellen
# Den neuesten Stash anwenden und entfernen
git stash pop
On branch feature/navigation
Changes not staged for commit:
modified: index.html
modified: style.css
Dropped refs/stash@{0} (a1b2c3d4e5f6...)
Deine Aenderungen sind zurueck!
Stash anwenden, aber behalten
# Stash anwenden, aber nicht vom Stapel entfernen
git stash apply
Das ist nuetzlich, wenn du den gleichen Stash auf mehreren Branches anwenden moechtest.
Ein typisches Szenario
Schritt 1: Du arbeitest an einem Feature
git switch feature/navigation
# ... Du programmierst das mobile Menu ...
# ... Noch nicht fertig ...
git status
On branch feature/navigation
Changes not staged for commit:
modified: index.html
modified: style.css
modified: script.js
Schritt 2: Dringender Bug-Fix noetig!
# Aenderungen zwischenspeichern
git stash push -m "Mobile Navigation in Arbeit"
# Jetzt ist alles sauber
git status
On branch feature/navigation
nothing to commit, working tree clean
Schritt 3: Bug fixen
# Zu main wechseln
git switch main
# Bug-Fix Branch erstellen
git switch -c fix/login-bug
# Bug fixen
# ... Aenderungen ...
git add auth.js
git commit -m "fix: Login-Fehler bei Sonderzeichen im Passwort behoben"
# Zurueck zu main und mergen
git switch main
git merge fix/login-bug
git branch -d fix/login-bug
Schritt 4: Zurueck zum Feature
# Zum Feature-Branch zurueckwechseln
git switch feature/navigation
# Gestashte Aenderungen wiederherstellen
git stash pop
On branch feature/navigation
Changes not staged for commit:
modified: index.html
modified: style.css
modified: script.js
Dropped refs/stash@{0}
Du bist genau da, wo du aufgehoert hast!
Fortgeschrittene Stash-Optionen
Untracked Dateien mitspeichern
Standardmaessig speichert git stash nur getrackte Dateien. Fuer neue, ungetrackte Dateien:
git stash push -u -m "Inklusive neue Dateien"
Das -u (oder --include-untracked) schliesst neue Dateien ein.
Nur bestimmte Dateien stashen
# Nur bestimmte Dateien stashen
git stash push -m "Nur CSS-Aenderungen" style.css layout.css
Einen bestimmten Stash anwenden
# Liste anzeigen
git stash list
stash@{0}: On feature/navigation: Mobile Menu
stash@{1}: On main: Experiment mit neuem Layout
stash@{2}: On feature/footer: Footer Redesign
# Bestimmten Stash anwenden
git stash apply stash@{1}
# Bestimmten Stash anwenden und entfernen
git stash pop stash@{2}
Stash-Inhalt anzeigen
# Zusammenfassung
git stash show
index.html | 12 +++++++-----
style.css | 8 ++++----
2 files changed, 11 insertions(+), 9 deletions(-)
# Detaillierter Diff
git stash show -p
diff --git a/index.html b/index.html
--- a/index.html
+++ b/index.html
@@ -8,6 +8,10 @@
+ <nav class="mobile-nav">
+ <button class="hamburger">☰</button>
+ </nav>
Einen bestimmten Stash im Detail anzeigen
git stash show -p stash@{1}
Stash verwalten
Einen Stash loeschen
# Bestimmten Stash loeschen
git stash drop stash@{1}
Dropped stash@{1} (b2c3d4e5f6a7...)
Alle Stashes loeschen
git stash clear
Vorsicht: Das loescht alle gespeicherten Stashes unwiederbringlich!
Stash auf einen neuen Branch anwenden
Wenn du merkst, dass deine gestashten Aenderungen einen eigenen Branch verdienen:
git stash branch neuer-branch-name
Das erstellt einen neuen Branch, wechselt dorthin und wendet den Stash an. Sehr praktisch!
git stash branch feature/experiment stash@{0}
Switched to a new branch 'feature/experiment'
On branch feature/experiment
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{0}
Konflikte beim Stash-Pop
Wenn sich seit dem Stash etwas geaendert hat, kann es zu Konflikten kommen:
git stash pop
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
The stash entry is kept in case you need it again.
Loesung:
# 1. Konflikte loesen (wie bei einem Merge)
# ... Datei bearbeiten ...
# 2. Geloeste Datei stagen
git add index.html
# 3. Der Stash wurde NICHT automatisch entfernt - manuell loeschen
git stash drop
Stash vs. Commit
| Situation | Empfehlung |
|---|---|
| Schnell den Branch wechseln | git stash |
| Zwischenstand sichern (laenger weg) | git commit -m "wip: Zwischenstand" |
| Experiment ausprobieren | git stash |
| Arbeit am Ende des Tages sichern | git commit + git push |
Die “WIP-Commit”-Alternative
Statt zu stashen, kannst du auch einen “Work in Progress”-Commit machen:
git add .
git commit -m "wip: Navigation noch nicht fertig"
# ... spaeter ...
# Den WIP-Commit aufloesen
git reset HEAD~1
# Deine Aenderungen sind wieder da, aber uncommitted
Uebungen
- Mache Aenderungen in einem Branch und stashe sie mit
git stash - Wechsle den Branch, mache dort etwas und kehre zurueck
- Wende den Stash mit
git stash popwieder an - Erstelle mehrere Stashes und wende einen bestimmten an
- Nutze
git stash branch, um einen Stash auf einen neuen Branch anzuwenden
Was kommt als Naechstes?
Im naechsten Kapitel lernst du die .gitignore-Datei kennen - wie du Git sagst, welche Dateien es ignorieren soll.
Zusammenfassung
git stashspeichert unfertige Aenderungen temporaer auf einem Stapelgit stash popstellt den neuesten Stash wieder her und entfernt ihngit stash applystellt wieder her, behaelt aber den Stash- Mit
-m "Beschreibung"gibst du dem Stash einen Namen - Mit
-uwerden auch neue, ungetrackte Dateien gespeichert git stash listzeigt alle gespeicherten Stashesgit stash brancherstellt einen neuen Branch aus einem Stash
Pro-Tipp: Gib deinen Stashes immer eine aussagekraeftige Beschreibung mit -m. Ohne Beschreibung steht nur “WIP on branch-name” - und nach ein paar Tagen weisst du nicht mehr, was drin steckt. Eine gute Beschreibung spart dir spaeter viel Raetselei.