Git Stash¶
Kurzdefinition¶
git stash speichert nicht-committete Änderungen (Working Directory und optional Staging Area) temporär in einem internen Stack und stellt den Arbeitszustand auf den letzten Commit zurück.
Es dient dazu, unfertige Arbeit zwischenzuspeichern, ohne einen Commit erstellen zu müssen.
1. Ausgangssituation¶
Typischer Ablauf:
mkdir git
cd git
touch file1.txt
git init
git add file1.txt
git commit -m "file1 added"
Ergebnis:
- Ein Repository wurde initialisiert.
- Ein erster Commit existiert.
- Wir befinden uns auf dem Branch
master(bzw.main, je nach Git-Version). - Working Directory ist sauber.
2. Problemstellung¶
Angenommen:
- Du arbeitest direkt auf
master - Du änderst Dateien
- Die Änderungen sind noch nicht commit-reif
- Plötzlich musst du:
- den Branch wechseln
- auf den letzten Commit zurück
- einen Hotfix machen
- oder den Code in einem sauberen Zustand testen
❗ Was du NICHT willst¶
- Keinen „dirty commit“ erstellen
- Keine halbfertige Arbeit verlieren
- Kein kompliziertes Reset-Branch-Konstrukt bauen
3. Lösung: git stash¶
git stash speichert deine lokalen Änderungen in einem internen Stack und setzt dein Arbeitsverzeichnis auf den letzten Commit zurück.
4. Was genau wird gespeichert?¶
Standardmäßig:
- Änderungen im Working Directory
- Änderungen in der Staging Area
Nicht gespeichert werden:
- Untracked Files (außer mit
-u) - Ignorierte Dateien (außer mit
-a)
5. Grundlegende Befehle¶
Änderungen stashen¶
git stash
Alternative mit Nachricht:
git stash push -m "WIP: Feature X"
Stashes anzeigen¶
git stash list
Beispielausgabe:
stash@{0}: On master: WIP: Feature X
stash@{1}: On master: experiment
→ stash@{0} ist immer der neueste Eintrag (Stack-Prinzip).
Stash wiederherstellen (behalten)¶
git stash apply
oder gezielt:
git stash apply stash@{1}
Stash anwenden und löschen¶
git stash pop
→ apply + automatisches Entfernen aus dem Stack.
Stash löschen¶
Einzelner Eintrag:
git stash drop stash@{0}
Alle löschen:
git stash clear
6. Interne Funktionsweise (Konzept)¶
Mermaid-Darstellung:
flowchart LR
A[Letzter Commit] --> B[Uncommitted Changes]
B --> C[git stash]
C --> D[Stash Stack]
C --> E[Working Directory clean]
Wichtige Punkte:
- Der Stash ist kein Branch
- Der Stash ist kein Ersatz für Commits
- Intern erstellt Git versteckte Commit-Objekte
- Stashes liegen in einem Stack (LIFO-Prinzip)
7. Praktisches Beispiel¶
Schritt 1: Datei verändern¶
echo "Neue Zeile" >> file1.txt
Status prüfen:
git status
→ Datei ist modified.
Schritt 2: Änderungen stashen¶
git stash
Jetzt:
git status
→ Working Directory ist sauber.
Schritt 3: Später wiederherstellen¶
git stash pop
→ Änderungen sind wieder da.
8. Erweiterte Optionen¶
Untracked Files mit speichern¶
git stash -u
Auch ignorierte Dateien speichern¶
git stash -a
9. Examensrelevanz (IHK / FIAE)¶
Prüfungsrelevante Aspekte:
- Unterschied zwischen Commit und Stash
- Verhalten bei Branch-Wechsel
- Stack-Prinzip verstehen
- Unterschied zwischen
applyundpop - Umgang mit untracked Dateien
Typische Prüfungsfrage:
Warum sollte man
git stashverwenden, anstatt einen Commit zu erstellen?
Antwort:
- Vermeidung unsauberer Zwischen-Commits
- Temporäres Parken unfertiger Arbeit
- Schneller Kontextwechsel
10. Typische Fehler und Missverständnisse¶
❌ „Stash ist wie ein Backup“¶
Nein.
Stashes sind temporär gedacht und können gelöscht werden.
❌ „Stash ersetzt Branches“¶
Nein.
Feature-Branches bleiben Best Practice.
❌ „Stash speichert automatisch alles“¶
Nein.
Untracked und ignorierte Dateien nur mit -u oder -a.
❌ Konflikte beim Anwenden¶
Wenn sich der Code seit dem Stash verändert hat, können Merge-Konflikte entstehen.
11. Einordnung im Git-Gesamtbild¶
| Mechanismus | Zweck | Dauerhaft? |
|---|---|---|
| Commit | Versionierung | Ja |
| Branch | Parallele Entwicklung | Ja |
| Stash | Temporäres Parken | Nein |
Kerngedanke¶
git stash ist ein Werkzeug für Kontextwechsel.
Es ermöglicht:
- sauberes Arbeiten
- keine unfertigen Commits
- schnelles Umschalten zwischen Aufgaben
Aber:
Für echte Feature-Entwicklung bleibt der Branch das richtige Mittel.