Git diff contro una scorta


Risposte:


1873

Vedi lo stash più recente:

git stash show -p

Vedi una scorta arbitraria:

git stash show -p stash@{1}

Dalle git stashmanpage:

Per impostazione predefinita, il comando mostra il diffstat, ma accetta qualsiasi formato noto a git diff (ad esempio, git stash show -p stash @ {1} per visualizzare il secondo stash più recente in forma di patch).


72
stash@{0}è il valore predefinito; hai solo bisogno di un argomento se vuoi guardare gli stash precedenti.
Cascabel,

52
Giusto. L'ho semplicemente fornito in modo che fosse chiaro come guardare altre scorte oltre {0}.
Ambra

74
Questo non mostrerà la differenza tra lo stash e la directory di lavoro corrente, ma tra lo stash e il suo genitore originale. Giusto? Dalla manpage: "Mostra le modifiche registrate nello stash come diff tra lo stato stash e il suo genitore originale."
Magne,

14
@Amber - Vero, anche se il tuo attuale albero di lavoro è sporco, è importante e lo rende un po 'più complicato. Ci sono arrivato da quell'angolazione e ho trovato una procedura che ho condiviso nella mia risposta di seguito.
Magne,

6
cosa significa -p?
Gerald

308

Per vedere la scorta più recente:

git stash show -p

Per vedere una scorta arbitraria:

git stash show -p stash@{1}

Inoltre, utilizzo git diff per confrontare lo stash con qualsiasi ramo.

Puoi usare:

git diff stash@{0} master

Per vedere tutte le modifiche rispetto al branch master.


Oppure puoi usare:

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

Per trovare facilmente solo i nomi di file modificati.


10
Questo non risponde alla domanda specifica. Se hai creato lo stash dal master (per salvare il lavoro per dopo), quindi esegui alcuni commit per altri lavori sul master, quindi git diff stash@{0} masterottieni una differenza della tua scorta rispetto al master corrente (che include il lavoro svolto sul master dopo lo stash è stato creato), non i file / le linee che lo stash cambierebbe, che è la domanda.
Tom De Leu,

52
Sono contento che tu abbia risposto alla domanda anche se non era una risposta alla domanda esatta. Ha fornito ulteriori informazioni e penso che sia fantastico sapere come ottenere una differenza tra un ramo e qualsiasi altro ramo in cui desideri confrontarlo. Mi è piaciuto anche imparare la bandiera --name-only :)
Rebekah Waterbury il

6
ciò consente anche di esaminare le differenze utilizzando un visualizzatore di differenze personalizzato, ad esempiogit difftool --tool=... stash@{0} HEAD
Andre Holzner,

9
@TomDeLeu Buona osservazione e un punto importante. Per confrontare un oggetto di scorta con il suo genitore, questo sembra funzionare:git diff stash@{0}^ stash@{0}
erikprice il

1
Inoltre, puoi aggiungere il nome file git diff stash@{0} master -- filenameper ottenere le modifiche a un file specifico.
David

104

Se il ramo su cui si basano le modifiche nascoste è cambiato nel frattempo, questo comando può essere utile:

git diff stash@{0}^!

Questo confronta la scorta con il commit su cui si basa.


così bene che ho aggiunto un alias a ~/.gitconfig:laststash = diff stash@{0}^!
sbeam

5
Coppia perfetta: git difftool stash^!per diff dell'ultima scorta rispetto al commit su cui si basava, git difftool stash HEADper diff dell'ultima scorta contro il commit corrente (scorta @ {n} per gli stash precedenti)
ChrisV


"git diff stash @ {0} ^!" si riduce a "git diff stash @ {0} ^ stash @ {0} ~ 1 ^ stash @ {0} ~ 2 ......." ma poiché git diff richiede solo 2 commit, mostra la differenza tra stash @ {0} e ^ stash @ {0} ~ 1 e osserva ^ all'inizio del secondo commit non fa alcuna differenza e git lo ignora.
Naga Kiran,

Preferisco questa versione per poter usare il mio strumento diff preferito (Beyond Compare ovviamente!). Questo mostra anche il cambiamento in questa scorta che credo sia la domanda originale, al contrario di un'alternativa menzionata nei commenti sopra "git diff stash @ {X} ^ stash @ {X}" che mostra più di un semplice diff.
user107172

44

Se il tuo albero di lavoro è sporco , puoi confrontarlo con uno stash eseguendo prima il commit dell'albero di lavoro sporco, quindi confrontandolo con lo stash. Successivamente, puoi annullare il commit con l'albero di lavoro sporco (poiché potresti non voler avere quel commit sporco nel tuo registro di commit).

È inoltre possibile utilizzare il seguente approccio per confrontare due blocchi tra loro (nel qual caso si apre solo uno dei blocchi all'inizio).

  • Impegna il tuo albero di lavoro sporco:

    git add .
    git commit -m "Dirty commit"
    
  • Diff la scorta con quel commit:

    git diff HEAD stash@{0}
    
  • Quindi, in seguito, è possibile ripristinare il commit e rimetterlo nella directory di lavoro:

    git reset --soft HEAD~1
    git reset .
    

Ora hai diffuso l'albero di lavoro sporco con la tua scorta e sei tornato dove eri inizialmente.


C'è un modo per farlo, ma per vedere solo una differenza tra i file che sarebbe cambiata da ciò che è nella scorta?
Lagweezle,

Nel 2020 questo è molto più semplice; controlla la mia risposta aggiornata .
David Deprost,

Interessante, non lo sapevo git stash show -l . Differisce l'ultima scorta rispetto alla copia di lavoro (sporca)? Come lo usi senza ottenere error: switch l requires a value?
Magne,

Sì, in effetti, differisce dalla copia di lavoro (possibilmente sporca). Lo usi semplicemente inserendo git stash show -l. Per quanto riguarda il motivo per cui non funziona per te, posso solo immaginare che potresti essere su una versione precedente di Git? Sono su git v2.20.1 e funziona perfettamente senza errori.
David Deprost,

25

La risposta di @ Magne è l'unica alla data (molto tardiva) che risponde all'interpretazione più flessibile / utile della domanda, ma è un po 'più complicata del necessario. Invece di eseguire il commit e il ripristino, riponi semplicemente la tua copia di lavoro, confronta, quindi sblocca.

git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop

Ciò mostra le differenze tra la parte superiore dello stack di stash e la cartella di lavoro facendo temporaneamente cambiare le modifiche della cartella di lavoro in cima allo stack di stash (stash @ {0}), spostando l'originale in alto di uno (stash @ {1} ) quindi confrontando utilizzando la parte superiore originale nella posizione "nuovo set" in modo da vedere le modifiche che potrebbero derivare dall'applicazione in cima al lavoro corrente.

"Ma cosa succede se non ho alcun lavoro attuale?" Allora sei nel normale caso noioso. Usa la risposta di @ Amber

git stash show

o la risposta di @ czerasz

git diff stash@{0}

o ammettere che lo stashing e lostashing è comunque facile e veloce, basta semplicemente annullare le modifiche e ispezionarle. Se non li desideri al momento, gettali via (l'indice corrente / la cartella di lavoro cambia). In pieno questo è

git stash apply
git diff
git reset
git checkout

3
Questo semplice approccio (nascosto e quindi confrontato con un altro contenuto) è sicuro e facile da capire. Per alcuni casi d'uso potresti anche voler nascondere file non git stash save -u
tracciati

19

Questo funziona per me sulla versione 1.8.5.2 di git:

git diff stash HEAD

2
Ingannevole! La domanda è: come posso vedere i cambiamenti che un-stashing apporteranno all'attuale albero di lavoro? Questo mostra la differenza tra la scorta e la TESTA che può essere MOLTO diversa da quella con cui verrà applicato git stash apply.
MikeJansen,

Leggi di più sulla domanda "Vorrei sapere quali modifiche verranno apportate prima di applicarle!". Sto fornendo una risposta rapida a questo.
yerlilbilgin,

Inoltre puoi vedere che tutte le altre risposte riguardano in qualche modo la differenza della testa corrente (o del set di lavoro) contro la scorta. Perché solo la mia risposta è fuorviante? Non è giusto.
yerlilbilgin,

@yerlilbilgin Vedi la mia risposta sulla tua risposta di seguito.
MikeJansen,

Possiamo inserire HEAD, è di default, no?
Al.G.

10

Nel caso in cui, per confrontare un file nella struttura di lavoro e nella scorta, utilizzare il comando seguente

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

9

Se hai strumenti per diff (come al di là del confronto)

git difftool stash HEAD

1
Ingannevole! La domanda è: come posso vedere i cambiamenti che un-stashing apporteranno all'attuale albero di lavoro? Questo mostra la differenza tra la scorta e la TESTA che può essere MOLTO diversa da quella con cui verrà applicato git stash apply.
MikeJansen,

1
Se ritieni che ciò sia fuorviante, controlla tutte le altre risposte. Non è giusto!
yerlilbilgin,

1
Noterai che ho copiato lo stesso commento sull'altra risposta che era altrettanto fuorviante (praticamente la stessa risposta). Altre risposte che avevano già un commento simile l'ho lasciato solo. Se capisci come funziona git stash, allora ti renderai conto che la differenza dello stash con HEAD non è ciò che viene applicato (che è ciò che l'OP chiede). Il vero "stash" è la differenza tra il commit stash e ciò che era prima. Questa patch viene quindi applicata a HEAD. Quindi, se vuoi sapere cosa ha chiesto l'OP, devi mostrare la differenza tra lo stash e il commit prima di esso, cosa che fanno le risposte corrette.
MikeJansen,

1
Ciò risponde alla domanda in modo più diretto rispetto a qualsiasi altra (inutilmente) lunga risposta e fa esattamente ciò che l'OP ha chiesto, a meno di rimuoverlo HEAD. Potrei modificare la risposta di @ yerlilbilgin per rimuovere HEAD ma penso che chiunque usi git possa capire quella parte e allungare la risposta la renderebbe meno leggibile. Nessuna colpa su @yerlibilgin.
Sridhar Sarnobat,

4

Un modo per farlo senza spostare nulla è trarre vantaggio dal fatto che è in patchgrado di leggere git diff (differenze unificate in pratica)

git stash show -p | patch -p1 --verbose --dry-run

Questo ti mostrerà un'anteprima dettagliata di ciò che normalmente farebbe la patch. Il vantaggio aggiuntivo di questo è che la patch non impedisce nemmeno a se stessa di scrivere la patch nell'albero di lavoro, se per qualche motivo hai davvero bisogno di git per stare zitto sull'impegnare-prima di modificare, vai avanti e rimuovi --dry- corri e segui le istruzioni dettagliate.


2

Combinando ciò che ho imparato in questo thread e in questo , quando voglio vedere "cosa c'è dentro la scorta", corro prima:

git stash show stash@{0}

Ciò mostrerà quali file sono stati modificati. Quindi, per ottenere una bella differenza visiva in un difftool, faccio:

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

Questo mostrerà tutte le differenze in una volta della scorta data rispetto al suo genitore.

È possibile configurare lo strumento diff in ~/.gitconfig, ad es. Con Meld :

...
[diff]
    tool = meld

1

FWIW Questo può essere un po 'ridondante per tutte le altre risposte ed è molto simile alla risposta accettata che è esatta; ma forse aiuterà qualcuno.

git stash show --helpti darà tutto ciò di cui hai bisogno; comprese le informazioni sugli show di stash.

mostra [<stash>]

Mostra le modifiche registrate nello stash come diff tra lo stato stash e il suo genitore originale. Quando non viene fornito, mostra l'ultimo. Per impostazione predefinita, il comando mostra il diffstat, ma accetta qualsiasi formato noto a git diff (ad esempio, git stash show -p stash @ {1} per visualizzare il secondo stash più recente in forma di patch). È possibile utilizzare le variabili di configurazione stash.showStat e / o stash.showPatch per modificare il comportamento predefinito.


1

Lei la lista di stash

git stash list 
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2

Quindi ottenere il numero di scorta e fare:

Tu puoi fare:

 git stash show -p stash@{1}

Ma se vuoi un diff (questo è diverso per mostrare lo stash, è per questo che scrivo questa risposta. DiffConsidera il codice corrente nel tuo ramo e showmostra solo quello che applicherai )

Puoi usare:

git diff stash@{0}

o

git diff stash@{0} <branch name>

Un'altra cosa interessante da fare è:

git stash apply
git stash apply stash@{10}

Questo applica lo stash senza rimuoverlo dall'elenco, è possibile git checkout .rimuovere tali modifiche o se si è felici git stash drop stash@{10}di rimuovere uno stash dall'elenco.

Da qui non consiglio mai di usare git stash pope usare una combinazione di git stash applye git stash dropSe applichi uno stash nel ramo sbagliato ... beh a volte è difficile recuperare il tuo codice.


1

A seconda di cosa si desidera confrontare lo stash con (albero di lavoro locale / commit parent / head commit), in realtà ci sono diversi comandi disponibili, tra cui il buon vecchio git diffe il più specifico 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       ║   /               ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝

Sebbene git stash showa prima vista appaia più intuitivo, in git diffrealtà è più potente in quanto consente di specificare nomi di file per un diff più mirato. Ho impostato personalmente gli alias per tutti questi comandi nel mio plugin zsh git .

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.