Come posso vedere le modifiche che un-stashing apporterà all'attuale albero di lavoro? Vorrei sapere quali modifiche verranno apportate prima di applicarle!
Come posso vedere le modifiche che un-stashing apporterà all'attuale albero di lavoro? Vorrei sapere quali modifiche verranno apportate prima di applicarle!
Risposte:
Vedi lo stash più recente:
git stash show -p
Vedi una scorta arbitraria:
git stash show -p stash@{1}
Dalle git stash
manpage:
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).
stash@{0}
è il valore predefinito; hai solo bisogno di un argomento se vuoi guardare gli stash precedenti.
{0}
.
-p
?
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.
git diff stash@{0} master
ottieni 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.
git difftool --tool=... stash@{0} HEAD
git diff stash@{0}^ stash@{0}
git diff stash@{0} master -- filename
per ottenere le modifiche a un file specifico.
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.
~/.gitconfig
:laststash = diff stash@{0}^!
git difftool stash^!
per diff dell'ultima scorta rispetto al commit su cui si basava, git difftool stash HEAD
per diff dell'ultima scorta contro il commit corrente (scorta @ {n} per gli stash precedenti)
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.
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
?
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.
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
git stash save -u
Questo funziona per me sulla versione 1.8.5.2 di git:
git diff stash HEAD
git stash apply
.
Se hai strumenti per diff (come al di là del confronto)
git difftool stash HEAD
git stash apply
.
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.
Un modo per farlo senza spostare nulla è trarre vantaggio dal fatto che è in patch
grado 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.
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
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 --help
ti 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.
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. Diff
Considera il codice corrente nel tuo ramo e show
mostra 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 pop
e usare una combinazione di git stash apply
e git stash drop
Se applichi uno stash nel ramo sbagliato ... beh a volte è difficile recuperare il tuo codice.
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 diff
e 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 show
a prima vista appaia più intuitivo, in git diff
realtà è 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 .