Risposte:
Nella manpage di git stash puoi leggere (nella sezione "Discussione", subito dopo la descrizione di "Opzioni") che:
Uno stash è rappresentato come un commit il cui albero registra lo stato della directory di lavoro e il suo primo genitore è il commit su HEAD al momento della creazione dello stash.
Quindi puoi trattare lo stash (ad es. stash@{0}
È il primo / primo livello) come un commit di unione e usare:
$ git diff stash@{0}^1 stash@{0} -- <filename>
Spiegazione: stash@{0}^1
indica il primo genitore della scorta data, che come indicato nella spiegazione sopra è il commit in cui le modifiche sono state riposte. Usiamo questa forma di "git diff" (con due commit) perché stash@{0}
/ refs/stash
è un commit di tipo merge e dobbiamo dire a git con quale genitore vogliamo differire. Più criptico:
$ git diff stash@{0}^! -- <filename>
dovrebbe anche funzionare (consultare la manpage git rev-parse per la spiegazione della rev^!
sintassi, nella sezione "Specifica degli intervalli").
Allo stesso modo, puoi usare git checkout per estrarre un singolo file dallo stash:
$ git checkout stash@{0} -- <filename>
o per salvarlo con un altro nome file:
$ git show stash@{0}:<full filename> > <newfile>
o
$ git show stash@{0}:./<relative filename> > <newfile>
(si noti che qui <nome file completo> è il percorso completo di un file relativo alla directory superiore di un progetto (si pensi: rispetto a stash@{0}
)).
Potrebbe essere necessario proteggere stash@{0}
dall'espansione della shell, ovvero usare "stash@{0}"
o 'stash@{0}'
.
git checkout
la pagina man. Non è possibile rilasciare il file in un'altra posizione. C'è un riferimento a questo in: stackoverflow.com/questions/888414/…
git checkout
approccio copia il file esatto dalla scorta - non lo unisce con ciò che sarebbe nella directory di lavoro git stash apply
. (Quindi se hai delle modifiche dalla base su cui è stata creata la scorta, andranno persi).
git stash apply
unire le modifiche in un file che è stato modificato nella struttura di lavoro da quando il file è stato archiviato, è necessario mettere in scena quel file nella struttura di lavoro. Per far funzionare l'unione automatica, gli stessi file non possono essere modificati sia nella copia di lavoro che nella copia nascosta da unire. Infine, l'applicazione stash non rimuove l'elemento dallo stash come git stash pop
farebbe.
Se lo usi git stash apply
invece di git stash pop
, applicherà lo stash al tuo albero di lavoro ma manterrà comunque lo stash.
Fatto ciò, è possibile add
/ commit
il file desiderato e quindi ripristinare le modifiche rimanenti.
git stash pop stash@{0}
(elenco delle modifiche stashed: git stash list
)
Esiste un modo semplice per ottenere modifiche da qualsiasi ramo, inclusi gli stash:
$ git checkout --patch stash@{0} path/to/file
È possibile omettere le specifiche del file se si desidera applicare patch in molte parti. O ometti la patch (ma non il percorso) per ottenere tutte le modifiche in un singolo file. Sostituisci 0
con il numero di stash da git stash list
, se ne hai più di uno. Si noti che questo è simile diff
e offre di applicare tutte le differenze tra i rami. Per ottenere le modifiche da un solo commit / stash, dai un'occhiata git cherry-pick --no-commit
.
git help checkout
. --patch
esegue la fusione interattiva, applica qualunque pezzo approvi nella shell (o qualunque cosa tu salvi se scegli di e
chiudere la patch). Solo il percorso sovrascriverà il file, come ho scritto, "tutte le modifiche".
git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")'
- quindi facendo git applydiffat stash@{4}
usa solo i file che sono cambiati tra la scorta e il suo genitore.
Per vedere l'intero file: git show stash@{0}:<filename>
Per vedere il diff: git diff stash@{0}^1 stash@{0} -- <filename>
diff
con difftool
per usare il tuo diff esterno preferito.
$ git checkout stash@{0} -- <filename>
Appunti:
Assicurati di inserire spazio dopo il "-" e il parametro nome file
Sostituisci zero (0) con il tuo numero di scorta specifico. Per ottenere l'elenco di stash, utilizzare:
git stash list
Basato sulla risposta di Jakub Narębski : versione più breve
Puoi ottenere il diff per uno stash con " git show stash@{0}
" (o qualunque sia il numero dello stash; vedi "git stash list"). È facile estrarre la sezione del diff per un singolo file.
git show stash
per mostrare la scorta più alta (normalmente l'unica che hai). Allo stesso modo puoi mostrare il diff tra il tuo ramo attuale e lo stash con git diff head stash
.
Il concetto più semplice da capire, anche se forse non il migliore, è che hai cambiato tre file e vuoi archiviare un file.
Se lo fai git stash
per riporli tutti, git stash apply
per riportarli di nuovo e quindi git checkout f.c
sul file in questione per ripristinarlo efficacemente.
Quando si desidera decomprimere il file in esecuzione, eseguire un git reset --hard
e quindi eseguire git stash apply
nuovamente, sfruttando il fatto che git stash apply
non cancella il diff dallo stack di stash.
Se i file memorizzati devono fondersi con la versione corrente, utilizzare i modi precedenti usando diff. Altrimenti potresti usarlo git pop
per toglierli di mezzo, git add fileWantToKeep
per mettere in scena il tuo file, e fare un git stash save --keep-index
, per riporre tutto tranne quello che è sul palco. Ricorda che la differenza in questo modo con i precedenti è che "estrae" il file dalla scorta. Le risposte precedenti lo mantengono git checkout stash@{0} -- <filename>
così si adatta alle tue esigenze.
Utilizzare quanto segue per applicare le modifiche a un file in uno stash all'albero di lavoro.
git diff stash^! -- <filename> | git apply
Questo è generalmente meglio dell'uso git checkout
perché non perderai le modifiche apportate al file da quando hai creato lo stash.
Utilizzare l' estensione Git Stash in Visual Studio Code