So zeigen Sie nicht verfolgte Dateien an, die “git stash -u” waren

Lesezeit: 5 Minuten

So zeigen Sie nicht verfolgte Dateien an die git stash
Matthias J.

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

  • Mögliches Duplikat von Git Stash zum Patchen mit nicht nachverfolgten Dateien

    – Mathieu J.

    16. September 2018 um 19:15 Uhr

So zeigen Sie nicht verfolgte Dateien an die git stash
Torek

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 pushist 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-treemacht 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:
iIndex
wArbeitsbaum
unicht 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 iund, 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: ider 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.

998580cookie-checkSo zeigen Sie nicht verfolgte Dateien an, die “git stash -u” waren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy