Das Verstauen von Inhalten in Git ist sehr nützlich. wenn Sie Untrack-Dateien stashen und Ihren Stash so durchgehen
echo test > foo
git stash -u # foo is stashed
git stash show -p stash@{0}
Untracked Dateien werden nicht angezeigt. wie können wir sie sehen?
Danke
Sie müssen sich nur den dritten Stash-Commit ansehen. Aber “nur müssen” untertreibt die Dinge ein wenig, und das macht keinen Sinn, bis Sie wissen, was die drei Stash-Commits machen sind. Um zu sehen, was ich meine, lesen Sie weiter.
Einrichtung: Was Sie über Stashes wissen sollten
Wenn du rennst git stash save
oder git stash push
ist die normale Aktion von Git das Erstellen zwei Commits, von denen sich keiner in einem Zweig befindet. Wenn Sie das „Vorher“-Bild so zeichnen, hätten Sie diese Reihe von Commits:
...--o--o--* <-- branch (HEAD)
Nach dem git stash save
vervollständigt, haben Sie zwei Neu Commits, die sich nicht auf dem Zweig befinden branch
und auch nicht auf einem anderen Zweig:
...--o--o--* <-- branch (HEAD)
|\
i-w <-- the stash
Die w
commit speichert den Zustand des Arbeitsbaums, während die i
commit speichert den Index. Jeder dieser beiden Commits ist sehr ähnlich wie jeder andere Commit, und tatsächlich ist der i
Commit wird unter Verwendung der meisten normalen durchgeführt git commit
Mechanismus: Git schreibt den aktuellen Index in eine interne Baum Objekt verwenden git write-tree
macht dann a begehen Objekt verwenden git commit-tree
. Wenn Sie nicht wissen, was diese internen Objekte sind, machen Sie sich darüber keine allzu großen Sorgen: Der Punkt ist, dass dies auch das Wie ist git commit
erledigt den größten Teil seiner Arbeit, indem es einen Baum und dann ein Commit-Objekt schreibt. (Der Rest von git commit
besteht darin, zuerst Ihre Protokollnachricht zu sammeln und am Ende den Zweignamen zu aktualisieren.)
Die w
Commit ist etwas komplizierter, weil es die hat bilden (aber nicht Absicht) von a verschmelzen verpflichten, mit zwei Elternteilen statt einem. Aber im Grunde speichert es eine Momentaufnahme des Arbeitsbaums, als ob Sie gelaufen wären git add
auf alle Ihre nachverfolgten Dateien.
Wenn Sie hinzufügen --all
oder --include-untracked
(-a
oder -u
kurz), was git stash
tut ist, dass es a hinzufügt Dritter commit, den wir so zeichnen können:
...--o--o--* <-- branch (HEAD)
|\
i-w <-- the stash
/
u
Der dritte Commit ist ein Schnappschuss, aber es ist ein sehr seltsamer Schnappschuss. Es beinhaltet nur die nicht nachverfolgten Dateien – entweder die nicht nachverfolgten, aber nicht ignorierten Dateien (git stash save -u
) oder die nicht nachverfolgten Dateien einschließlich die nicht nachverfolgten und ignorierten Dateien (git stash save -a
). Es hat auch keine Elternteil begehen.
Wir haben also insgesamt 3 Commits für:
i
– Index
w
– Arbeitsbaum
u
– nicht verfolgt
Der Stash “Stack”, Commit-Hash-IDs und Eltern
Ein Grund1 dass Git die hinzugefügt hat push
Verb, wie in git stash push
– was ansonsten im Grunde ein Synonym für ist save
– ist, dass Git den Stash verwendet, wenn Sie einen neuen Stash erstellen neu loggen um den Überblick über frühere Stashes zu behalten. Der aktuelle Vorrat ist stash@{0}
in Reflog-Begriffen, und der frühere Stash wird stash@{1}
.
Jeder dieser Namen ist nur ein spezifischer Fall einer allgemeineren Sache, die Git Ihnen gibt: Sie können auf jeden Commit verweisen jeder Name, der in die richtige Hash-ID aufgelöst wird. Der „wahre Name“ eines jeden Commits ist seine große hässliche Hash-ID. Die gitrevisions-Dokumentation enthält die vollständige Beschreibung aller Möglichkeiten, wie Sie eine Hash-ID für Git buchstabieren können; mit einem Namen wie branch
oder stash
ist ein solcher Weg.
Verwendung des Namens stash
findet Commit w
speziell. Git verwendet dann w
selbst zu finden, zu begehen i
und, falls vorhanden, committen u
. Git kann dies tun, weil jeder Commit die Hash-IDs von ihm enthält Elternteil begeht. Was macht w
die Form eines Merge-Commits haben, ist, dass es mindestens zwei Elternteile hat: i
der Index-Commit und *
der Commit, auf dem Sie beim Laufen gesessen haben git stash save
oder git stash push
an erster Stelle.
Wir können die meisten Revisionsbezeichner (wie stash
) durch Hinzufügen eines Caretzeichens ^
Zeichen und eine Zahl, um speziell den nummerierten Elternteil zu betrachten. Schreiben stash^1
ist eine Möglichkeit, Commit zu benennen *
; Schreiben stash^2
ist eine Möglichkeit, Commit zu benennen i
. Wenn begehen u
existiert, schreibt stash^3
benennt es. Beachten Sie, dass auf einigen Systemen (Windows) ^
kann ein Sonderzeichen sein, das doppelt oder in Anführungszeichen gesetzt werden muss, also statt stash^3
du brauchst vielleicht stash^^3
.
1Der andere Grund bestand darin, die Möglichkeit hinzuzufügen, mithilfe von Pfadspezifikationen teilweise zu stashen: git stash save
nahm alle zusätzlichen Argumente als Nachricht, um sie in die Stash-Commits aufzunehmen, also brauchten sie ein neues Verb, das used -m
um die Nachricht anzugeben, wobei Platz für pathpec-Argumente bleibt.
Anzeigen der u
begehen
Wir können sehen irgendein begehen mit git show
. Für Versteck w
begeht diese Fehlzündungen, weil Git denkt, dass die w
commit ist eine Zusammenführung, also können wir verwenden git stash show
stattdessen. (Es ist eine Zusammenführung, nur keine git show
kann richtig zeigen.) Meine frühere Antwort auf eine verwandte Frage fordert zur Verwendung auf git diff
auf der u
commit, weil wir in diesem speziellen Fall den Header that nicht bekommen wollen git show
zeigt, aber wenn wir uns nur den Commit der nicht nachverfolgten Datei ansehen wollen, ist die Verwendung in Ordnung git show
Hier:
git show stash^3
zum Beispiel. Hier ist die Ausgabe für die foo
Beispiel oben:
$ git show stash^3
commit 4c9bd2486706980f5a492d19c49270381db2d796
Author: Chris Torek <chris.torek gmail.com>
Date: Sun Sep 16 12:35:03 2018 -0700
untracked files on master: f72737e initial
diff --git a/foo b/foo
new file mode 100644
index 0000000..257cc56
--- /dev/null
+++ b/foo
@@ -0,0 +1 @@
+foo
Mit einem Namen wie stash@{1}
identifiziert den Commit in Reflog-Eintrag Nr. 1, der der nächste Stash in Ihrem “Stash-Stack” ist. (Das Reflog beginnt bei Null zu zählen, also stash
und stash@{0}
meinen das gleiche Commit.) Also für stash@{1}
du bräuchtest stash@{1}^3
oder vielleicht stash@{1}^^3
.
Mögliches Duplikat von Git Stash zum Patchen mit nicht nachverfolgten Dateien
– Mathieu J.
16. September 2018 um 19:15 Uhr