← Zurück zum Blog

Git stash erklärt: save, apply, pop und drop

tutorial git

Was ist Git Stash?

Sie sind mitten in der Entwicklung eines Features, als etwas Dringendes auftaucht. Ein Bug muss auf dem Haupt-Branch behoben werden, oder ein Kollege braucht Sie für ein Code-Review seiner Pull Request. Sie sind noch nicht bereit, Ihre laufende Arbeit zu committen, aber Sie können nicht die Branch wechseln, wenn uncommittete Änderungen Ihr Arbeitsverzeichnis belegen. Genau dieses Problem wurde git stash entwickelt zu lösen.

Git stash nimmt Ihre uncommitteten Änderungen -- sowohl im Staging befindliche als auch nicht im Staging befindliche -- und speichert sie in einem temporären Speicherbereich. Ihr Arbeitsverzeichnis kehrt in einen sauberen Zustand zurück, der dem letzten Commit entspricht. Wenn Sie bereit sind, können Sie diese Änderungen zurückholen. Stellen Sie es sich so vor, als würden Sie Ihre Arbeit auf ein Regal legen, um sich um etwas anderes zu kümmern, und sie dann genau dort wieder aufnehmen, wo Sie aufgehört haben.

Grundlegende Verwendung: Stash, Apply und Pop

Änderungen im Stash speichern

Die einfachste Form ist:

git stash

Dies nimmt alle verfolgten, modifizierten und im Staging befindlichen Dateien und speichert sie. Ihr Arbeitsverzeichnis wird sauber. Beachten Sie, dass unverfolgte Dateien (Dateien, die Sie nie zu Git hinzugefügt haben) standardmäßig nicht gestasht werden. Um sie einzuschließen, verwenden Sie:

git stash -u

Oder um alles einzuschließen, auch ignorierte Dateien:

git stash -a

Änderungen mit apply zurückholen

Wenn Sie Ihre Nebenaufgabe erledigt haben und Ihre gestashte Arbeit zurück möchten, verwenden Sie:

git stash apply

Dies stellt die gestashten Änderungen in Ihrem Arbeitsverzeichnis wieder her, behält aber den Stash-Eintrag bei. Der Stash bleibt auf dem Regal, was nützlich sein kann, wenn Sie die gleichen Änderungen auf mehrere Branches anwenden möchten.

Änderungen mit pop zurückholen

git stash pop

Pop funktioniert wie apply, entfernt aber auch den Stash-Eintrag nach dem Anwenden. Dies ist die häufigere Wahl, wenn Sie einfach Ihre Arbeit zurück möchten und den Stash nicht aufbewahren müssen.

Der wesentliche Unterschied: apply behält den Stash, pop löscht ihn nach der Wiederherstellung. Verwenden Sie apply, wenn Sie den Stash möglicherweise erneut benötigen. Verwenden Sie pop, wenn Sie damit fertig sind.

Einen Nachricht zu Ihrem Stash hinzufügen

Standardmäßig beschriftet Git Stashes mit einer automatisch generierten Beschreibung wie WIP on main: a3b4c5d commit message. Das ist nicht sehr hilfreich, wenn Sie mehrere Stashes haben. Sie können eine beschreibende Nachricht hinzufügen:

git stash push -m "refactoring the auth module"

Dies erleichtert es erheblich, den Inhalt jedes Stashes zu identifizieren, wenn Sie sie später auflisten.

Mehrere Stashes verwalten

Ihre Stashes auflisten

Git verwaltet einen Stapel von Stashes. Sie können alle mit folgendem Befehl anzeigen:

git stash list

Die Ausgabe sieht etwa so aus:

stash@{0}: On main: refactoring the auth module
stash@{1}: WIP on feature/checkout: 9f2e1d0 add cart logic
stash@{2}: WIP on main: 7c8d9e1 update dependencies

Der neueste Stash ist immer stash@{0}. Jeder neue Stash schiebt die älteren im Stapel nach unten.

Einen bestimmten Stash anwenden oder poppen

Standardmäßig arbeiten apply und pop mit dem neuesten Stash. Um einen bestimmten anzusprechen, referenzieren Sie ihn über seinen Index:

git stash apply stash@{2}
git stash pop stash@{1}

Den Inhalt eines Stash anzeigen

Bevor Sie einen Stash anwenden, möchten Sie vielleicht sehen, was darin enthalten ist:

git stash show stash@{0}

Dies zeigt eine Zusammenfassung der geänderten Dateien. Für den vollständigen Diff fügen Sie -p hinzu:

git stash show -p stash@{0}

Bestimmte Dateien stashen

Manchmal möchten Sie nicht alles stashen. Vielleicht möchten Sie nur die Änderungen in ein oder zwei Dateien beiseitelegen. Seit Git 2.13 können Sie dies so tun:

git stash push -m "sidebar layout changes" src/components/Sidebar.tsx src/styles/sidebar.css

Nur die angegebenen Dateien werden gestasht. Alles andere bleibt in Ihrem Arbeitsverzeichnis.

Stashes löschen und bereinigen

Einen einzelnen Stash löschen

Wenn Sie einen bestimmten Stash nicht mehr benötigen, entfernen Sie ihn mit:

git stash drop stash@{1}

Dies löscht diesen Stash-Eintrag. Die verbleibenden Stashes werden automatisch neu indiziert.

Alle Stashes löschen

Um alle Stashes auf einmal zu entfernen:

git stash clear

Seien Sie vorsichtig damit. Es gibt kein Rückgängigmachen. Alle gestashten Änderungen werden dauerhaft gelöscht.

Eine Branch aus einem Stash erstellen

Manchmal stashen Sie Änderungen und stellen dann fest, dass sie eine eigene Branch verdienen. Anstatt den Stash anzuwenden und dann eine Branch zu erstellen, bietet Git eine Abkürzung:

git stash branch new-feature-branch stash@{0}

Dies erstellt eine neue Branch ausgehend vom Commit, bei dem der Stash ursprünglich erstellt wurde, wendet den Stash an und löscht ihn. Es ist besonders nützlich, wenn das Anwenden des Stash auf Ihre aktuelle Branch Konflikte verursachen würde.

Häufige Fallstricke

  • Stashes vergessen. Stashes werden leicht vergessen. Führen Sie regelmäßig git stash list aus, um zu prüfen, ob Sie übrig gebliebene Stashes haben, die angewendet oder gelöscht werden sollten.
  • Stash-Konflikte. Wenn sich der Code seit dem Stashen erheblich geändert hat, kann das Anwenden des Stash Merge-Konflikte erzeugen. Lösen Sie diese auf die gleiche Weise wie jeden anderen Merge-Konflikt.
  • Stash statt Commits verwenden. Wenn Sie häufig stashen, erwägen Sie stattdessen, Ihre laufende Arbeit zu committen. Sie können diese Commits später jederzeit mit amend oder squash überarbeiten. Stash ist am besten für schnelle, kurzlebige Kontextwechsel geeignet, nicht für die Langzeitspeicherung.

Mit Stashes in GitSquid arbeiten

GitSquid zeigt Stashes direkt im Commit-Graphen an, sodass Sie auf einen Blick sehen können, welche Stashes existieren und von welchem Commit sie erstellt wurden. Ein Rechtsklick auf einen Stash öffnet ein Kontextmenü mit Optionen zum Anwenden, Poppen, Löschen oder Bereinigen aller Stashes. Das macht die Verwaltung von Stashes schneller als das Eingeben von Befehlen, besonders wenn Sie mehrere Stashes haben und diese inspizieren oder aufräumen müssen.

Kurzreferenz

Befehl Was er macht
git stash Verfolgte Änderungen stashen
git stash -u Stash einschließlich unverfolgter Dateien
git stash push -m "msg" Stash mit beschreibender Nachricht
git stash list Alle Stashes auflisten
git stash apply Stash wiederherstellen, Eintrag behalten
git stash pop Stash wiederherstellen, Eintrag löschen
git stash drop stash@{n} Einen bestimmten Stash löschen
git stash clear Alle Stashes löschen
git stash show -p Den vollständigen Diff eines Stash anzeigen
git stash branch <name> Eine Branch aus einem Stash erstellen

Git stash ist eines dieser Werkzeuge, die unwichtig erscheinen, bis man sie braucht. Sobald Sie sich damit vertraut gemacht haben, wird der Kontextwechsel zwischen Aufgaben nahtlos. Halten Sie Ihre Stashes mit Nachrichten organisiert, räumen Sie alte regelmäßig auf, und verwenden Sie pop statt apply, wenn Sie den Stash nicht aufbewahren müssen.