W3docs

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.

stash

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 status
On branch master
Changes to be committed:
  new file:   style.css
Changes not staged for commit:
  modified:   index.html

Änderungen zwischenspeichern

git stash
Saved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepage

Bestätigen, dass der Arbeitsbaum nun sauber ist

git status
On branch master
nothing to commit, working tree clean

Ihre Ä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 pop wendet den neuesten Stash auf Ihre Arbeitskopie an und entfernt ihn aus der Stash-Liste.
  • git stash apply wendet 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 pop
On 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.

Hinweis

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 -u

Um ignorierte Dateien ebenfalls zwischenzuspeichern, verwenden Sie die Option -a (oder --all):

Nicht verfolgte und ignorierte Dateien einschließen

git stash -a

Dateien, 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-index

Dies 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 list
stash@{0}: WIP on master: 5002d47 our new homepage
stash@{1}: WIP on master: 049d078 add navigation
stash@{2}: WIP on master: 38e3b29 initial layout

Es 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 -p
diff --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 -p
diff --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,?]? n

Hunk-Befehle

BefehlBeschreibung
/Suche nach einem Hunk per Regex.
?Hilfe anzeigen.
nDen Hunk nicht zwischenspeichern.
aDiesen Hunk und alle späteren Hunks in der Datei zwischenspeichern.
dDiesen Hunk und alle späteren Hunks in der Datei nicht zwischenspeichern.
eDen aktuellen Hunk manuell bearbeiten.
qBeenden (ausgewählte Hunks werden zwischengespeichert).
sDen Hunk in kleinere Hunks aufteilen.
yDen 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 clear
Warnung

git 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

BefehlWas er tut
git stashGestagete und nicht gestagete Änderungen an verfolgten Dateien zwischenspeichern.
git stash -uAußerdem nicht verfolgte Dateien zwischenspeichern.
git stash -aAußerdem nicht verfolgte und ignorierte Dateien zwischenspeichern.
git stash --keep-indexZwischenspeichern, aber gestagete Änderungen im Arbeitsbaum belassen.
git stash push -m "message"Mit einer beschreibenden Bezeichnung zwischenspeichern.
git stash listAlle Stashes auflisten (der neueste ist stash@{0}).
git stash show -pDen vollständigen Diff eines Stashs anzeigen.
git stash popDen neuesten Stash anwenden und entfernen.
git stash applyDen neuesten Stash anwenden und behalten.
git stash branch <name>Einen Branch aus einem Stash erstellen und ihn anwenden.
git stash drop / clearEinen / 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.

Übungen

Übung
Was sind die Funktionen und Möglichkeiten des Befehls 'git stash'?
Was sind die Funktionen und Möglichkeiten des Befehls 'git stash'?
Was this page helpful?