HOWTO · Git

Git Stash rückgängig machen

In diesem Artikel erfahren Sie, wie Sie Änderungen an Ihrem Repository vornehmen und speichern. Mit Git können Sie Änderungen lokal speichern und bei Bedarf auf einen Server übertragen.

Auf dieser Seite

Ein Git-Stash speichert nicht festgeschriebene Änderungen, damit Sie zu einem sauberen Arbeitsverzeichnis zurückkehren können. Um die gespeicherte Arbeit wiederherzustellen, wählen Sie zwischen git stash pop, das den neuesten Stash anwendet und dessen Eintrag nach erfolgreicher Anwendung entfernt, und git stash apply, das ihn anwendet und den Eintrag beibehält. Möchten Sie einen Stash erst entfernen, nachdem Sie die wiederhergestellten Dateien geprüft haben, wenden Sie ihn zuerst an und entfernen Sie ihn anschließend. In den folgenden Beispielen bezeichnet stash@{n} einen bestimmten Eintrag in der Stash-Liste.

Wählen Sie den Befehl, der zu Ihrem Vorhaben passt

Mit git stash list zeigen Sie gespeicherte Einträge an. Der neueste ist normalerweise stash@{0}, gefolgt von stash@{1} und älteren Einträgen. Lesen Sie vor der Auswahl die Beschreibungen der Einträge. Die Nummer bezeichnet die Position in der aktuellen Liste und kann sich ändern, wenn ein Eintrag hinzugefügt oder entfernt wird.

  • Den neuesten Eintrag wiederherstellen und nach erfolgreicher Anwendung entfernen: git stash pop.
  • Einen Eintrag wiederherstellen und weiterhin verfügbar halten: git stash apply.
  • Einen Eintrag entfernen, ohne ihn anzuwenden: git stash drop.

Ein Stash enthält gespeicherte Änderungen an der Arbeitskopie und ist kein neuer Commit auf Ihrem Branch. Standardmäßig stellt das Anwenden eines Stashs dessen Änderungen im Arbeitsverzeichnis wieder her, nicht jedoch den ursprünglichen Zustand des Index. Mit git stash apply --index können Sie versuchen, auch den Index wiederherzustellen. Prüfen Sie anschließend mit git status, was wiederhergestellt wurde. Wenn Sie nicht sicher sind, ob Sie den gespeicherten Stand später noch benötigen, verwenden Sie zuerst apply; nach Prüfung des Ergebnisses können Sie den Eintrag entfernen.

Führen Sie dieses Beispiel aus. Der unveränderte Beispielcode und seine Ausgabe bleiben auf Englisch.

import subprocess
import tempfile
from pathlib import Path

with tempfile.TemporaryDirectory() as temp_dir:
    repo = Path(temp_dir)

    def git(*args):
        subprocess.run(
            ["git", *args], cwd=repo, check=True,
            stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
        )

    git("init", "-q")
    git("config", "user.name", "Example User")
    git("config", "user.email", "example@example.com")
    note = repo / "note.txt"
    note.write_text("original\n", encoding="utf-8")
    git("add", "note.txt")
    git("commit", "-q", "-m", "Add note")
    note.write_text("restored change\n", encoding="utf-8")
    git("stash", "push", "-m", "demo", "-q")
    git("stash", "pop", "-q")
    print(note.read_text(encoding="utf-8").strip())

Erwartete Ausgabe. Der unveränderte Beispielcode gibt den englischen Text restored change aus.

restored change

Den neuesten Stash mit git stash pop wiederherstellen und entfernen

Wenn Sie die zuletzt gespeicherten Änderungen wiederherstellen und den Stash-Eintrag entfernen möchten, führen Sie git stash pop aus. Git wendet den obersten Eintrag der Liste an, normalerweise stash@{0}. Bei erfolgreicher Anwendung entfernt Git diesen Eintrag. Die wiederhergestellten Dateien bleiben in Ihrem Arbeitsverzeichnis; das Entfernen des Stashs verwirft die angewendeten Änderungen nicht.

Prüfen Sie vor dem Ausführen von pop, ob das aktuelle Arbeitsverzeichnis für die gespeicherten Änderungen bereit ist. Prüfen Sie danach git status und sehen Sie sich die betroffenen Dateien an. Falls die Änderungen nicht wie erwartet erscheinen, prüfen Sie mit git stash list, ob der Eintrag noch vorhanden ist. Ein Stash, der sich nicht sauber anwenden ließ, bleibt in der Regel erhalten. So können Sie den Konflikt beheben und es erneut versuchen, ohne die gespeicherte Kopie zu verlieren.

Einen Stash mit git stash apply wiederherstellen und beibehalten

Verwenden Sie git stash apply, wenn Sie die Änderungen zurückholen, den gespeicherten Eintrag aber weiterhin behalten möchten. Um den neuesten Eintrag anzuwenden, führen Sie git stash apply aus. Für einen älteren Eintrag ergänzen Sie dessen Auswahl, zum Beispiel git stash apply stash@{2}. Das ist hilfreich, wenn Sie das Ergebnis vergleichen oder dieselbe gespeicherte Arbeit später in einer anderen Arbeitskopie wiederherstellen möchten.

Prüfen Sie nach dem Anwenden git status und sehen Sie sich die Dateien an, bevor Sie weitere Änderungen vornehmen. Durch das Anwenden wird der Stash nicht entfernt – unabhängig davon, ob es ohne Konflikte gelingt oder eine Konfliktlösung erfordert. Sobald Sie bestätigt haben, dass die wiederhergestellte Arbeit vollständig ist und Sie den gespeicherten Eintrag nicht mehr benötigen, entfernen Sie ihn wie unten beschrieben mit git stash drop.

Einen Stash nach der Wiederherstellung mit git stash drop entfernen

git stash drop entfernt einen Eintrag aus der Stash-Liste, ohne ihn anzuwenden. Verwenden Sie den Befehl nur, wenn Sie diese gespeicherte Kopie verwerfen möchten. Ohne Auswahl entfernt er den neuesten Eintrag. Für einen bestimmten Eintrag geben Sie dessen Auswahl an, zum Beispiel git stash drop stash@{2}.

Für eine vorsichtige Wiederherstellung mit anschließendem Entfernen wenden Sie zunächst mit git stash apply den gewünschten Eintrag an und prüfen dann die Dateien sowie git status. Sind die Änderungen wiederhergestellt und benötigen Sie die Stash-Kopie nicht mehr, entfernen Sie sie mit git stash drop und derselben Auswahl. Prüfen Sie unmittelbar vor dem Entfernen mit git stash list die Liste: Wenn Sie einen früheren Eintrag entfernen, können sich die Nummern der übrigen Einträge ändern. Mit git stash pop kombinieren Sie stattdessen das Anwenden und Entfernen; Git entfernt den Eintrag, wenn die Anwendung erfolgreich ist.

Einen Stash auswählen und Konflikte behandeln

Zeigen Sie die Einträge mit git stash list an und wählen Sie dann den gewünschten stash@{n} aus. Mit git stash show -p stash@{2} können Sie den gespeicherten Patch vor dem Anwenden prüfen. Ersetzen Sie dabei 2 durch die Nummer des Eintrags aus Ihrer Liste. Die Beschreibungen und der Patch helfen, ähnliche Stashes auseinanderzuhalten. Prüfen Sie die Auswahl jedoch immer anhand der aktuellen Liste, bevor Sie fortfahren.

Ein Stash kann mit Änderungen auf dem aktuellen Branch in Konflikt geraten. In diesem Fall meldet Git die betroffenen Dateien und hinterlässt Konfliktmarkierungen, die Sie auflösen müssen. Öffnen Sie jede gemeldete Datei, wählen und kombinieren Sie die gewünschten Änderungen, entfernen Sie die Konfliktmarkierungen und prüfen Sie anschließend git status sowie den resultierenden Diff. Führen Sie die üblichen Prüfungen des Projekts durch, bevor Sie die Wiederherstellung als abgeschlossen betrachten. Gehen Sie nach einem Konflikt nicht davon aus, dass pop den Eintrag entfernt hat: Kann Git einen Stash nicht sauber anwenden, behält es ihn bei. Sobald der Arbeitsbaum bereinigt und das Ergebnis geprüft ist, kontrollieren Sie mit git stash list die Liste. Entfernen Sie den verbliebenen Eintrag nur, wenn Sie ihn nicht mehr benötigen.