git stash
Auf dieser Seite finden Sie nützliche Informationen zum Befehl git stash, wie Sie Ihre Arbeit zwischenspeichern und mit mehreren und teilweisen Stashes arbeiten.
Was git stash macht
Der Befehl git stash legt Änderungen, die Sie an Ihrer Arbeitskopie vorgenommen haben, vorübergehend zur Seite, damit Sie an etwas anderem arbeiten können, und ermöglicht es Ihnen, diese später wieder anzuwenden. Er ist die Antwort auf eine sehr häufige Situation: Sie sind mitten in einer Änderung, wenn Sie den Branch wechseln, Updates pullen oder einen dringenden Fehler beheben müssen – aber Ihre Arbeit ist noch nicht weit genug fortgeschritten, um einen Commit zu erstellen. Anstatt einen vorläufigen Commit zu machen, speichern Sie die Änderungen zwischen, erhalten einen sauberen Arbeitsbaum, erledigen die andere Arbeit und stellen Ihre Änderungen danach wieder her.
Ein Stash wird als ein spezielles commit-ähnliches Objekt auf einem Last-In-First-Out-Stack (LIFO) gespeichert. Jeder Eintrag enthält einen Snapshot Ihrer geänderten verfolgten Dateien, und (standardmäßig) hinterlässt Git Ihr Arbeitsverzeichnis sauber, sobald der Stash erstellt wurde.

Diese Seite behandelt das Zwischenspeichern und Wiederherstellen von Änderungen, einschließlich nicht verfolgter und ignorierter Dateien, das Arbeiten mit mehreren Stashes, das Inspizieren und teilweise Zwischenspeichern von Änderungen, das Erstellen von Branches aus einem Stash sowie das Aufräumen. Für eine Auffrischung zu gestagten und nicht gestagten Änderungen, siehe git add und git status.
Ihre Arbeit zwischenspeichern
Der Befehl git stash nimmt sowohl nicht committete gestagete als auch nicht gestagete Änderungen an verfolgten Dateien, speichert sie für die spätere Verwendung und entfernt sie dann aus Ihrer Arbeitskopie. Führen Sie zunächst git status aus, um den unreinen Zustand zu sehen. Führen Sie dann git stash aus, um die Änderungen zwischenzuspeichern:
Zustand des Arbeitsbaums prüfen
git statusOn branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.htmlÄnderungen zwischenspeichern
git stashSaved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepageBestätigen, dass der Arbeitsbaum nun sauber ist
git statusOn branch master
nothing to commit, working tree cleanIhre Änderungen sind sicher gespeichert und Ihr Arbeitsverzeichnis entspricht dem letzten Commit, sodass Sie Branches wechseln oder Updates pullen können.
Ihre zwischengespeicherten Änderungen wiederherstellen
Es gibt zwei Befehle, um einen Stash wiederherzustellen, und der Unterschied ist wichtig:
git stash popwendet den neuesten Stash auf Ihre Arbeitskopie an und entfernt ihn aus der Stash-Liste.git stash applywendet die Änderungen an, behält sie aber in der Stash-Liste, was praktisch ist, wenn Sie denselben Stash auf mehr als einen Branch anwenden möchten.
Den neuesten Stash anwenden und entfernen
git stash popOn branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{0} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)Die Zeile Dropped refs/stash@{0} bestätigt, dass der Eintrag nach einem erfolgreichen Pop entfernt wurde.
Wenn das Anwenden eines Stashs Merge-Konflikte erzeugt (weil sich die zugrunde liegenden Dateien in der Zwischenzeit geändert haben), wird git stash pop den Stash nicht entfernen – er hinterlässt die Konfliktmarkierungen für Sie zur Auflösung und behält den Eintrag, damit Sie Ihre Arbeit nicht verlieren. Lösen Sie die Konflikte auf und entfernen Sie den Eintrag dann manuell mit git stash drop.
Nicht verfolgte oder ignorierte Dateien zwischenspeichern
Standardmäßig speichert git stash nur Änderungen, die Git bereits verfolgt: gestagete Änderungen und Modifikationen an verfolgten Dateien. Es werden keine brandneuen Dateien, die noch nie gestaget wurden, noch ignorierte Dateien zwischengespeichert. Um nicht verfolgte Dateien einzuschließen, verwenden Sie die Option -u (oder --include-untracked):
Nicht verfolgte Dateien einschließen
git stash -uUm ignorierte Dateien ebenfalls zwischenzuspeichern, verwenden Sie die Option -a (oder --all):
Nicht verfolgte und ignorierte Dateien einschließen
git stash -aDateien, die durch Ihre .gitignore erfasst werden, werden nur zwischengespeichert, wenn Sie -a übergeben. Verwenden Sie dies sparsam – es kann Build-Artefakte und lokale Konfigurationen miterfassen, die Sie wahrscheinlich nicht verschieben wollten.
Gestagete Änderungen mit --keep-index behalten
Wenn Sie nur Ihre gestageten Änderungen isoliert testen möchten, speichert git stash --keep-index alles zwischen, lässt aber den Inhalt des Index in Ihrem Arbeitsbaum:
Alles zwischenspeichern, aber was gestaget ist behalten
git stash --keep-indexDies ist nützlich vor einem Commit: Speichern Sie die nicht gestagete Arbeit zwischen, führen Sie Ihre Tests gegen genau das aus, was Sie committen möchten, und führen Sie dann git stash pop aus, um den Rest zurückzubringen.
Mehrere Stashes
Sie können git stash mehrmals ausführen, um mehrere Stashes zu erstellen, und dann git stash list ausführen, um sie anzuzeigen. Standardmäßig wird jeder Stash mit „WIP" – Work in Progress – zusammen mit dem Branch und dem Commit, von dem er erstellt wurde, beschriftet. Der neueste Stash ist stash@{0}; ältere haben höhere Indizes.
Stashes auflisten
git stash liststash@{0}: WIP on master: 5002d47 our new homepage
stash@{1}: WIP on master: 049d078 add navigation
stash@{2}: WIP on master: 38e3b29 initial layoutEs ist eine gute Praxis, anstelle der Standard-Beschriftung „WIP" eine beschreibende Nachricht hinzuzufügen, damit Sie Stashes später unterscheiden können:
Mit einer Nachricht zwischenspeichern
git stash push -m "wip: experimental dark theme"Standardmäßig wendet git stash pop den neuesten Stash stash@{0} wieder an. Sie können einen bestimmten Stash angeben, indem Sie seine Referenz an pop oder apply übergeben:
Einen bestimmten Stash anwenden
git stash pop stash@{2}On branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{2} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)Stash-Diffs anzeigen
Verwenden Sie git stash show, um eine Zusammenfassung der von einem Stash geänderten Dateien anzuzeigen:
Zusammenfassung eines Stashs
git stash show index.html | 1 +
style.css | 3 +++
2 files changed, 4 insertions(+)Standardmäßig zeigt git stash show den neuesten Stash. Übergeben Sie eine Referenz wie git stash show stash@{1}, um einen älteren zu inspizieren. Fügen Sie die Option -p oder --patch hinzu, um den vollständigen Diff zu sehen:
Vollständiger Diff eines Stashs
git stash show -pdiff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>Teilweise Stashes
Git ermöglicht es Ihnen, nur eine einzelne Datei, eine Gruppe von Dateien oder einzelne Änderungen innerhalb von Dateien zwischenzuspeichern. Der Befehl git stash -p (oder --patch) iteriert durch jeden Hunk – ein zusammenhängendes Stück Änderung – in der Arbeitskopie und fragt, ob Sie ihn zwischenspeichern möchten:
Ausgewählte Hunks interaktiv zwischenspeichern
git stash -pdiff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
Stash this hunk [y,n,q,a,d,/,e,?]? y
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>
Stash this hunk [y,n,q,a,d,/,e,?]? nHunk-Befehle
| Befehl | Beschreibung |
|---|---|
| / | Suche nach einem Hunk per Regex. |
| ? | Hilfe anzeigen. |
| n | Den Hunk nicht zwischenspeichern. |
| a | Diesen Hunk und alle späteren Hunks in der Datei zwischenspeichern. |
| d | Diesen Hunk und alle späteren Hunks in der Datei nicht zwischenspeichern. |
| e | Den aktuellen Hunk manuell bearbeiten. |
| q | Beenden (ausgewählte Hunks werden zwischengespeichert). |
| s | Den Hunk in kleinere Hunks aufteilen. |
| y | Den Hunk zwischenspeichern. |
Einen Branch aus einem Stash erstellen
Manchmal hat sich der Commit, von dem aus Sie gestasht haben, so weit weiterentwickelt, dass das erneute Anwenden des Stashs zu Konflikten führen würde. git stash branch löst dies, indem es einen neuen Branch vom Commit erstellt, an dem der Stash ursprünglich erstellt wurde, den Stash dort anwendet und ihn bei Erfolg entfernt:
Branch aus einem Stash erstellen
git stash branch add-stylesheet stash@{1}Switched to a new branch 'add-stylesheet'
On branch add-stylesheet
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{1} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)Den Stash aufräumen
Stashes werden nicht automatisch entfernt, sodass die Liste mit der Zeit anwachsen kann. Löschen Sie einen einzelnen Stash mit git stash drop:
Einen Stash löschen
git stash drop stash@{1}Dropped stash@{1} (17e2697fd8251df6163117cb3d58c1f62a5e7cdb)Um alle Stashes auf einmal zu löschen, verwenden Sie git stash clear:
Alle Stashes löschen
git stash cleargit stash clear und git stash drop verwerfen die zwischengespeicherten Änderungen dauerhaft, und da sie nicht Teil eines Branches sind, zeigt ein normales git log sie nicht an. Wenn Sie einen Stash versehentlich löschen, können Sie das Objekt möglicherweise noch über git reflog und git stash apply <commit-hash> wiederherstellen, bevor die Garbage Collection es entfernt.
Schnelle Befehlsreferenz
| Befehl | Was er tut |
|---|---|
git stash | Gestagete und nicht gestagete Änderungen an verfolgten Dateien zwischenspeichern. |
git stash -u | Außerdem nicht verfolgte Dateien zwischenspeichern. |
git stash -a | Außerdem nicht verfolgte und ignorierte Dateien zwischenspeichern. |
git stash --keep-index | Zwischenspeichern, aber gestagete Änderungen im Arbeitsbaum belassen. |
git stash push -m "message" | Mit einer beschreibenden Bezeichnung zwischenspeichern. |
git stash list | Alle Stashes auflisten (der neueste ist stash@{0}). |
git stash show -p | Den vollständigen Diff eines Stashs anzeigen. |
git stash pop | Den neuesten Stash anwenden und entfernen. |
git stash apply | Den neuesten Stash anwenden und behalten. |
git stash branch <name> | Einen Branch aus einem Stash erstellen und ihn anwenden. |
git stash drop / clear | Einen / alle Stashes löschen. |
Um verwandte Möglichkeiten zum Verschieben und Rückgängigmachen von Arbeit zu erfahren, siehe git reset, git restore und git checkout.