English ▾ Themen ▾ Neueste Version ▾ git-stash zuletzt aktualisiert in 2.52.0

NAME

git-stash - Sichert die Änderungen in einem schmutzigen Arbeitsverzeichnis

SYNOPSIS

git stash list [<log-options>]
git stash show [-u | --include-untracked | --only-untracked] [<diff-options>] [<stash>]
git stash drop [-q | --quiet] [<stash>]
git stash pop [--index] [-q | --quiet] [<stash>]
git stash apply [--index] [-q | --quiet] [<stash>]
git stash branch <branchname> [<stash>]
git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
	     [-u | --include-untracked] [-a | --all] [(-m | --message) <message>]
	     [--pathspec-from-file=<file> [--pathspec-file-nul]]
	     [--] [<pathspec>…​]]
git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
           [-u | --include-untracked] [-a | --all] [<message>]
git stash clear
git stash create [<message>]
git stash store [(-m | --message) <message>] [-q | --quiet] <commit>
git stash export (--print | --to-ref <ref>) [<stash>…​]
git stash import <commit>

BESCHREIBUNG

Verwenden Sie git stash, wenn Sie den aktuellen Zustand des Arbeitsverzeichnisses und des Index aufzeichnen, aber zu einem sauberen Arbeitsverzeichnis zurückkehren möchten. Der Befehl sichert Ihre lokalen Änderungen und setzt das Arbeitsverzeichnis auf den Zustand des HEAD-Commits zurück.

Die mit diesem Befehl gesicherten Änderungen können mit git stash list aufgelistet, mit git stash show eingesehen und (potenziell auf einem anderen Commit) mit git stash apply wiederhergestellt werden. Der Aufruf von git stash ohne Argumente ist gleichbedeutend mit git stash push. Ein Stash wird standardmäßig als "WIP auf <branchname> …​" aufgeführt, aber Sie können beim Erstellen eine beschreibendere Nachricht auf der Befehlszeile angeben.

Der zuletzt erstellte Stash wird unter refs/stash gespeichert; ältere Stashes finden sich im Reflog dieser Referenz und können mit der üblichen Reflog-Syntax benannt werden (z. B. ist stash@{0} der zuletzt erstellte Stash, stash@{1} der davor, stash@{2.hours.ago} ist ebenfalls möglich). Stashes können auch durch Angabe des Stash-Indexes (z. B. der Integer <n> ist äquivalent zu stash@{<n>}) referenziert werden.

BEFEHLE

push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-u | --include-untracked] [ -a | --all] [-q | --quiet] [(-m|--message) <message>] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>...]

Speichern Sie Ihre lokalen Änderungen in einem neuen *Stash-Eintrag* und rollen Sie sie auf HEAD zurück (im Arbeitsbaum und im Index). Der Teil <message> ist optional und gibt die Beschreibung zusammen mit dem gesicherten Zustand an.

Für die schnelle Erstellung eines Snapshots können Sie "push" weglassen. In diesem Modus sind keine Nicht-Option-Argumente erlaubt, um zu verhindern, dass ein falsch geschriebener Unterbefehl einen unerwünschten Stash-Eintrag erstellt. Die beiden Ausnahmen sind stash -p, was als Alias für stash push -p fungiert, und Pfadspezifikations-Elemente, die nach einem doppelten Gedankenstrich -- zur Disambiguierung erlaubt sind.

save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-u | --include-untracked] [-a | --all] [-q | --quiet] [<message>]

Diese Option ist zugunsten von *git stash push* veraltet. Sie unterscheidet sich von "stash push" dadurch, dass sie keine Pfadspezifikation entgegennehmen kann. Stattdessen werden alle Nicht-Option-Argumente verkettet, um die Stash-Nachricht zu bilden.

list [<log-options>]

Listet die Stash-Einträge auf, die Sie derzeit haben. Jeder *Stash-Eintrag* wird mit seinem Namen (z. B. ist stash@{0} der neueste Eintrag, stash@{1} der davor usw.), dem Namen des Branches, der zum Zeitpunkt der Erstellung des Eintrags aktuell war, und einer kurzen Beschreibung des Commits, auf dem der Eintrag basiert, aufgeführt.

stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
stash@{1}: On master: 9cc0589... Add git-stash

Der Befehl nimmt Optionen entgegen, die für den Befehl *git log* gelten, um zu steuern, was und wie angezeigt wird. Siehe git-log[1].

show [-u | --include-untracked | --only-untracked] [<diff-options>] [<stash>]

Zeigt die im Stash-Eintrag aufgezeichneten Änderungen als Diff zwischen dem gesicherten Inhalt und dem Commit an, auf dem der Stash-Eintrag ursprünglich erstellt wurde. Standardmäßig zeigt der Befehl den Diff-Stat an, akzeptiert aber jedes Format, das *git diff* bekannt ist (z. B. git stash show -p stash@{1}, um den zweitneuesten Eintrag im Patch-Format anzuzeigen). Wenn keine <diff-option> angegeben wird, wird das Standardverhalten durch die Konfigurationsvariablen stash.showStat und stash.showPatch bestimmt. Sie können auch stash.showIncludeUntracked verwenden, um festzulegen, ob --include-untracked standardmäßig aktiviert ist.

pop [--index] [-q | --quiet] [<stash>]

Entfernt einen einzelnen gesicherten Zustand aus der Stash-Liste und wendet ihn auf den aktuellen Arbeitsbaumzustand an, d. h. führt die inverse Operation von git stash push aus. Das Arbeitsverzeichnis muss mit dem Index übereinstimmen.

Das Anwenden des Zustands kann zu Konflikten führen. In diesem Fall wird er nicht aus der Stash-Liste entfernt. Sie müssen die Konflikte manuell lösen und anschließend git stash drop aufrufen.

apply [--index] [-q | --quiet] [<stash>]

Ähnlich wie pop, aber der Zustand wird nicht aus der Stash-Liste entfernt. Im Gegensatz zu pop kann <stash> jeder Commit sein, der wie ein von stash push oder stash create erstellter Commit aussieht.

branch <branchname> [<stash>]

Erstellt und checkt einen neuen Branch namens <branchname> aus, der vom Commit ausgeht, an dem der <stash> ursprünglich erstellt wurde. Wendet die im <stash> aufgezeichneten Änderungen auf den neuen Arbeitsbaum und den Index an. Wenn dies erfolgreich ist und <stash> eine Referenz der Form stash@{<revision>} ist, wird der <stash> anschließend verworfen.

Dies ist nützlich, wenn sich der Branch, auf dem Sie git stash push ausgeführt haben, so stark geändert hat, dass git stash apply aufgrund von Konflikten fehlschlägt. Da der Stash-Eintrag auf den Commit angewendet wird, der zum Zeitpunkt der Ausführung von git stash HEAD war, wird der ursprünglich gesicherte Zustand ohne Konflikte wiederhergestellt.

clear

Entfernt alle Stash-Einträge. Beachten Sie, dass diese Einträge dann der Bereinigung unterliegen und möglicherweise nicht wiederhergestellt werden können (siehe *BEISPIELE* unten für eine mögliche Strategie).

drop [-q | --quiet] [<stash>]

Entfernt einen einzelnen Stash-Eintrag aus der Liste der Stash-Einträge.

create

Erstellt einen Stash-Eintrag (der ein reguläres Commit-Objekt ist) und gibt dessen Objekt-ID zurück, ohne ihn irgendwo im Ref-Namespace zu speichern. Dies ist für Skripte gedacht. Dies ist wahrscheinlich nicht der Befehl, den Sie verwenden möchten; siehe "push" oben.

store

Speichert einen mit *git stash create* erstellten Stash (der ein hängender Merge-Commit ist) im Stash-Ref und aktualisiert das Stash-Reflog. Dies ist für Skripte gedacht. Dies ist wahrscheinlich nicht der Befehl, den Sie verwenden möchten; siehe "push" oben.

export ( --print | --to-ref <ref> ) [<stash>...]

Exportiert die angegebenen Stashes, oder alle, wenn keine angegeben sind, in eine Kette von Commits, die über die normalen Fetch- und Push-Mechanismen übertragen und dann mit dem Unterbefehl import importiert werden können.

import <commit>

Importiert die angegebenen Stashes aus dem angegebenen Commit, der von export erstellt worden sein muss, und fügt sie der Liste der Stashes hinzu. Um die bestehenden Stashes zu ersetzen, verwenden Sie zuerst clear.

OPTIONEN

-a
--all

Diese Option ist nur für die Befehle push und save gültig.

Alle ignorierten und nicht verfolgten Dateien werden ebenfalls gesichert und dann mit git clean bereinigt.

-u
--include-untracked
--no-include-untracked

Bei Verwendung mit den Befehlen push und save werden auch alle nicht verfolgten Dateien gesichert und dann mit git clean bereinigt.

Bei Verwendung mit dem Befehl show werden die nicht verfolgten Dateien im Stash-Eintrag als Teil des Diffs angezeigt.

--only-untracked

Diese Option ist nur für den Befehl show gültig.

Zeigt nur die nicht verfolgten Dateien im Stash-Eintrag als Teil des Diffs an.

--index

Diese Option ist nur für die Befehle pop und apply gültig.

Versucht, nicht nur die Änderungen des Arbeitsbaums, sondern auch die des Index wiederherzustellen. Dies kann jedoch fehlschlagen, wenn Sie Konflikte haben (die im Index gespeichert sind, wo Sie daher die Änderungen nicht mehr so anwenden können, wie sie ursprünglich waren).

-k
--keep-index
--no-keep-index

Diese Option ist nur für die Befehle push und save gültig.

Alle bereits zum Index hinzugefügten Änderungen bleiben unverändert.

-p
--patch

Diese Option ist nur für die Befehle push und save gültig.

Wählt interaktiv Hunks aus dem Diff zwischen HEAD und dem Arbeitsbaum aus, die gesichert werden sollen. Der Stash-Eintrag wird so konstruiert, dass sein Indexzustand mit dem Indexzustand Ihres Repositories übereinstimmt, und sein Arbeitsbaum enthält nur die interaktiv von Ihnen ausgewählten Änderungen. Die ausgewählten Änderungen werden dann aus Ihrem Arbeitsbaum zurückgerollt. Lesen Sie im Abschnitt "Interaktiver Modus" von git-add[1], wie der Modus --patch bedient wird.

Die Option --patch impliziert --keep-index. Sie können --no-keep-index verwenden, um dies zu überschreiben.

-U<n>
--unified=<n>

Generiert Diffs mit <n> Zeilen Kontext. Standard ist diff.context oder 3, wenn die Konfigurationsoption nicht gesetzt ist.

--inter-hunk-context=<n>

Zeigt den Kontext zwischen Diff-Hunks bis zur angegebenen Anzahl von <n> Zeilen an und fasst so nahe beieinander liegende Hunks zusammen. Standard ist diff.interHunkContext oder 0, wenn die Konfigurationsoption nicht gesetzt ist.

-S
--staged

Diese Option ist nur für die Befehle push und save gültig.

Sichert nur die Änderungen, die derzeit staged sind. Dies ist ähnlich wie bei einem einfachen git commit, nur dass der Zustand in den Stash statt in den aktuellen Branch committet wird.

Die Option --patch hat Vorrang vor dieser.

--pathspec-from-file=<file>

Diese Option ist nur für den Befehl push gültig.

Die Pfadspezifikation wird in <file> anstelle von Kommandozeilenargumenten übergeben. Wenn <file> exakt - ist, wird die Standardeingabe verwendet. Pfadspezifikationselemente werden durch LF oder CR/LF getrennt. Pfadspezifikationselemente können wie für die Konfigurationsvariable core.quotePath erklärt (siehe git-config[1]) zitiert werden. Siehe auch --pathspec-file-nul und global --literal-pathspecs.

--pathspec-file-nul

Diese Option ist nur für den Befehl push gültig.

Nur sinnvoll mit --pathspec-from-file. Pfadspezifikationselemente werden durch ein NUL-Zeichen getrennt und alle anderen Zeichen werden wörtlich genommen (einschließlich Zeilenumbrüche und Anführungszeichen).

-q
--quiet

Diese Option ist nur für die Befehle apply, drop, pop, push, save, store gültig.

Leise, unterdrückt Feedback-Meldungen.

--print

Diese Option ist nur für den Befehl export gültig.

Erstellt die Kette von Commits, die die exportierten Stashes repräsentieren, ohne sie im Ref-Namespace zu speichern, und gibt die Objekt-ID auf der Standardausgabe aus. Dies ist für Skripte konzipiert.

--to-ref

Diese Option ist nur für den Befehl export gültig.

Erstellt die Kette von Commits, die die exportierten Stashes repräsentieren, und speichert sie in der angegebenen Referenz.

--

Diese Option ist nur für den Befehl push gültig.

Trennt die Pfadspezifikation von den Optionen zur Disambiguierung.

<pathspec>...

Diese Option ist nur für den Befehl push gültig.

Der neue Stash-Eintrag zeichnet die geänderten Zustände nur für die Dateien auf, die mit der Pfadspezifikation übereinstimmen. Die Indexeinträge und Arbeitsbaumdateien werden ebenfalls nur für diese Dateien auf den Zustand von HEAD zurückgerollt, während Dateien, die nicht mit der Pfadspezifikation übereinstimmen, unberührt bleiben.

Weitere Details finden Sie im Eintrag pfadspec in gitglossary[7].

<stash>

Diese Option ist nur für die Befehle apply, branch, drop, pop, show und export gültig.

Eine Referenz der Form stash@{<revision>}. Wenn kein <stash> angegeben wird, wird der letzte Stash angenommen (d. h. stash@{0}).

DISKUSSION

Ein Stash-Eintrag wird als Commit dargestellt, dessen Baum den Zustand des Arbeitsverzeichnisses aufzeichnet und dessen erster Elternteil der Commit bei HEAD ist, als der Eintrag erstellt wurde. Der Baum des zweiten Elternteils zeichnet den Zustand des Index auf, als der Eintrag vorgenommen wurde, und er wird zu einem Kind des HEAD-Commits gemacht. Der Abstammungsgraph sieht wie folgt aus

       .----W
      /    /
-----H----I

wobei H der HEAD-Commit ist, I ein Commit ist, der den Zustand des Index aufzeichnet, und W ein Commit ist, der den Zustand des Arbeitsbaums aufzeichnet.

BEISPIELE

Ziehen in einen schmutzigen Baum

Wenn Sie mitten in einer Arbeit sind und erfahren, dass es Änderungen im Upstream gibt, die möglicherweise für Ihre aktuelle Arbeit relevant sind. Wenn Ihre lokalen Änderungen nicht mit den Änderungen im Upstream kollidieren, können Sie mit einem einfachen git pull fortfahren.

Es gibt jedoch Fälle, in denen Ihre lokalen Änderungen mit den Upstream-Änderungen kollidieren und git pull Ihre Änderungen nicht überschreiben will. In einem solchen Fall können Sie Ihre Änderungen sichern, einen Pull durchführen und dann wieder auspacken, wie folgt:

$ git pull
 ...
file foobar not up to date, cannot merge.
$ git stash
$ git pull
$ git stash pop
Unterbrochener Arbeitsablauf

Wenn Sie mitten in einer Arbeit sind und Ihr Chef hereinkommt und verlangt, dass Sie sofort etwas reparieren. Traditionell würden Sie einen Commit auf einen temporären Branch machen, um Ihre Änderungen zu speichern und zu Ihrem ursprünglichen Branch zurückkehren, um die Notfallkorrektur vorzunehmen, wie folgt:

# ... hack hack hack ...
$ git switch -c my_wip
$ git commit -a -m "WIP"
$ git switch master
$ edit emergency fix
$ git commit -a -m "Fix in a hurry"
$ git switch my_wip
$ git reset --soft HEAD^
# ... continue hacking ...

Sie können *git stash* verwenden, um dies zu vereinfachen, wie folgt:

# ... hack hack hack ...
$ git stash
$ edit emergency fix
$ git commit -a -m "Fix in a hurry"
$ git stash pop
# ... continue hacking ...
Testen von Teil-Commits

Sie können git stash push --keep-index verwenden, wenn Sie zwei oder mehr Commits aus den Änderungen im Arbeitsbaum erstellen möchten und jeden Commit testen möchten, bevor Sie ihn committen.

# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash push --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'
Speichern von unerledigten Änderungen für die zukünftige Verwendung

Wenn Sie mitten in massiven Änderungen sind und ein unerledigtes Problem feststellen, das Sie nicht vergessen möchten zu beheben, können Sie die Änderung(en) vornehmen, sie staged und git stash push --staged verwenden, um sie für die zukünftige Verwendung zu sichern. Dies ist ähnlich wie das Committen der gestagten Änderungen, nur dass der Commit im Stash landet und nicht im aktuellen Branch.

# ... hack hack hack ...
$ git add --patch foo           # add unrelated changes to the index
$ git stash push --staged       # save these changes to the stash
# ... hack hack hack, finish current changes ...
$ git commit -m 'Massive'       # commit fully tested changes
$ git switch fixup-branch       # switch to another branch
$ git stash pop                 # to finish work on the saved changes
Wiederherstellung von Stash-Einträgen, die versehentlich gelöscht/abgelegt wurden

Wenn Sie versehentlich Stash-Einträge ablegen oder löschen, können diese nicht über die normalen Sicherheitsmechanismen wiederhergestellt werden. Sie können jedoch die folgende Anweisung versuchen, um eine Liste von Stash-Einträgen zu erhalten, die sich noch in Ihrem Repository befinden, aber nicht mehr erreichbar sind:

git fsck --unreachable |
grep commit | cut -d\  -f3 |
xargs git log --merges --no-walk --grep=WIP

KONFIGURATION

Alles unterhalb dieser Zeile in diesem Abschnitt wird selektiv aus der git-config[1]-Dokumentation übernommen. Der Inhalt ist derselbe wie dort zu finden.

stash.index

Wenn dies auf true gesetzt ist, verhalten sich git stash apply und git stash pop so, als ob --index angegeben wurde. Standardmäßig false.

stash.showIncludeUntracked

Wenn dies auf true gesetzt ist, zeigt der Befehl git stash show die nicht verfolgten Dateien eines Stash-Eintrags an. Standardmäßig false.

stash.showPatch

Wenn dies auf true gesetzt ist, zeigt der Befehl git stash show ohne Option den Stash-Eintrag im Patch-Format an. Standardmäßig false.

stash.showStat

Wenn dies auf true gesetzt ist, zeigt der Befehl git stash show ohne Option einen Diff-Stat des Stash-Eintrags an. Standardmäßig true.

GIT

Teil der git[1] Suite