Ist es möglich, Stash-Inhalte in Git in der Vorschau anzuzeigen?


554

Ich lege oft Arbeit für später weg, dann kommen andere Dinge hinzu, und ein paar Wochen später möchte ich den Vorrat untersuchen und herausfinden, welche Änderungen er vornehmen würde, wenn ich ihn auf den Arbeitsbaum in seinem aktuellen Zustand anwenden würde.

Ich weiß, dass ich einen Git-Diff auf dem Stash machen kann, aber dies zeigt mir alle Unterschiede zwischen dem Arbeitsbaum und dem Stash, während ich nur interessiert bin, was sich für den Stash-Apply ändern wird.

Wie kann ich das machen?


1
kolorierte Diff-Ausgabe: git stash show -p stash@{1} >~/.diff && vim ~/.diff(muss kein vimTexteditor sein, solange Ihr Texteditor Syntax-Hervorhebungsunterstützung für die diffAusgabe bietet ).
Trevor Boyd Smith

Antworten:


728

git stash showzeigt Ihnen die Dateien, die sich in Ihrem letzten Stash geändert haben. Sie können die -pOption hinzufügen , um das Diff anzuzeigen.

git stash show -p

Wenn der Stash, an dem Sie interessiert sind, nicht der aktuellste ist, fügen Sie den Namen des Stashs am Ende des Befehls hinzu:

git stash show -p stash@{2}

Das sieht gut aus und ich sehe es im Handbuch, aber wenn ich es versuche, bekomme ich fatal: unable to create temp-file: Invalid argumenteine Idee warum?
Benjol

29
Verwenden Sie git stash show -p stash@{0}diese Option, um einen bestimmten Vorrat anzuzeigen. 0 zeigt den letzten Ton, 1 den vorletzten .. usw. git stash listzeigt alle verfügbaren an.
Brita_

6
Wenn Sie PowerShell verwenden, müssen Sie den Stash-Namen in Anführungszeichen setzen. (zB: git stash show -p 'stash@{0}')
Scott-pascoe


1
Wenn Sie Diff in der Datei speichern möchten, verwenden Siegit stash show -p stash@{0}> stash.txt
S_K

87

So zeigen Sie eine aktuelle Liste der Vorräte an:

git stash list

Sie sehen eine Liste wie diese:

stash@{0}: WIP on ...
stash@{1}: ...
stash@{2}: ...
...

So zeigen Sie Unterschiede bei diesen Verstecken an:

git stash show -p stash@{n}

34

Ich bin ein Fan der gitkgrafischen Benutzeroberfläche zur Visualisierung von Git-Repos. Sie können den letzten Artikel anzeigen, der mit:

gitk stash

Sie können auch die Ansicht Ihrer versteckten Änderungen (wie von aufgelistet git stash list) verwenden. Zum Beispiel:

gitk stash@{2}

Im folgenden Screenshot sehen Sie den Stash oben links als Commit, wann und woher er im Commit-Verlauf stammt, die Liste der unten rechts geänderten Dateien und den zeilenweisen Unterschied unten -links. Während das Versteck noch versteckt ist.

Gitk sieht sich ein Versteck an


5
Sie können mehrere stash@{X}Werte in der Befehlszeile angeben, um mehr Ergebnisse gleichzeitig anzuzeigen, aber ich habe keine einfache Möglichkeit gefunden, in gitk einfach "Alle Stash-Einträge anzeigen" zu sagen.
Nobar

5
gitk stashscheint eine Abkürzung fürgitk stash@{0}
Leif Gruenwoldt

3
Um alle Stashes in Gitk anzuzeigen, können Sie verwenden gitk `git stash list --pretty=format:%gd`und dann nach "WIP on" suchen, um zum nächsten Stash zu springen.
Ikar Pohorský

2
gitk --reflogHier können Sie alle Verstecke und mehr sehen.
Nobar

1
gitk war das einzige Tool, das mir direkt zeigte, dass im Stash nicht verfolgte Dateien gespeichert waren. Alle anderen zeigten mir nur "keine Unterschiede".
Martin Bonner unterstützt Monica

22

So zeigen Sie alle Änderungen in einem nicht platzierten Stash an:

git stash show -p stash@{0}

So zeigen Sie die Änderungen einer bestimmten Datei in einem nicht geöffneten Stash an:

git diff HEAD stash@{0} -- path/to/filename.php

Falls man sich nicht an die Dateinamen erinnert, funktioniert es auch für alle Dateien, die geändert wurden. git diff HEAD stash @ {0}
Simeon

Nur zur Klarheit: -psteht für --patch. Die Option kommt von git-diff. Wenn Sie die lange Form bevorzugen, können Sie schreiben git stash show --patch.
Peterino

5

Über die Gitk-Empfehlung in Ist es möglich, Stash-Inhalte in Git in der Vorschau anzuzeigen ? Sie können tig installieren und anrufen tig stash. Mit diesem kostenlosen / offenen Konsolenprogramm können Sie auch auswählen, welcher Stash verglichen werden soll


1
Sieht aus wie ein perfektes Tool zum Verwalten mehrerer Stashes! Sie können auch Pop und Drop stashes mit Pund !jeweils Tasten.
Ikar Pohorský

TUI-Alternativen sind immer gut, aber für die Leute, die es bereits gewohnt sind oder es irgendwie bevorzugen gitk , ist es relativ einfach, sie zu hacken, um alle Verstecke zu zeigen .
1737973


4

Als diese Frage zum ersten Mal gestellt wurde, war dies möglicherweise keine Option. Wenn Sie jedoch PyCharm verwenden, können Sie das UnStash ChangesTool verwenden (VCS-> Git-> UnStash Changes ...). Auf diese Weise können Sie die Liste der versteckten Änderungen anzeigen sowie Pop, Drop, Clear oder Apply (falls gewünscht in einen neuen Zweig):

Fenster "Änderungen entfernen"

und zeigen Sie die geänderten Dateien pro Stash an:

Fenster "Betroffene Pfade"

sowie Unterschiede pro Datei. In den Diffs können Sie einzelne Änderungen auswählen, die aus den versteckten Änderungen auf den Arbeitszweig angewendet werden sollen (unter Verwendung des nach links zeigenden Chevrons):

Geben Sie hier die Bildbeschreibung ein


3

Sie können die Liste aller Stashes mit dem folgenden Befehl anzeigen:

$ git stash list

stash@{0}: WIP on dev: ddd4d75 spelling fix

stash@{1}: WIP on dev: 40e65a8 setting width for messages

......

......

......


stash@{12}: WIP on dev: 264fdab added token based auth

Das neueste Versteck ist das erste.

Sie können einfach nden in der obigen Liste angegebenen Versteckindex auswählen und mit dem folgenden Befehl die Versteckdetails anzeigen

git stash show -p stash@{3}

Ähnlich,

git stash show -p stash@{n}

Sie können diff auch mit dem folgenden Befehl überprüfen:

git diff HEAD stash@{n} -- /path/to/file

3

Ja, der beste Weg, um zu sehen, was geändert wird, besteht darin, in einer solchen Datei zu speichern:

git stash show -p stash@{0} > stash.txt

2

Zuerst können wir die Git-Stash-Liste verwenden, um alle Stash-Elemente zu erhalten:

$git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ....
stash@{2}: WIP on ...

Dann können wir git stash show stash@{N}die Dateien unter einem bestimmten Stash überprüfen N. Wenn wir es abfeuern, können wir bekommen:

$ git stash show stash@{2}
fatal: ambiguous argument 'stash@2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Der Grund dafür kann sein, dass die Muschel geschweifte Klammern auffrisst und Git sieht stash@2und nicht stash@{2}. Und um dies zu beheben, müssen wir einfache Anführungszeichen für geschweifte Klammern verwenden als:

git stash show stash@'{2'}
com/java/myproject/my-xml-impl.xml                     | 16 ++++++++--------
com/java/myproject/MyJavaClass.java                    | 16 ++++++++--------
etc.

2

Liste der versteckten Änderungen anzeigen

git stash list

Zum Anzeigen der Liste der Dateien, die in einem bestimmten Stash geändert wurden

git stash show -p stash@{0} --name-only

Zum Anzeigen einer bestimmten Datei im Stash

git show stash@{0} path/to/file

1

Zeige alle Verstecke

Nur Dateinamen:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show $i; done

Vollständiger Dateiinhalt in allen Verstecken:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show -p $i; done

Sie erhalten eine kolorierte Diff-Ausgabe, mit der Sie space ( vorwärts ) und b( rückwärts ) qblättern und den Pager für den aktuellen Stash schließen können. Wenn Sie es lieber in einer Datei haben möchten, fügen Sie > stashes.diffes dem Befehl hinzu.


1

Zusätzlich zu den vorhandenen Antworten, die die Verwendung vorschlagen (um den Unterschied zwischen dem drittletzten Vorrat anzuzeigen)

git stash show -p stash@{2}

Beachten Sie, dass in der git-stashDokumentation geschrieben steht, dass

Stashes kann auch durch die Angabe nur den Vorrat Index referenziert werden (zB die ganze Zahl nentspricht stash@{n}).

Daher ist es auch möglich zu verwenden (dies entspricht dem obigen Befehl)

git stash show -p 2

Dies sollte auch einige Powershell-Probleme vermeiden .


1

Mir gefällt, wie gitkSie genau anzeigen können, was nicht verfolgt wurde oder sich im Index befindet, aber standardmäßig werden diese "Commits" in der Mitte aller anderen Commits im aktuellen Zweig angezeigt.

Der Trick besteht darin, gitk wie folgt auszuführen:

gitk "stash@{0}^!"

(Das Zitat dient dazu, dass es in Powershell funktioniert, aber auf diese Weise sollte es auch in anderen Shells funktionieren.)

Wenn Sie diese Syntax auf der Hilfeseite von gitrevisions nachschlagen, finden Sie Folgendes:

Die r1^!Notation enthält Commit r1 , schließt jedoch alle Eltern aus. Diese Notation bezeichnet für sich genommen das einzelne Commit r1 .

Dies wird anscheinend gitk in einen solchen Modus versetzen, dass nur die unmittelbaren Eltern des ausgewählten Commits angezeigt werden, was genau das ist, was ich mag.


Wenn Sie dies weiter verfolgen und alle Verstecke auflisten möchten, können Sie Folgendes ausführen:

gitk `git stash list '--pretty=format:%gd^!'`

(Diese einfachen Anführungszeichen in den Backticks sind erforderlich, um Bash zu beschwichtigen, andernfalls wird das Ausrufezeichen beanstandet.)

Wenn Sie unter Windows arbeiten und cmd oder Powershell verwenden:

gitk "--argscmd=git stash list --pretty=format:%gd^!"

0

Der folgende Befehl kann verwendet werden, um Diff von versteckten Änderungen gegen andere Stashs oder Commits oder Zweige oder HEADs zu extrahieren.

git stash show
git show
git diff
git difftool

Mal sehen, wie wir jeden der oben genannten Befehle verwenden können.

  1. Git Stash Show

Der einfache Befehl git stash show bietet eine sehr kurze Zusammenfassung der Änderungen der Datei, zeigt jedoch nicht den Unterschied der Änderungen gegenüber dem aktuellen HEAD.

  1. Git Show

Mit dem Befehl git-show werden verschiedene Objekttypen angezeigt.

Der Befehl git-show wird nicht nur zum Visualisieren von Stash-Änderungen verwendet, sondern auch zum Anzeigen eines oder mehrerer Objekte wie Blobs, Bäume, Tags und Commits.

  1. Git Diff

Der Befehl git-diff ist auch ein allgemeiner Befehl, mit dem Änderungen zwischen Commits, Commit und Arbeitsbaum usw. angezeigt werden.

Standardmäßig zeigt git diff den Unterschied des ausgewählten Stashs zum aktuellen Status des Repositorys (geänderte Dateien) an, sofern keine andere Stash-Referenz oder Commit angegeben ist.

Um den Unterschied zwischen dem obersten Versteck @ {0} und dem Hauptzweig zu ermitteln:

$ git diff stash @ {0} master

Zeigen Sie nur die Namen der Dateien an, nicht die Unterschiede der Änderungen:

$ git diff - Nur-Name-Stash @ {0} Master

Sehen Sie den Unterschied zwischen ausgewählten Verstecken für eine ausgewählte Datei:

$ git diff stash @ {0} ^ 1 stash @ {0} -

  1. Git Difftool

Der Befehl git-difftool kann auch verwendet werden, um Unterschiede zwischen ausgewähltem Stash und ausgewähltem Commit oder Branch oder Stash zu finden

Sehen Sie den Unterschied zwischen den letzten beiden Verstecken:

$ git difftool stash @ {0} stash @ {0} ^ 1

git difftool --dir-diff stash @ {0} stash @ {0} ^ 1

Zusammenfassung:

Befehle, die nützlich sind, um das Diff aus ausgewählten Stash-Git-Stash-Shows, Git-Shows, Git-Diffs und Git-Difftools zu extrahieren.

Siehe Unterschied mit dem Befehl git stash show,

git stash show -p stash @ {0}

Sehen Sie sich die Änderungen im Stash mit dem Befehl git show an.

git show stash @ {1}

Ermitteln Sie den Unterschied zwischen dem letzten Stash und dem ausgewählten Commit mit dem Befehl git diff.

git diff stash @ {0}

Verweise:

https://howto.lintel.in/how-to-see-stashed-changes-using-git-stash/

https://git-scm.com/docs/git-show

https://git-scm.com/docs/git-stash

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.