È possibile visualizzare l'anteprima dei contenuti di stash in git?


554

Spesso metto via il lavoro per dopo, poi arrivano altre cose e, qualche settimana dopo, voglio ispezionare la scorta e scoprire quali cambiamenti avrebbe apportato se lo applicassi all'albero di lavoro nel suo stato attuale.

So di poter fare un git diff sullo stash, ma questo mi mostra tutte le differenze tra l'albero di lavoro e lo stash, mentre sono solo interessato a sapere cosa cambierà lo stash.

Come posso fare questo?


1
output diff colorato: git stash show -p stash@{1} >~/.diff && vim ~/.diff(non deve essere vim. nessun editor di testo purché il tuo editor di testo abbia il supporto di evidenziazione della sintassi per l' diffoutput).
Trevor Boyd Smith,

Risposte:


729

git stash showti mostrerà i file che sono stati modificati nella tua scorta più recente. È possibile aggiungere l' -popzione per mostrare il diff.

git stash show -p

Se lo stash che ti interessa non è il più recente, aggiungi il nome dello stash alla fine del comando:

git stash show -p stash@{2}

Sembra buono, e lo vedo nel manuale, ma quando ci provo mi dà fatal: unable to create temp-file: Invalid argumentqualche idea sul perché?
Benjol,

29
Utilizzare git stash show -p stash@{0}per vedere una scorta specifica. 0 mostra l'ultimo tono, 1 il secondo ultimo .. ecc. Mostrerà git stash listtutti i disponibili.
brita_18

6
Se si utilizza PowerShell, è necessario inserire il nome dello stash tra virgolette. (es: git stash show -p 'stash@{0}')
Scott-Pascoe


1
Se vuoi salvare diff nell'uso del filegit stash show -p stash@{0}> stash.txt
S_K

87

Per visualizzare un elenco corrente di oggetti:

git stash list

Vedrai un elenco come questo:

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

Per visualizzare diff su uno di questi blocchi:

git stash show -p stash@{n}

34

Sono un fan della gitkUI grafica per visualizzare i repository git. Puoi visualizzare l'ultimo elemento nascosto con:

gitk stash

Puoi anche utilizzare Visualizza tutte le modifiche nascoste (come elencato da git stash list). Per esempio:

gitk stash@{2}

Nello screenshot seguente, puoi vedere lo stash come un commit in alto a sinistra, quando e da dove proviene nella cronologia dei commit, l'elenco dei file modificati in basso a destra e il differenziale riga per riga in basso -sinistra. Tutto mentre la scorta è ancora nascosta.

gitk sta visualizzando una scorta


5
Puoi fornire più stash@{X}valori sulla riga di comando per vedere più risultati contemporaneamente, ma non ho trovato un modo semplice per dire semplicemente "mostra tutte le voci stash" in gitk.
nobar,

5
gitk stashsembra essere una scorciatoia pergitk stash@{0}
Leif Gruenwoldt,

3
per mostrare tutti gli stash in gitk è possibile usare gitk `git stash list --pretty=format:%gd`e quindi cercare "WIP on" per passare allo stash successivo.
Ikar Pohorský,

2
gitk --reflogti consente di vedere tutti gli stash e altro ancora.
nobar,

1
gitk era l'unico strumento che mi ha mostrato direttamente che lo stash aveva file non tracciati salvati in esso. Tutti gli altri mi hanno mostrato "nessuna differenza".
Martin Bonner supporta Monica il

22

Per visualizzare tutte le modifiche in una scorta non spuntata:

git stash show -p stash@{0}

Per visualizzare le modifiche di un determinato file in una scorta non spuntata:

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

nel caso in cui uno non ricordi i nomi dei file, funziona anche con tutti i file modificati git diff HEAD stash @ {0}
Simeon,

Solo per chiarezza: -pè l'abbreviazione di --patch. L'opzione viene da git-diff. Se preferisci la forma lunga puoi scrivere git stash show --patch.
Peterino,

5

Oltre la raccomandazione di gitk in È possibile visualizzare in anteprima i contenuti di stash in git? puoi installare tig e chiamare tig stash. Questo programma di console gratuito / aperto ti consente anche di scegliere quale scorta confrontare


1
Sembra uno strumento perfetto per la gestione di più oggetti! È anche possibile pop e rilasciare stashes con Pe !rispettivamente le chiavi.
Ikar Pohorský,

Le alternative TUI sono sempre buone, ma per la gente già abituata o preferendo in qualche modo gitk è relativamente facile hackerarlo per mostrare tutte le cose .
1737973,


4

Quando questa domanda è stata posta per la prima volta, questa potrebbe non essere stata un'opzione, ma, se si utilizza PyCharm, è possibile utilizzare lo UnStash Changesstrumento (VCS-> Git-> UnStash Changes ...). Ciò consente di visualizzare l'elenco delle modifiche archiviate, nonché di pop, drop, clear o applica (in un nuovo ramo se lo si desidera):

Finestra Cambia modifiche non stash

e visualizza i file modificati per scorta:

Finestra dei percorsi interessati

così come le differenze per file. Nelle differenze puoi selezionare le singole modifiche da applicare dalle modifiche nascoste al ramo di lavoro (usando il gallone che punta a sinistra):

inserisci qui la descrizione dell'immagine


3

Puoi visualizzare l'elenco di tutti gli stash con il seguente comando:

$ 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

La scorta più recente è la prima.

Puoi semplicemente selezionare l'indice ndi scorta fornito nell'elenco sopra e usare il comando seguente per visualizzare i dettagli nascosti

git stash show -p stash@{3}

Allo stesso modo,

git stash show -p stash@{n}

Puoi anche controllare diff usando il comando:

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

3

Sì, il modo migliore per vedere cosa viene modificato è salvare in un file del genere:

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

2

Per prima cosa possiamo usare la lista di git stash per ottenere tutti gli oggetti di stash:

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

Quindi possiamo utilizzare git stash show stash@{N}per controllare i file in uno stash specifico N. Se lo spariamo, potremmo ottenere:

$ 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>...]'

La ragione potrebbe essere che il guscio sta mangiando parentesi graffe e git vede stash@2e non stash@{2}. E per risolvere questo problema dobbiamo utilizzare virgolette singole per le parentesi graffe come:

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

2

Visualizza l'elenco delle modifiche nascoste

git stash list

Per visualizzare l'elenco dei file modificati in una determinata scorta

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

Per visualizzare un determinato file in stash

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

1

Mostra tutti gli stash

Solo nomi di file:

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

Contenuto completo del file in tutti gli stash:

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

Otterrai un output diff colorato che puoi sfogliare con space ( avanti ) e b( indietro ) e qchiudere il cercapersone per lo stash corrente. Se preferisci averlo in un file, aggiungi > stashes.diffal comando.


1

In aggiunta alle risposte esistenti che suggeriscono di usare (per mostrare la diff della penultima penultima)

git stash show -p stash@{2}

Si noti che nella git-stashdocumentazione è scritto che

È inoltre possibile fare riferimento agli stash specificando solo l'indice di stash (ad esempio, l'intero nè equivalente a stash@{n}).

Pertanto è anche possibile utilizzare (questo equivale al comando sopra)

git stash show -p 2

Ciò dovrebbe anche evitare alcuni problemi di Powershell .


1

Mi piace come gitkmostrarti esattamente ciò che non è stato tracciato o seduto nell'indice, ma per impostazione predefinita mostrerà quei "commit" nascosti nel mezzo di tutti gli altri tuoi commit sul ramo corrente.

Il trucco è eseguire gitk come segue:

gitk "stash@{0}^!"

(La citazione è lì per farlo funzionare in Powershell ma in questo modo dovrebbe funzionare anche in altre shell.)

Se cerchi questa sintassi nella pagina di aiuto di gitrevisions troverai quanto segue:

La r1^!notazione include commit r1 ma esclude tutti i suoi genitori. Di per sé, questa notazione indica il singolo commit r1 .

Ciò apparentemente metterà gitk in una modalità tale da mostrare solo i genitori immediati del commit selezionato, che è esattamente quello che mi piace.


Se vuoi andare oltre e elencare tutti gli stash, puoi eseguire questo:

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

(Quelle singole virgolette all'interno dei backtick sono necessarie per placare Bash, altrimenti si lamenta del punto esclamativo)

Se sei su Windows e stai usando cmd o Powershell:

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

0

Il seguente comando può essere usato per estrarre di nuovo diff di modifiche nascoste qualsiasi altra scorta o commit o ramo o HEAD.

git stash show
git show
git diff
git difftool

Vediamo come possiamo usare ciascuno dei comandi sopra menzionati.

  1. git stash show

Il semplice comando git stash show fornisce un breve riepilogo delle modifiche al file, ma non mostrerà la differenza delle modifiche rispetto all'attuale HEAD.

  1. git show

Il comando git-show è usato per vedere vari tipi di oggetti.

Il comando git-show non viene utilizzato solo per visualizzare le modifiche dello stash, ma anche per vedere uno o più oggetti come BLOB, alberi, tag e commit.

  1. git diff

Il comando git-diff è anche uno dei comandi comuni che viene utilizzato per mostrare i cambiamenti tra commit, commit e albero di lavoro, ecc.

Per impostazione predefinita, git diff mostrerà la diff dello stash selezionato rispetto allo stato attuale del repository (file modificati) a meno che non sia specificato un altro riferimento o commit dello stash.

Per ottenere la differenza tra la maggior parte degli stash stash @ {0} e il ramo principale:

$ git diff stash @ {0} master

Visualizza solo i nomi dei file non diff delle modifiche:

$ git diff - stash solo nome @ {0} master

Vedi la differenza tra gli stash selezionati per un file selezionato:

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

  1. git difftool

Il comando git-difftool può anche essere usato per trovare diff tra stash selezionato e commit o ramo o stash selezionati

Vedi la differenza tra le ultime due sequenze:

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

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

Sommario:

Comandi che sono utili per estrarre il diff da stash git stash show, git show, git diff, git difftool selezionati.

Vedi la differenza usando il comando git stash show,

git stash show -p stash @ {0}

Guarda le modifiche nella scorta usando il comando git show,

git show stash @ {1}

Vedi la differenza tra l'ultimo stash e il commit selezionato usando il comando git diff,

git diff stash @ {0}

Riferimenti:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.