Zum Inhalt springen
Git & GitHub Anfänger 20 min

Git Stash

Lerne, wie du mit git stash unfertige Änderungen zwischenspeicherst, um schnell den Branch zu wechseln.

Aktualisiert:

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

SituationEmpfehlung
Schnell den Branch wechselngit stash
Zwischenstand sichern (laenger weg)git commit -m "wip: Zwischenstand"
Experiment ausprobierengit stash
Arbeit am Ende des Tages sicherngit 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

  1. Mache Aenderungen in einem Branch und stashe sie mit git stash
  2. Wechsle den Branch, mache dort etwas und kehre zurueck
  3. Wende den Stash mit git stash pop wieder an
  4. Erstelle mehrere Stashes und wende einen bestimmten an
  5. 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 stash speichert unfertige Aenderungen temporaer auf einem Stapel
  • git stash pop stellt den neuesten Stash wieder her und entfernt ihn
  • git stash apply stellt wieder her, behaelt aber den Stash
  • Mit -m "Beschreibung" gibst du dem Stash einen Namen
  • Mit -u werden auch neue, ungetrackte Dateien gespeichert
  • git stash list zeigt alle gespeicherten Stashes
  • git stash branch erstellt 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.

Zurück zum Git & GitHub Kurs