git stash
Informazioni sul comando git stash: come salvare temporaneamente il lavoro, gestire stash multipli e parziali.
Cosa fa git stash
Il comando git stash ripone temporaneamente le modifiche apportate alla tua copia di lavoro in modo da poter lavorare su qualcos'altro, per poi tornare e riapplicarle in seguito. È la risposta a una situazione molto comune: sei a metà di una modifica quando hai bisogno di cambiare branch, recuperare aggiornamenti o correggere un bug urgente — ma il tuo lavoro non è abbastanza pronto per un commit. Invece di creare un commit provvisorio, metti le modifiche nello stash, ottieni un albero di lavoro pulito, esegui l'altro lavoro e poi ripristini le tue modifiche.
Uno stash viene memorizzato come un oggetto speciale simile a un commit su uno stack last-in, first-out (LIFO). Ogni voce contiene uno snapshot dei tuoi file tracciati modificati e, per impostazione predefinita, Git lascia la directory di lavoro pulita una volta creato lo stash.

Questa pagina tratta il salvataggio e il ripristino delle modifiche, inclusi i file non tracciati e ignorati, la gestione di più stash, l'ispezione e lo stash parziale delle modifiche, la creazione di branch da uno stash e la pulizia. Per un ripasso sulle modifiche staged e unstaged, consulta git add e git status.
Salvare il tuo lavoro nello stash
Il comando git stash prende sia le modifiche staged che quelle unstaged non committate dei file tracciati, le salva per un uso successivo e le rimuove dalla tua copia di lavoro. Prima di tutto, esegui git status per vedere lo stato modificato. Poi esegui git stash per riporre le modifiche:
Verifica lo stato dell'albero di lavoro
git statusOn branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.htmlSalva le modifiche nello stash
git stashSaved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepageConferma che l'albero di lavoro è ora pulito
git statusOn branch master
nothing to commit, working tree cleanLe tue modifiche sono memorizzate in modo sicuro e la tua directory di lavoro corrisponde all'ultimo commit, quindi puoi passare a un altro branch o recuperare aggiornamenti liberamente.
Riapplicare le modifiche salvate nello stash
Esistono due comandi per ripristinare uno stash e la differenza è importante:
git stash popriapplica lo stash più recente alla tua copia di lavoro e lo rimuove dall'elenco degli stash.git stash applyriapplica le modifiche ma le mantiene nell'elenco degli stash, il che è utile quando vuoi applicare lo stesso stash a più di un branch.
Applica lo stash più recente e rimuovilo
git stash popOn branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{0} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)La riga Dropped refs/stash@{0} conferma che la voce è stata rimossa dopo un pop riuscito.
Se la riapplicazione di uno stash produce conflitti di merge (perché i file sottostanti sono cambiati nel frattempo), git stash pop non eliminerà lo stash — lascerà i marcatori di conflitto da risolvere e manterrà la voce in modo da non perdere il lavoro. Risolvi i conflitti, poi rimuovila manualmente con git stash drop.
Salvare nello stash file non tracciati o ignorati
Per impostazione predefinita git stash salva solo le modifiche che Git sta già tracciando: le modifiche staged e le modifiche ai file tracciati. Non salverà i file nuovi che non sono mai stati aggiunti all'index, né i file ignorati. Per includere i file non tracciati, usa l'opzione -u (o --include-untracked):
Includi i file non tracciati
git stash -uPer salvare nello stash anche i file ignorati, usa l'opzione -a (o --all):
Includi i file non tracciati e ignorati
git stash -aI file corrispondenti al tuo .gitignore vengono salvati nello stash solo quando passi -a. Usalo con parsimonia — può raccogliere artefatti di build e configurazioni locali che probabilmente non intendevi spostare.
Mantenere le modifiche staged con --keep-index
Quando vuoi testare solo le modifiche staged in isolamento, git stash --keep-index salva tutto nello stash ma lascia il contenuto dell'index nel tuo albero di lavoro:
Salva tutto nello stash ma mantieni ciò che è staged
git stash --keep-indexQuesto è utile prima di un commit: salva il lavoro unstaged nello stash, esegui i test su esattamente ciò che stai per committare, poi usa git stash pop per riportare il resto.
Stash multipli
Puoi eseguire git stash più volte per creare più stash, poi eseguire git stash list per visualizzarli. Per impostazione predefinita ogni stash è etichettato "WIP" — work in progress — insieme al branch e al commit da cui è stato creato. Lo stash più recente è stash@{0}; quelli più vecchi hanno indici più alti.
Elenca gli stash
git stash liststash@{0}: WIP on master: 5002d47 our new homepage
stash@{1}: WIP on master: 049d078 add navigation
stash@{2}: WIP on master: 38e3b29 initial layoutÈ buona pratica aggiungere un messaggio descrittivo invece dell'etichetta predefinita "WIP" in modo da distinguere gli stash in seguito:
Salva nello stash con un messaggio
git stash push -m "wip: experimental dark theme"Per impostazione predefinita git stash pop riapplica lo stash più recente, stash@{0}. Puoi puntare a uno stash specifico passando il suo riferimento a pop o apply:
Applica uno stash specifico
git stash pop stash@{2}On branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{2} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)Visualizzare le diff degli stash
Usa git stash show per visualizzare un riepilogo dei file modificati da uno stash:
Riepilogo di uno stash
git stash show index.html | 1 +
style.css | 3 +++
2 files changed, 4 insertions(+)Per impostazione predefinita git stash show mostra l'ultimo stash. Passa un riferimento come git stash show stash@{1} per ispezionare uno più vecchio. Aggiungi l'opzione -p o --patch per vedere la diff completa:
Diff completa di uno stash
git stash show -pdiff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>Stash parziali
Git ti permette di scegliere se salvare nello stash un singolo file, un gruppo di file o singole modifiche all'interno dei file. Il comando git stash -p (o --patch) itera attraverso ogni hunk — una parte contigua di modifica — nella copia di lavoro e chiede se vuoi salvarlo nello stash:
Salva nello stash in modo interattivo gli hunk selezionati
git stash -pdiff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
Stash this hunk [y,n,q,a,d,/,e,?]? y
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>
Stash this hunk [y,n,q,a,d,/,e,?]? nComandi per gli hunk
| Comando | Descrizione |
|---|---|
| / | Cerca un hunk tramite regex. |
| ? | Stampa la guida. |
| n | Non salvare l'hunk nello stash. |
| a | Salva questo hunk e tutti gli hunk successivi nel file nello stash. |
| d | Non salvare questo hunk né gli hunk successivi nel file nello stash. |
| e | Modifica manualmente l'hunk corrente. |
| q | Esci (gli hunk selezionati verranno salvati nello stash). |
| s | Dividi l'hunk in hunk più piccoli. |
| y | Salva l'hunk nello stash. |
Creare un branch da uno stash
A volte il commit da cui hai creato lo stash si è evoluto così tanto che riapplicare lo stash causerebbe conflitti. git stash branch risolve questo problema creando un nuovo branch dal commit in cui lo stash è stato originariamente creato, applicando lo stash lì e rimuovendolo in caso di successo:
Crea un branch da uno stash
git stash branch add-stylesheet stash@{1}Switched to a new branch 'add-stylesheet'
On branch add-stylesheet
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{1} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)Pulizia dello stash
Gli stash non vengono rimossi automaticamente, quindi l'elenco può crescere nel tempo. Elimina un singolo stash con git stash drop:
Elimina uno stash
git stash drop stash@{1}Dropped stash@{1} (17e2697fd8251df6163117cb3d58c1f62a5e7cdb)Per eliminare tutti gli stash contemporaneamente, usa git stash clear:
Elimina tutti gli stash
git stash cleargit stash clear e git stash drop eliminano definitivamente le modifiche salvate nello stash e non fanno parte di alcun branch, quindi un normale git log non le mostrerà. Se elimini uno stash per errore, potresti ancora essere in grado di recuperare l'oggetto tramite git reflog e git stash apply <commit-hash> prima che il garbage collection lo rimuova.
Riferimento rapido ai comandi
| Comando | Cosa fa |
|---|---|
git stash | Salva nello stash le modifiche staged e unstaged dei file tracciati. |
git stash -u | Salva nello stash anche i file non tracciati. |
git stash -a | Salva nello stash anche i file non tracciati e ignorati. |
git stash --keep-index | Salva nello stash ma lascia le modifiche staged nell'albero di lavoro. |
git stash push -m "messaggio" | Salva nello stash con un'etichetta descrittiva. |
git stash list | Elenca tutti gli stash (il più recente è stash@{0}). |
git stash show -p | Mostra la diff completa di uno stash. |
git stash pop | Riapplica l'ultimo stash e lo rimuove. |
git stash apply | Riapplica l'ultimo stash e lo mantiene. |
git stash branch <nome> | Crea un branch da uno stash e lo applica. |
git stash drop / clear | Elimina uno / tutti gli stash. |
Per apprendere altri modi per spostare e annullare il lavoro, consulta git reset, git restore e git checkout.