È uscito il Corso Java Completo
Torna al blog

Git stash: mettere da parte il lavoro in corso

Come funziona git stash, i comandi che servono davvero, quando conviene usarlo e perché non va usato come deposito a lungo termine.

Edoardo Midali

Edoardo Midali

Developer · Content Creator

5 min di lettura

Stai lavorando a una funzionalità, il codice è a metà e non compila nemmeno. Arriva una segnalazione urgente da sistemare subito su un altro ramo. Non puoi committare così, e non vuoi buttare via mezza giornata di lavoro. È esattamente la situazione per cui esiste git stash.

Cos'è

git stash mette da parte le modifiche non ancora committate, riportando la cartella di lavoro allo stato dell'ultimo commit. Le modifiche restano conservate e le puoi riprendere quando vuoi.

È un deposito temporaneo: ci metti dentro il lavoro in corso, fai altro, e poi lo tiri fuori.

Non è un commit e non fa parte della storia del progetto: è una struttura locale, separata, che nessun altro vede.

I comandi che servono

git stash                    # metti via tutto
git stash -m "login a metà"  # con una descrizione
git stash list               # vedi cosa hai messo da parte
git stash pop                # riprendi l'ultimo e rimuovilo dal deposito
git stash apply              # riprendi ma lascialo nel deposito
git stash drop               # elimina l'ultimo
git stash clear              # svuota tutto

Due accortezze che fanno la differenza:

Usa sempre il messaggio. Senza, l'elenco diventa una fila di righe indistinguibili tipo WIP on main: a1b2c3d. Con tre stash da parte, non saprai più quale è quale.

pop contro apply: il primo riprende e rimuove dal deposito, il secondo lascia la copia. Se non sei sicuro che si applichi pulito, usa apply: se qualcosa va storto, hai ancora l'originale al sicuro.

Cosa mette da parte e cosa no

Un punto che sorprende: per impostazione predefinita git stash non tocca i file nuovi, quelli mai aggiunti al repository. Restano lì.

git stash -u    # include anche i file non tracciati
git stash -a    # include pure quelli ignorati dal gitignore

Il caso classico: metti via il lavoro, cambi ramo, e ti ritrovi dei file nuovi che non c'entrano nulla con il ramo su cui sei. È perché non erano ancora tracciati. In quel caso serve -u.

Riprendere su un ramo diverso

Uno stash non è legato al ramo su cui l'hai creato. Puoi metterlo via su un ramo e riprenderlo su un altro.

È utile quando ti accorgi di aver lavorato sul ramo sbagliato — situazione che capita a tutti:

git stash                       # metti via
git switch ramo-corretto        # vai dove volevi essere
git stash pop                   # riprendi qui

Se nel frattempo quelle righe sono cambiate, riprendendo lo stash puoi avere un conflitto. Si risolve come qualunque altro — vedi risolvere i conflitti in Git — e in quel caso lo stash non viene rimosso dal deposito finché non concludi.

Comandi meno noti ma utili

git stash show -p              # vedi cosa contiene l'ultimo stash
git stash apply stash@{2}      # riprendi uno specifico
git stash push -- file.js      # metti via solo un file
git stash branch nuovo-ramo    # crea un ramo dallo stash

git stash show -p prima di riprendere evita la sorpresa di applicare qualcosa che non ricordavi.

git stash branch è la soluzione elegante quando lo stash è vecchio e non si applica più pulito: crea un ramo a partire dal commit su cui era stato creato, dove si applica senza conflitti.

L'errore da evitare

Non usare lo stash come deposito a lungo termine.

È la cosa che va storta più spesso, per tre motivi:

Si dimentica. Non è visibile in git status, non compare da nessuna parte. Lavoro di settimane fa che nessuno ricorda.

Non è condiviso né salvato altrove. Lo stash vive solo sul tuo computer: non viene inviato al server, non è in nessun backup del repository. Se perdi il computer, perdi lo stash.

Invecchia male. Più il codice attorno cambia, meno lo stash si applica pulito.

La regola pratica: lo stash dura ore, non giorni. Se il lavoro deve sopravvivere fino a domani, la soluzione giusta è un altro ramo con un commit — anche parziale:

git switch -c wip/login
git commit -m "wip: login a metà"

Un commit temporaneo su un ramo dedicato è visibile, inviabile al server e recuperabile — vedi Git branch: come funzionano i rami. Lo si sistema dopo con un --amend o un rebase interattivo.

E un git stash list ogni tanto evita di ritrovare cose dimenticate mesi prima.

Le alternative

Vale la pena conoscerle, perché spesso sono più adatte:

Un commit su un ramo dedicato — per pause lunghe, come sopra.

git worktree — permette di avere più cartelle di lavoro dallo stesso repository, ciascuna su un ramo diverso. È la soluzione più pulita al problema "devo passare a un'altra cosa": non metti via niente, apri semplicemente un'altra cartella.

git worktree add ../urgente main

Meno conosciuto dello stash e in molti casi migliore, soprattutto se l'interruzione durerà più di qualche minuto.

In sintesi

git stash mette da parte le modifiche non committate e riporta la cartella di lavoro pulita, conservando il lavoro per dopo. Serve alle interruzioni brevi: un'urgenza, un cambio di ramo al volo.

Le due cose da ricordare nell'uso quotidiano: metti sempre un messaggio — altrimenti l'elenco diventa illeggibile — e usa -u se hai file nuovi, che altrimenti restano dove sono.

L'errore da evitare è trattarlo come un deposito: non è condiviso, non è in nessun backup, non si vede in git status e invecchia male. Per qualsiasi cosa debba durare più di poche ore, un commit temporaneo su un ramo dedicato è la scelta giusta.

E se le interruzioni sono frequenti, vale la pena conoscere git worktree: risolve lo stesso problema senza dover mettere via nulla.

Il quadro completo dei comandi quotidiani è in comandi Git essenziali.