È possibile?
Sì, lo è!
git checkout -p [email protected]{0}
Dove è possibile sostituire il 0
in [email protected]{0}
con l'indice della scorta che si desidera applicare.
Utilizzare git stash list
e git show -p [email protected]{n}
se non è sicuro quale n
è lo stash che si desidera applicare.
Non dimenticarti di git stash drop [email protected]{n}
quando sai che non hai più bisogno di quella scorta, dal momento che git checkout
ovviamente non farà cadere la scorta per te.
Perché funziona?
La chiave è capire che gli stash sono, in pratica, references a commits, proprio come tag e rami.
Infatti, sono memorizzati in .git/refs/stash
, una riga per hash stash.
Avvertenze
Come @mgadda menzionati int commenti qui sotto, git checkout -p
cerca di applicare tutta la differenza tra un impegno e di lavoro corrente.
Nel caso di una scorta git, se la scorta si sta cercando di applicare è stato fatto nei confronti di un diverso commit, quindi git checkout -p [email protected]{n}
cercherà di applicare in modo interattivo tutte le differenze tra le [email protected]{n}
e tutto è genitore commette e la corrente spazio di lavoro.
Ad esempio, se si sta cercando di applicare una scorta che è stato salvato "molti commit fa," nello spazio di lavoro corrente, git checkout -p [email protected]{n}
cercherà di applicare non solo i cambiamenti nella scorta adeguata, ma cercherà anche di revert tutte le modifiche avvenute tra il commit su cui si basa lo stash e il commit corrente.
Allo stesso modo, se si sta tentando di applicare una memoria "dal futuro", ad esempio in un ramo che è un numero di commit prima del commit su cui è basata la memoria, allora git checkout -p [email protected]{n}
tenterà di applicare anche tutti le altre modifiche che si sono verificate tra il commit corrente e il commit dal futuro, oltre alle modifiche dallo stash stesso.
(Nel caso vi stiate chiedendo, git checkout -p [email protected]{n}
una scorta da un ramo parallelo cercherà di annullare tutte le modifiche tra la corrente commettono e il punto di diramazione originale e applicano anche tutte le modifiche tra il punto di diramazione e l'altro ramo, oltre al cambio nella scorta).
Ci sono un paio di soluzioni alternative, nessuno di loro perfetti sono perfetti per ogni situazione:
essere molto attenti con le patch si accetta quando si fanno git checkout -p [email protected]{n}
fare un git stash pop
, poi git stash
di nuovo prima di fare git checkout -p ...
. Ma se volessi fare una parziale applicazione della tua scorta per evitare conflitti, questo non sarebbe di grande aiuto.
Se si dispone di uno strumento di diff grafica supportata da git (come meld), è possibile utilizzare git difftool
e "sinistra" si applicano tutte le modifiche che ti interessa.
Qui c'è un avvertimento che deve essere menzionato: poiché le operazioni di stash sono solo commit, significa che hanno anche commit padre che non sono garantiti per essere lo stesso commit padre di quello a cui si desidera applicare le modifiche interattive. Regola empirica: se si nascondono da altri commit rispetto al commit attualmente estratto, questa tecnica non farà ciò che si aspetta. Soluzione: applica l'intero set di modifiche dalla tua scorta (con git stash pop), quindi riponi di nuovo (git stash). Ora puoi fare il checkout -p come desideri. – mgadda
@mgadda, grazie. Ho aggiunto una sezione "avvertimenti". – LeoRochael