Einrichtung und Konfiguration
Projekte holen und erstellen
Grundlegende Snapshots
Branching und Merging
Projekte teilen und aktualisieren
Inspektion und Vergleich
Patching
Debugging
Externe Systeme
Server-Administration
Anleitungen
- gitattributes
- Konventionen der Kommandozeile
- Tägliches Git
- Häufig gestellte Fragen (FAQ)
- Glossar
- Hooks
- gitignore
- gitmodules
- Revisionen
- Submodule
- Tutorial
- Workflows
- Alle Anleitungen...
Administration
Plumbing-Befehle
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 keine Änderungen
-
2.51.0
2025-08-18
- 2.43.1 → 2.50.1 keine Änderungen
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 keine Änderungen
-
2.42.0
2023-08-21
- 2.39.1 → 2.41.3 keine Änderungen
-
2.39.0
2022-12-12
- 2.38.1 → 2.38.5 keine Änderungen
-
2.38.0
2022-10-02
- 2.35.1 → 2.37.7 keine Änderungen
-
2.35.0
2022-01-24
- 2.32.1 → 2.34.8 keine Änderungen
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 keine Änderungen
-
2.31.0
2021-03-15
- 2.26.1 → 2.30.9 keine Änderungen
-
2.26.0
2020-03-22
- 2.24.1 → 2.25.5 keine Änderungen
-
2.24.0
2019-11-04
- 2.23.1 → 2.23.4 keine Änderungen
-
2.23.0
2019-08-16
- 2.22.1 → 2.22.5 keine Änderungen
-
2.22.0
2019-06-07
- 2.17.1 → 2.21.4 keine Änderungen
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
- 2.15.4 keine Änderungen
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
- 2.8.6 → 2.10.5 keine Änderungen
-
2.7.6
2017-07-30
- 2.1.4 → 2.6.7 keine Änderungen
-
2.0.5
2014-12-17
SYNOPSIS
gitstashlist[<log-options>]gitstashshow[-u|--include-untracked|--only-untracked] [<diff-options>] [<stash>]gitstashdrop[-q|--quiet] [<stash>]gitstashpop[--index] [-q|--quiet] [<stash>]gitstashapply[--index] [-q|--quiet] [<stash>]gitstashbranch<branchname> [<stash>]gitstash[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>…]]gitstashsave[-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [<message>]gitstashcleargitstashcreate[<message>]gitstashstore[(-m|--message) <message>] [-q|--quiet] <commit>gitstashexport(--to-ref<ref>) [<stash>…]gitstashimport<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
HEADzurü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ürstashpush-pfungiert, 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-stashDer 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.
gitstashshow-pstash@{1}, um den zweitneuesten Eintrag im Patch-Format anzuzeigen). Wenn keine <diff-option> angegeben wird, wird das Standardverhalten durch die Konfigurationsvariablenstash.showStatundstash.showPatchbestimmt. Sie können auchstash.showIncludeUntrackedverwenden, um festzulegen, ob--include-untrackedstandardmäß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
gitstashpushaus. 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
gitstashdropaufrufen. apply[--index] [-q|--quiet] [<stash>]-
Ähnlich wie
pop, aber der Zustand wird nicht aus der Stash-Liste entfernt. Im Gegensatz zupopkann <stash> jeder Commit sein, der wie ein vonstashpushoderstashcreateerstellter 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
gitstashpushausgeführt haben, so stark geändert hat, dassgitstashapplyaufgrund von Konflikten fehlschlägt. Da der Stash-Eintrag auf den Commit angewendet wird, der zum Zeitpunkt der Ausführung vongitstashHEAD 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
importimportiert werden können. import<commit>-
Importiert die angegebenen Stashes aus dem angegebenen Commit, der von
exporterstellt worden sein muss, und fügt sie der Liste der Stashes hinzu. Um die bestehenden Stashes zu ersetzen, verwenden Sie zuerstclear.
OPTIONEN
-a--all-
Diese Option ist nur für die Befehle
pushundsavegültig.Alle ignorierten und nicht verfolgten Dateien werden ebenfalls gesichert und dann mit
gitcleanbereinigt. -u--include-untracked--no-include-untracked-
Bei Verwendung mit den Befehlen
pushundsavewerden auch alle nicht verfolgten Dateien gesichert und dann mitgitcleanbereinigt.Bei Verwendung mit dem Befehl
showwerden die nicht verfolgten Dateien im Stash-Eintrag als Teil des Diffs angezeigt. --only-untracked-
Diese Option ist nur für den Befehl
showgültig.Zeigt nur die nicht verfolgten Dateien im Stash-Eintrag als Teil des Diffs an.
--index-
Diese Option ist nur für die Befehle
popundapplygü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
pushundsavegültig.Alle bereits zum Index hinzugefügten Änderungen bleiben unverändert.
-p--patch-
Diese Option ist nur für die Befehle
pushundsavegü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
--patchbedient wird.Die Option
--patchimpliziert--keep-index. Sie können--no-keep-indexverwenden, um dies zu überschreiben. -U<n>--unified=<n>-
Generiert Diffs mit <n> Zeilen Kontext. Standard ist
diff.contextoder 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.interHunkContextoder 0, wenn die Konfigurationsoption nicht gesetzt ist. -S--staged-
Diese Option ist nur für die Befehle
pushundsavegültig.Sichert nur die Änderungen, die derzeit staged sind. Dies ist ähnlich wie bei einem einfachen
gitcommit, nur dass der Zustand in den Stash statt in den aktuellen Branch committet wird.Die Option
--patchhat Vorrang vor dieser. --pathspec-from-file=<file>-
Diese Option ist nur für den Befehl
pushgü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 Konfigurationsvariablecore.quotePatherklärt (siehe git-config[1]) zitiert werden. Siehe auch--pathspec-file-nulund global--literal-pathspecs. --pathspec-file-nul-
Diese Option ist nur für den Befehl
pushgü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,storegültig.Leise, unterdrückt Feedback-Meldungen.
--print-
Diese Option ist nur für den Befehl
exportgü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
exportgü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
pushgültig.Trennt die Pfadspezifikation von den Optionen zur Disambiguierung.
- <pathspec>...
-
Diese Option ist nur für den Befehl
pushgü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,showundexportgü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
gitpullfortfahren.Es gibt jedoch Fälle, in denen Ihre lokalen Änderungen mit den Upstream-Änderungen kollidieren und
gitpullIhre Ä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
gitstashpush--keep-indexverwenden, 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'
-
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
gitstashpush--stagedverwenden, 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
gitstashapplyundgitstashpopso, als ob--indexangegeben wurde. Standardmäßig false. stash.showIncludeUntracked-
Wenn dies auf true gesetzt ist, zeigt der Befehl
gitstashshowdie nicht verfolgten Dateien eines Stash-Eintrags an. Standardmäßig false. stash.showPatch-
Wenn dies auf true gesetzt ist, zeigt der Befehl
gitstashshowohne Option den Stash-Eintrag im Patch-Format an. Standardmäßig false. stash.showStat-
Wenn dies auf true gesetzt ist, zeigt der Befehl
gitstashshowohne Option einen Diff-Stat des Stash-Eintrags an. Standardmäßig true.
GIT
Teil der git[1] Suite