Wie kann ich sehen, welche Änderungen beim Entstapeln am aktuellen Arbeitsbaum vorgenommen werden? Ich würde gerne wissen, welche Änderungen vorgenommen werden, bevor ich sie anwende!
Standardmäßig zeigt der Befehl den diffstat an, akzeptiert jedoch jedes Format, das git diff bekannt ist (z. B. git stash show -p stash @ {1}, um den zweitletzten Stash in Patch-Form anzuzeigen).
stash@{0}ist die Standardeinstellung; Sie brauchen nur ein Argument, wenn Sie sich frühere Verstecke ansehen möchten.
Cascabel
52
Recht. Ich habe es nur geliefert, damit klar war, wie man andere Verstecke betrachtet {0}.
Amber
74
Dies zeigt nicht den Unterschied zwischen dem Stash und dem aktuellen Arbeitsverzeichnis, sondern zwischen dem Stash und seinem ursprünglichen übergeordneten Element. Recht? Aus der Manpage: "Zeigen Sie die im Stash aufgezeichneten Änderungen als Unterschied zwischen dem Stashed-Status und dem ursprünglichen übergeordneten Status an."
Magne
14
@Amber - Stimmt, obwohl es wichtig ist, wenn Ihr aktueller Arbeitsbaum schmutzig ist, und ihn etwas komplizierter macht. Ich kam aus diesem Blickwinkel darauf und fand eine Prozedur, die ich in meiner Antwort unten teilte.
Magne
6
Wofür steht das -p?
Gerald
308
So sehen Sie den neuesten Vorrat:
git stash show -p
So sehen Sie einen beliebigen Vorrat:
git stash show -p stash@{1}
Außerdem verwende ich git diff, um den Stash mit einem Zweig zu vergleichen.
Sie können verwenden:
git diff stash@{0} master
Alle Änderungen im Vergleich zum Zweigstamm anzeigen.
Dies beantwortet nicht die spezifische Frage. Wenn Sie den Stash vom Master erstellt haben (um die Arbeit für später zu speichern), dann einige Commits für andere Arbeiten am Master git diff stash@{0} masterausführen und dann einen Unterschied zwischen Ihrem Stash und dem aktuellen Master erhalten (einschließlich der Arbeit am Master nach dem Stash) wurde gemacht), nicht die Dateien / Zeilen, die der Stash ändern würde, worum es bei der Frage geht.
Tom De Leu
52
Ich bin froh, dass Sie die Frage beantwortet haben, auch wenn es keine Antwort auf die genaue Frage war. Es gab mehr Informationen, und ich finde es großartig zu wissen, wie man einen Unterschied zwischen einem Zweig und einem anderen Zweig, mit dem man ihn vergleichen möchte, ermittelt. Ich lernte auch gerne die --name-only flag :)
Rebekah Waterbury
6
Dies ermöglicht auch das Betrachten der Unterschiede mit einem benutzerdefinierten Diff-Viewer, z. B.git difftool --tool=... stash@{0} HEAD
Andre Holzner
9
@ TomDeLeu Gute Beobachtung und ein wichtiger Punkt. Um einen Stash-Gegenstand mit seinem Elternteil zu vergleichen, scheint dies zu funktionieren:git diff stash@{0}^ stash@{0}
erikprice
1
Sie können auch den Dateinamen hinzufügen git diff stash@{0} master -- filename, um die Änderungen an einer bestimmten Datei abzurufen.
David
104
Wenn sich der Zweig, auf dem Ihre Änderungen basieren, in der Zwischenzeit geändert hat, kann dieser Befehl hilfreich sein:
git diff stash@{0}^!
Dies vergleicht den Stash mit dem Commit, auf dem er basiert.
so gut, dass ich einen Alias hinzugefügt habe zu ~/.gitconfig:laststash = diff stash@{0}^!
sbeam
5
Perfektes Paar: git difftool stash^!für Diff des letzten Stashs gegen Commit, basierend auf, git difftool stash HEADfür Diff des letzten Stashs gegen aktuelles Commit (Stash @ {n} für frühere Stashes)
"git diff stash @ {0} ^!" läuft auf "git diff stash @ {0} ^ stash @ {0} ~ 1 ^ stash @ {0} ~ 2 ......." hinaus, aber da git diff nur 2 Commits benötigt, zeigt es den Unterschied zwischen stash @ {0} und ^ stash @ {0} ~ 1 und das ^ am Anfang des 2. Commits macht keinen Unterschied und Git ignoriert es.
Naga Kiran
Ich bevorzuge diese Version, um mein bevorzugtes Diff-Tool verwenden zu können (Beyond Compare natürlich!). Dies zeigt auch die Änderung in diesem Stash, von der ich glaube, dass sie die ursprüngliche Frage ist, im Gegensatz zu einer Alternative, die in den obigen Kommentaren "git diff stash @ {X} ^ stash @ {X}" erwähnt wurde und mehr als nur das versteckte Diff zeigt.
user107172
44
Wenn Ihr Arbeitsbaum schmutzig ist , können Sie ihn mit einem Stash vergleichen, indem Sie zuerst den schmutzigen Arbeitsbaum festschreiben und ihn dann mit dem Stash vergleichen. Anschließend können Sie das Commit mit dem Dirty Working Tree rückgängig machen (da Sie dieses Dirty Commit möglicherweise nicht in Ihrem Commit-Protokoll haben möchten).
Sie können auch den folgenden Ansatz verwenden, um zwei Verstecke miteinander zu vergleichen (in diesem Fall platzieren Sie zuerst nur einen der Verstecke).
Legen Sie Ihren schmutzigen Arbeitsbaum fest:
git add .
git commit -m "Dirty commit"
Diff the stash mit diesem Commit:
git diff HEAD stash@{0}
Anschließend können Sie das Commit zurücksetzen und wieder in das Arbeitsverzeichnis einfügen:
git reset --soft HEAD~1
git reset .
Jetzt haben Sie den schmutzigen Arbeitsbaum mit Ihrem Vorrat entfernt und sind wieder da, wo Sie ursprünglich waren.
Gibt es eine Möglichkeit, dies zu tun, aber nur einen Unterschied der Dateien zu sehen, die durch das, was sich im Stash befindet, geändert würden?
Lagweezle
Im Jahr 2020 ist dies viel einfacher; Schauen Sie sich meine aktuelle Antwort an .
David Deprost
Interessant, ich wusste nichts davon git stash show -l . Unterscheidet es den neuesten Vorrat gegen die funktionierende (schmutzige) Kopie? Wie benutzt man es ohne zu bekommen error: switch l requires a value?
Magne
Ja, es unterscheidet sich von der (möglicherweise schmutzigen) Arbeitskopie. Sie verwenden es einfach durch Eingabe git stash show -l. Warum es bei Ihnen nicht funktioniert, kann ich nur vermuten, dass Sie eine ältere Version von git verwenden? Ich bin auf Git v2.20.1 und es funktioniert einwandfrei ohne Fehler.
David Deprost
25
@ Magnes Antwort ist die einzige bis (sehr späte) Antwort, die die flexibelste / nützlichste Interpretation der Frage beantwortet, aber sie ist ein bisschen komplizierter als nötig. Anstatt festzuschreiben und zurückzusetzen, verstauen Sie einfach Ihre Arbeitskopie, vergleichen Sie sie und entfernen Sie sie.
git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop
Dies zeigt Ihnen die Unterschiede zwischen dem oberen Rand des Stash-Stapels und Ihrem Arbeitsordner, indem Sie vorübergehend Änderungen an Ihrem Arbeitsordner zum oberen Rand des Stash-Stapels vornehmen (stash @ {0}) und den ursprünglichen oberen Rand nach unten verschieben (stash @ {1}) ) Vergleichen Sie dann das ursprüngliche Oberteil an der Position "Neues Set", damit Sie die Änderungen sehen, die sich ergeben würden, wenn Sie es auf Ihre aktuelle Arbeit anwenden.
"Aber was ist, wenn ich keine aktuelle Arbeit habe?" Dann sind Sie im normalen langweiligen Fall. Verwenden Sie einfach die Antwort von @ Amber
git stash show
oder die Antwort von @ czerasz
git diff stash@{0}
oder geben Sie zu, dass das Verstauen und Entstapeln sowieso schnell und einfach ist. Entstapeln Sie einfach die Änderungen und überprüfen Sie sie. Wenn Sie sie im Moment nicht möchten, werfen Sie sie weg (der aktuelle Index / Arbeitsordner ändert sich). In vollem Umfang ist das
Dieser einfache Ansatz (Versteck und dann Vergleich mit einem anderen Versteck) ist sicher und leicht zu verstehen. Für einige Anwendungsfälle möchten Sie möglicherweise auch nicht verfolgte Dateien mitgit stash save -u
mleonard
19
Dies funktioniert für mich auf Git-Version 1.8.5.2:
Irreführend! Die Frage ist: Wie kann ich sehen, welche Änderungen durch das Entstapeln am aktuellen Arbeitsbaum vorgenommen werden? Dies zeigt den Unterschied zwischen dem Versteck und dem KOPF, der sich SEHR von dem unterscheiden kann, was angewendet wird git stash apply.
MikeJansen
Bitte lesen Sie auf der Frage mehr "Ich würde gerne wissen, welche Änderungen vorgenommen werden, bevor Sie sie anwenden!". Ich gebe eine schnelle Antwort darauf.
Yerlilbilgin
Sie können auch sehen, dass es bei allen anderen Antworten irgendwie darum geht, den aktuellen Kopf (oder Arbeitssatz) gegen das Versteck zu unterscheiden. Warum ist nur meine Antwort irreführend? Das ist nicht fair.
Yerlilbilgin
@yerlilbilgin Siehe meine Antwort auf Ihre Antwort unten.
MikeJansen
Wir können HEAD weglassen, es ist standardmäßig, nicht wahr?
Al.G.
10
Verwenden Sie den folgenden Befehl, um eine Datei im Arbeitsbaum und im Stash zu vergleichen
Irreführend! Die Frage ist: Wie kann ich sehen, welche Änderungen durch das Entstapeln am aktuellen Arbeitsbaum vorgenommen werden? Dies zeigt den Unterschied zwischen dem Versteck und dem KOPF, der sich SEHR von dem unterscheiden kann, was angewendet wird git stash apply.
MikeJansen
1
Wenn Sie der Meinung sind, dass dies irreführend ist, überprüfen Sie bitte alle anderen Antworten. Das ist nicht fair!
Yerlilbilgin
1
Sie werden feststellen, dass ich denselben Kommentar in die andere Antwort kopiert habe, die genauso irreführend war (so ziemlich dieselbe Antwort). Andere Antworten, die bereits einen ähnlichen Kommentar hatten, habe ich alleine gelassen. Wenn Sie verstehen, wie Git Stash funktioniert, werden Sie feststellen, dass es nicht darum geht, den Stash gegen HEAD zu unterscheiden (was das OP verlangt). Das eigentliche "Stash" ist der Unterschied zwischen dem Stash-Commit und dem, was davor war. Dieser Patch wird dann auf den HEAD angewendet. Wenn Sie also wissen möchten, was das OP gefragt hat, müssen Sie den Unterschied zwischen dem Stash und dem Commit davor anzeigen, was die richtigen Antworten bewirken.
MikeJansen
1
Dies beantwortet die Frage direkter als jede andere (unnötig) lange Antwort und macht genau das, was das OP gefragt hat, ohne sie zu entfernen HEAD. Ich könnte die Antwort von @ yerlilbilgin ändern, um HEAD zu entfernen, aber ich denke, jeder, der git verwendet, kann diesen Teil herausfinden und eine Verlängerung der Antwort würde ihn weniger lesbar machen. Keine Schuld an @yerlibilgin.
Sridhar Sarnobat
4
Eine Möglichkeit, dies zu tun, ohne etwas zu bewegen, besteht darin, die Tatsache auszunutzen, dass patchGit-Diffs gelesen werden können (im Grunde genommen einheitliche Diffs).
git stash show -p | patch -p1 --verbose --dry-run
Dies zeigt Ihnen eine schrittweise Vorschau dessen, was Patch normalerweise tun würde. Der zusätzliche Vorteil dabei ist, dass sich der Patch auch nicht daran hindert, den Patch in den Arbeitsbaum zu schreiben. Wenn Sie aus irgendeinem Grund nur git benötigen, um das Festschreiben vor dem Ändern zu beenden, entfernen Sie --dry- Führen Sie die ausführlichen Anweisungen aus und befolgen Sie sie.
FWIW Dies kann für alle anderen Antworten etwas redundant sein und ist der akzeptierten Antwort, die genau richtig ist, sehr ähnlich. aber vielleicht hilft es jemandem.
git stash show --helpwird dir alles geben, was du brauchst; einschließlich Stash Show Info.
show [<stash>]
Zeigen Sie die im Stash aufgezeichneten Änderungen als Unterschied zwischen dem Stashed-Status und dem ursprünglichen übergeordneten Status an. Wenn nein angegeben ist, wird die neueste angezeigt. Standardmäßig zeigt der Befehl den diffstat an, akzeptiert jedoch jedes Format, das git diff bekannt ist (z. B. git stash show -p stash @ {1}, um den zweitletzten Stash in Patch-Form anzuzeigen). Sie können die Konfigurationsvariablen stash.showStat und / oder stash.showPatch verwenden, um das Standardverhalten zu ändern.
git stash list
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2
Holen Sie sich also die Stash-Nummer und machen Sie:
Du kannst tun:
git stash show -p stash@{1}
Aber wenn Sie einen Unterschied wollen (dies ist anders, um den Stash anzuzeigen, deshalb schreibe ich diese Antwort. DiffBetrachten Sie den aktuellen Code in Ihrer Branche und showzeigen Sie einfach, was Sie anwenden werden ).
Sie können verwenden:
git diff stash@{0}
oder
git diff stash@{0} <branch name>
Eine weitere interessante Sache ist:
git stash apply
git stash apply stash@{10}
Dadurch wird der Stash angewendet git checkout ., ohne ihn aus der Liste zu entfernen. Sie können diese Änderungen entfernen oder, wenn Sie gerne git stash drop stash@{10}einen Stash aus der Liste entfernen möchten.
Von hier aus empfehle ich niemals, git stash popeine Kombination aus git stash applyund zu verwenden. git stash dropWenn Sie einen Stash in der falschen Verzweigung anwenden, ist es manchmal schwierig, Ihren Code wiederherzustellen.
Abhängig davon, womit Sie den Stash vergleichen möchten (lokaler Arbeitsbaum / übergeordnetes Commit / Head-Commit), stehen tatsächlich mehrere Befehle zur Verfügung, darunter der gute alte git diffund der spezifischere git stash show:
╔══════════════════════╦═══════════════════════════════╦═══════════════════╗
║ Compare stash with ↓ ║ git diff ║ git stash show ║
╠══════════════════════╬═══════════════════════════════╬═══════════════════╣
║ Local working tree ║ git diff stash@{0} ║ git stash show -l ║
║----------------------║-------------------------------║-------------------║
║ Parent commit ║ git diff stash@{0}^ stash@{0} ║ git stash show -p ║
║----------------------║-------------------------------║-------------------║
║ HEAD commit ║ git diff stash@{0} HEAD ║ / ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝
Während git stash showAussehen benutzerfreundlicher auf den ersten Blick, git diffist eigentlich mehr in mächtig , dass es erlaubt Dateinamen für eine gezieltere diff angeben. Ich habe persönlich Aliase für all diese Befehle in meinem zsh git Plugin eingerichtet .
Antworten:
Siehe den neuesten Vorrat:
Siehe einen beliebigen Vorrat:
Aus den
git stash
Manpages:quelle
stash@{0}
ist die Standardeinstellung; Sie brauchen nur ein Argument, wenn Sie sich frühere Verstecke ansehen möchten.{0}
.-p
?So sehen Sie den neuesten Vorrat:
So sehen Sie einen beliebigen Vorrat:
Außerdem verwende ich git diff, um den Stash mit einem Zweig zu vergleichen.
Sie können verwenden:
Alle Änderungen im Vergleich zum Zweigstamm anzeigen.
Oder Sie können verwenden:
Um einfach nur geänderte Dateinamen zu finden.
quelle
git diff stash@{0} master
ausführen und dann einen Unterschied zwischen Ihrem Stash und dem aktuellen Master erhalten (einschließlich der Arbeit am Master nach dem Stash) wurde gemacht), nicht die Dateien / Zeilen, die der Stash ändern würde, worum es bei der Frage geht.git difftool --tool=... stash@{0} HEAD
git diff stash@{0}^ stash@{0}
git diff stash@{0} master -- filename
, um die Änderungen an einer bestimmten Datei abzurufen.Wenn sich der Zweig, auf dem Ihre Änderungen basieren, in der Zwischenzeit geändert hat, kann dieser Befehl hilfreich sein:
Dies vergleicht den Stash mit dem Commit, auf dem er basiert.
quelle
~/.gitconfig
:laststash = diff stash@{0}^!
git difftool stash^!
für Diff des letzten Stashs gegen Commit, basierend auf,git difftool stash HEAD
für Diff des letzten Stashs gegen aktuelles Commit (Stash @ {n} für frühere Stashes)Wenn Ihr Arbeitsbaum schmutzig ist , können Sie ihn mit einem Stash vergleichen, indem Sie zuerst den schmutzigen Arbeitsbaum festschreiben und ihn dann mit dem Stash vergleichen. Anschließend können Sie das Commit mit dem Dirty Working Tree rückgängig machen (da Sie dieses Dirty Commit möglicherweise nicht in Ihrem Commit-Protokoll haben möchten).
Sie können auch den folgenden Ansatz verwenden, um zwei Verstecke miteinander zu vergleichen (in diesem Fall platzieren Sie zuerst nur einen der Verstecke).
Legen Sie Ihren schmutzigen Arbeitsbaum fest:
Diff the stash mit diesem Commit:
Anschließend können Sie das Commit zurücksetzen und wieder in das Arbeitsverzeichnis einfügen:
Jetzt haben Sie den schmutzigen Arbeitsbaum mit Ihrem Vorrat entfernt und sind wieder da, wo Sie ursprünglich waren.
quelle
git stash show -l
. Unterscheidet es den neuesten Vorrat gegen die funktionierende (schmutzige) Kopie? Wie benutzt man es ohne zu bekommenerror: switch l requires a value
?git stash show -l
. Warum es bei Ihnen nicht funktioniert, kann ich nur vermuten, dass Sie eine ältere Version von git verwenden? Ich bin auf Git v2.20.1 und es funktioniert einwandfrei ohne Fehler.@ Magnes Antwort ist die einzige bis (sehr späte) Antwort, die die flexibelste / nützlichste Interpretation der Frage beantwortet, aber sie ist ein bisschen komplizierter als nötig. Anstatt festzuschreiben und zurückzusetzen, verstauen Sie einfach Ihre Arbeitskopie, vergleichen Sie sie und entfernen Sie sie.
Dies zeigt Ihnen die Unterschiede zwischen dem oberen Rand des Stash-Stapels und Ihrem Arbeitsordner, indem Sie vorübergehend Änderungen an Ihrem Arbeitsordner zum oberen Rand des Stash-Stapels vornehmen (stash @ {0}) und den ursprünglichen oberen Rand nach unten verschieben (stash @ {1}) ) Vergleichen Sie dann das ursprüngliche Oberteil an der Position "Neues Set", damit Sie die Änderungen sehen, die sich ergeben würden, wenn Sie es auf Ihre aktuelle Arbeit anwenden.
"Aber was ist, wenn ich keine aktuelle Arbeit habe?" Dann sind Sie im normalen langweiligen Fall. Verwenden Sie einfach die Antwort von @ Amber
oder die Antwort von @ czerasz
oder geben Sie zu, dass das Verstauen und Entstapeln sowieso schnell und einfach ist. Entstapeln Sie einfach die Änderungen und überprüfen Sie sie. Wenn Sie sie im Moment nicht möchten, werfen Sie sie weg (der aktuelle Index / Arbeitsordner ändert sich). In vollem Umfang ist das
quelle
git stash save -u
Dies funktioniert für mich auf Git-Version 1.8.5.2:
quelle
git stash apply
.Verwenden Sie den folgenden Befehl, um eine Datei im Arbeitsbaum und im Stash zu vergleichen
quelle
Wenn Sie Tools für Diff haben (wie unvergleichlich)
quelle
git stash apply
.HEAD
. Ich könnte die Antwort von @ yerlilbilgin ändern, um HEAD zu entfernen, aber ich denke, jeder, der git verwendet, kann diesen Teil herausfinden und eine Verlängerung der Antwort würde ihn weniger lesbar machen. Keine Schuld an @yerlibilgin.Eine Möglichkeit, dies zu tun, ohne etwas zu bewegen, besteht darin, die Tatsache auszunutzen, dass
patch
Git-Diffs gelesen werden können (im Grunde genommen einheitliche Diffs).Dies zeigt Ihnen eine schrittweise Vorschau dessen, was Patch normalerweise tun würde. Der zusätzliche Vorteil dabei ist, dass sich der Patch auch nicht daran hindert, den Patch in den Arbeitsbaum zu schreiben. Wenn Sie aus irgendeinem Grund nur git benötigen, um das Festschreiben vor dem Ändern zu beenden, entfernen Sie --dry- Führen Sie die ausführlichen Anweisungen aus und befolgen Sie sie.
quelle
Die Kombination , was ich in diesem Thread und in erfuhr diese , wenn ich sehen will „ was in der Stash ist“, ich zum ersten Mal ausgeführt wird :
Das zeigt, welche Dateien geändert wurden. Um ein schönes visuelles Diff in einem Difftool zu erhalten, mache ich Folgendes:
Dadurch werden alle Unterschiede des angegebenen Stashs gegenüber dem übergeordneten Element auf einmal angezeigt.
Sie können das Diff-Tool in konfigurieren
~/.gitconfig
, z. B. mit Meld :quelle
FWIW Dies kann für alle anderen Antworten etwas redundant sein und ist der akzeptierten Antwort, die genau richtig ist, sehr ähnlich. aber vielleicht hilft es jemandem.
git stash show --help
wird dir alles geben, was du brauchst; einschließlich Stash Show Info.quelle
Sie die Liste der Vorräte
Holen Sie sich also die Stash-Nummer und machen Sie:
Du kannst tun:
Aber wenn Sie einen Unterschied wollen (dies ist anders, um den Stash anzuzeigen, deshalb schreibe ich diese Antwort.
Diff
Betrachten Sie den aktuellen Code in Ihrer Branche undshow
zeigen Sie einfach, was Sie anwenden werden ).Sie können verwenden:
oder
Eine weitere interessante Sache ist:
Dadurch wird der Stash angewendet
git checkout .
, ohne ihn aus der Liste zu entfernen. Sie können diese Änderungen entfernen oder, wenn Sie gernegit stash drop stash@{10}
einen Stash aus der Liste entfernen möchten.Von hier aus empfehle ich niemals,
git stash pop
eine Kombination ausgit stash apply
und zu verwenden.git stash drop
Wenn Sie einen Stash in der falschen Verzweigung anwenden, ist es manchmal schwierig, Ihren Code wiederherzustellen.quelle
Abhängig davon, womit Sie den Stash vergleichen möchten (lokaler Arbeitsbaum / übergeordnetes Commit / Head-Commit), stehen tatsächlich mehrere Befehle zur Verfügung, darunter der gute alte
git diff
und der spezifischeregit stash show
:Während
git stash show
Aussehen benutzerfreundlicher auf den ersten Blick,git diff
ist eigentlich mehr in mächtig , dass es erlaubt Dateinamen für eine gezieltere diff angeben. Ich habe persönlich Aliase für all diese Befehle in meinem zsh git Plugin eingerichtet .quelle