Git Diff gegen einen Stash


Antworten:


1872

Siehe den neuesten Vorrat:

git stash show -p

Siehe einen beliebigen Vorrat:

git stash show -p stash@{1}

Aus den git stashManpages:

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).


72
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.


Oder Sie können verwenden:

git diff --name-only stash@{0} master

Um einfach nur geänderte Dateinamen zu finden.


10
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)
ChrisV

17
Für diejenigen, die wie ich waren und das ^ noch nie gesehen haben! vorher: begehen ^! ist ein Bereichsspezifizierer, was bedeutet: dieses Commit, aber keines seiner Eltern.
Jonathan Gawrych

"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

git stash apply
git diff
git reset
git checkout

3
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:

git diff stash HEAD

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

git diff stash@{0} -- fileName (with path)

9

Wenn Sie Tools für Diff haben (wie unvergleichlich)

git difftool stash HEAD

1
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.


2

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 :

git stash show stash@{0}

Das zeigt, welche Dateien geändert wurden. Um ein schönes visuelles Diff in einem Difftool zu erhalten, mache ich Folgendes:

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

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 :

...
[diff]
    tool = meld

1

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.


1

Sie die Liste der Vorräte

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.


1

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 .

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.