Cos'è Git Stash?
Sei a metà dello sviluppo di una funzionalità quando qualcosa di urgente salta fuori. Un bug deve essere corretto sul branch principale, o un collega ha bisogno che tu riveda la sua pull request. Non sei pronto per fare il commit del tuo lavoro in corso, ma non puoi cambiare branch con modifiche non committate nel tuo directory di lavoro. Questo è esattamente il problema che git stash è stato creato per risolvere.
Git stash prende le tue modifiche non committate -- sia quelle in staging che quelle non in staging -- e le salva in un'area di archiviazione temporanea. Il tuo directory di lavoro torna a uno stato pulito, corrispondente all'ultimo commit. Quando sei pronto, puoi recuperare quelle modifiche. Pensalo come mettere il tuo lavoro su uno scaffale per occuparti di qualcos'altro, e poi riprenderlo esattamente dove l'avevi lasciato.
Uso di base: Stash, Apply e Pop
Salvare le modifiche nello stash
La forma più semplice è:
git stash
Questo prende tutti i file tracciati, modificati e in staging e li archivia. Il tuo directory di lavoro diventa pulito. Nota che i file non tracciati (file che non hai mai aggiunto a Git) non vengono inclusi nello stash per impostazione predefinita. Per includerli, usa:
git stash -u
Oppure per includere tutto, anche i file ignorati:
git stash -a
Recuperare le modifiche con apply
Una volta terminata la tua attività secondaria e quando vuoi recuperare il tuo lavoro dallo stash, usa:
git stash apply
Questo ripristina le modifiche dello stash nel tuo directory di lavoro ma mantiene intatta la voce dello stash. Lo stash è ancora sullo scaffale, il che può essere utile se vuoi applicare le stesse modifiche a più branch.
Recuperare le modifiche con pop
git stash pop
Pop funziona come apply, ma rimuove anche la voce dello stash dopo averla applicata. Questa è la scelta più comune quando vuoi semplicemente recuperare il tuo lavoro e non hai bisogno di conservare lo stash.
La differenza chiave: apply conserva lo stash, pop lo elimina dopo il ripristino. Usa apply quando potresti aver bisogno dello stash di nuovo. Usa pop quando hai finito con esso.
Aggiungere un messaggio al tuo stash
Per impostazione predefinita, Git etichetta gli stash con una descrizione auto-generata come WIP on main: a3b4c5d commit message. Non è molto utile quando hai diversi stash. Puoi aggiungere un messaggio descrittivo:
git stash push -m "refactoring the auth module"
Questo rende molto più facile identificare il contenuto di ogni stash quando li elenchi in seguito.
Gestire più stash
Elencare i tuoi stash
Git mantiene uno stack di stash. Puoi vederli tutti con:
git stash list
L'output appare così:
stash@{0}: On main: refactoring the auth module
stash@{1}: WIP on feature/checkout: 9f2e1d0 add cart logic
stash@{2}: WIP on main: 7c8d9e1 update dependencies
Lo stash più recente è sempre stash@{0}. Ogni nuovo stash spinge quelli più vecchi verso il basso nello stack.
Applicare o fare pop di uno stash specifico
Per impostazione predefinita, apply e pop operano sullo stash più recente. Per puntare a uno specifico, referenzialo tramite il suo indice:
git stash apply stash@{2}
git stash pop stash@{1}
Vedere il contenuto di uno stash
Prima di applicare uno stash, potresti voler vedere cosa contiene:
git stash show stash@{0}
Questo mostra un riepilogo dei file modificati. Per il diff completo, aggiungi -p:
git stash show -p stash@{0}
Fare stash di file specifici
A volte non vuoi fare stash di tutto. Forse vuoi mettere da parte solo le modifiche di uno o due file. Da Git 2.13, puoi farlo con:
git stash push -m "sidebar layout changes" src/components/Sidebar.tsx src/styles/sidebar.css
Solo i file specificati vengono messi nello stash. Tutto il resto rimane nel tuo directory di lavoro.
Eliminare e svuotare gli stash
Eliminare un singolo stash
Se non hai più bisogno di uno stash specifico, rimuovilo con:
git stash drop stash@{1}
Questo elimina quella voce di stash. Gli stash rimanenti vengono re-indicizzati automaticamente.
Svuotare tutti gli stash
Per rimuovere tutti gli stash in una volta:
git stash clear
Fai attenzione con questo comando. Non c'è possibilità di annullamento. Tutte le modifiche messe in stash vengono eliminate permanentemente.
Creare un branch da uno stash
A volte fai stash delle modifiche e poi realizzi che meritano un branch proprio. Invece di applicare lo stash e poi creare un branch, Git offre una scorciatoia:
git stash branch new-feature-branch stash@{0}
Questo crea un nuovo branch partendo dal commit dove lo stash è stato originariamente creato, applica lo stash e lo elimina. È particolarmente utile quando applicare lo stash al tuo branch attuale causerebbe conflitti.
Errori comuni
- Dimenticare gli stash. Gli stash sono facili da dimenticare. Esegui
git stash listperiodicamente per verificare se hai stash residui che dovrebbero essere applicati o eliminati. - Conflitti di stash. Se il codice è cambiato significativamente da quando hai fatto lo stash, applicarlo può produrre conflitti di merge. Risolvili allo stesso modo in cui risolveresti qualsiasi conflitto di merge.
- Fare affidamento sullo stash invece dei commit. Se ti ritrovi a fare stash frequentemente, considera di fare commit del tuo lavoro in corso. Puoi sempre fare amend o squash di quei commit in seguito. Lo stash è ideale per cambi di contesto rapidi e di breve durata, non per l'archiviazione a lungo termine.
Lavorare con gli stash in GitSquid
GitSquid mostra gli stash direttamente sul grafo dei commit, così puoi vedere a colpo d'occhio quali stash esistono e da quale commit sono stati creati. Facendo clic destro su uno stash si apre un menu contestuale con opzioni per apply, pop, drop o svuotare tutti gli stash. Questo rende la gestione degli stash più veloce rispetto alla digitazione di comandi, specialmente quando hai più stash e hai bisogno di ispezionarli o pulirli.
Riferimento rapido
| Comando | Cosa fa |
|---|---|
git stash |
Mette in stash le modifiche tracciate |
git stash -u |
Stash inclusi i file non tracciati |
git stash push -m "msg" |
Stash con messaggio descrittivo |
git stash list |
Elenca tutti gli stash |
git stash apply |
Ripristina lo stash, conserva la voce |
git stash pop |
Ripristina lo stash, elimina la voce |
git stash drop stash@{n} |
Elimina uno stash specifico |
git stash clear |
Elimina tutti gli stash |
git stash show -p |
Mostra il diff completo di uno stash |
git stash branch <name> |
Crea un branch da uno stash |
Git stash è uno di quegli strumenti che sembrano secondari finché non ne hai bisogno. Una volta che ti ci trovi a tuo agio, il cambio di contesto tra le attività diventa fluido. Mantieni i tuoi stash organizzati con messaggi, pulisci quelli vecchi regolarmente e usa pop invece di apply quando non hai bisogno di conservare lo stash.