Gibt es in git eine Möglichkeit, nicht verfolgte versteckte Dateien anzuzeigen, ohne den Stash anzuwenden?


100

Wenn ich laufe git stash -u, kann ich nicht verfolgte Dateien speichern. Diese nicht verfolgten Dateien werden jedoch überhaupt nicht mit angezeigt git stash show stash@{0}. Gibt es eine Möglichkeit, nicht verfolgte versteckte Dateien anzuzeigen, ohne den Stash anzuwenden?

Antworten:


121

Nicht verfolgte Dateien werden im dritten übergeordneten Element eines Stash-Commits gespeichert. (Dies ist nicht wirklich dokumentiert, aber es ist ziemlich offensichtlich aus dem Commit, das die -u-Funktion 787513 ... eingeführt hat , und der Art und Weise, wie der Rest der Dokumentation fürgit-stash Phrasen Dinge ... oder einfach durch Ausführen git log --graph stash@{0})

Sie können nur den "nicht verfolgten" Teil des Stashs anzeigen über:

git show stash@{0}^3

oder nur der "nicht verfolgte" Baum selbst über:

git show stash@{0}^3:

oder eine bestimmte "nicht verfolgte" Datei im Baum über:

git show stash@{0}^3:<path/to/file>

Es gibt leider keine gute Möglichkeit, eine Zusammenfassung der Unterschiede zwischen allen inszenierten + nicht inszenierten + nicht verfolgten und "aktuellen" Zuständen zu erhalten. dh: git show stash@{0}kann nicht dazu gebracht werden, die nicht verfolgten Dateien einzuschließen. Dies liegt daran, dass das stash@{0}:Baumobjekt des Stash-Commits selbst, das als bezeichnet wird , keine Änderungen gegenüber dem dritten "nicht bereitgestellten" übergeordneten Element enthält.

Dies liegt an der Art und Weise, wie Stashes erneut angewendet werden: Verfolgte Dateien können einfach als Patches angewendet werden, während nicht verfolgte Dateien theoretisch nur als "ganze Dateien" angewendet werden können.


Die Eltern des Stash-Commits sind also (1. Commit-Stash wird gegen 2. Index 3. Nicht verfolgte Arbeitskopie erstellt), und das Stash-Commit selbst enthält die nachverfolgte Arbeitskopie? git stash showscheint den Unterschied zwischen der Arbeitskopie und # 1 zu zeigen (relevanter Code aus git-stash.sh : git diff ${FLAGS:---stat} $b_commit $w_commit, wobei $ b_commit # 1 und $ w_commit das Stash-Commit ist); Gibt es eine eingebaute Möglichkeit git stash show, auch # 3 aufzunehmen?
Max Nanasy

Wie Sie sagen, habe ich keine Möglichkeit gefunden, eine einzige zusammenfassende Ansicht eines Stashs zu erhalten, aber Sie können die vollständigen Informationen in einem Befehl anzeigen mit : git log --graph --topo-order -m -u. matthewlmcclure.com/s/2014/01/10/…
Matt McClure

4
Beachten Sie, dass Sie einen hässlichen Fehler ( fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.) erhalten, wenn Sie keine nicht verfolgten Dateien in diesem Vorrat haben (aber dachten, dass Sie dies getan haben).
Randall

2
@antak: Nein, git stash showzeigt nicht die nicht verfolgten Dateien (wahr für mindestens Git 2.7.4):
Norbert Bérci

1
Hinweis (2.13.2-Linux): Versucht git stash popzuerst, nicht verfolgte Dateien wiederherzustellen, und versucht dann, verfolgte Dateien wiederherzustellen. Wenn der letztere Vorgang fehlschlägt (z. B. Konflikt), wird der erste Vorgang nicht zurückgesetzt (der nicht verfolgte Dateistapel bleibt unverändert, aber die Dateien werden nicht von der Festplatte entfernt). Selbst wenn Sie den Konflikt beheben, schlägt der nächste Pop fehl wie auch immer.
Marinos An

22

Sie können alle Stash-Commits mit dem folgenden Befehl auflisten:

git rev-list -g stash

Da Stashes als 3-Wege-Merge-Commit von HEAD, dem Index und als übergeordnetes "Root" -Commit von nicht verfolgten Dateien dargestellt werden, können nicht verfolgte Dateistapel aufgelistet werden, indem die obige Ausgabe wie folgt weitergeleitet wird:

git rev-list -g stash | git rev-list --stdin --max-parents=0

Nützliche Anwendungen der oben genannten:

Nur nicht verfolgte, versteckte Dateien anzeigen

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat

Entfernen Sie natürlich die, um --statden Inhalt der Dateien zu sehen.

Suchen Sie eine bestimmte Datei

git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>

Grep nicht verfolgte Dateien

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>

Listen Sie alle Inhalte aller Verstecke auf

git rev-list -g stash | git rev-list --stdin | xargs git show --stat

10

So listen Sie die nicht verfolgten Dateien im Stash auf:

git ls-tree -r stash@{0}^3 --name-only

So zeigen Sie einen vollständigen Unterschied aller nicht verfolgten Dateien (mit Inhalt) an:

git show stash@{0}^3

Diese Befehle lesen den letzten (letzten) Vorrat. Erhöhen Sie bei früheren Stashes die Zahl hinter dem "stash @", z. B. stash@{2}für die zweite vom letzten Stash.

Der Grund dafür ist, dass git stashfür jeden Stash ein Zusammenführungs-Commit erstellt wird, auf das verwiesen werden stash@{0}kann stash@{1}usw. Das erste übergeordnete Element dieses Commits ist der HEAD zum Zeitpunkt des Stashs, das zweite übergeordnete Element enthält die Änderungen an den nachverfolgten Dateien und das drittens (was möglicherweise nicht vorhanden ist) die Änderungen an nicht verfolgten Dateien.

Dies wird teilweise in der Manpage unter "Diskussion" erklärt .


5

Um alle Dateien im Stash anzuzeigen (sowohl verfolgt als auch nicht verfolgt), habe ich diesen Alias ​​zu meiner Konfiguration hinzugefügt:

showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"

Es wird nur ein einziges Argument benötigt, welches Versteck Sie anzeigen möchten. Beachten Sie, dass es weiterhin in zwei aufeinanderfolgenden Listen angezeigt wird.

Der if...fiAbschnitt ändert das Bash-Argument $ 1 in 0, wenn keines übergeben wurde.


5

Eine Problemumgehung: Wenn Sie Dateien vor dem Verstecken bereitstellen, git stash show -pfunktioniert dies wie erwartet.

git add .
git stash save

Hinweis: Auf diese Weise gibt die Kraft Hinzufügen interaktive Teile auch hier, wie .
Achtung: Stellen Sie sicher, dass Sie keine zuvor bereitgestellten Arbeiten haben oder diese nicht unterscheiden können.
Dies kann von Nutzen sein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.