Corso
Sei nel mezzo dell\u2019implementazione di una nuova funzionalit\u00e0 nella tua data pipeline quando arriva una segnalazione di bug urgente. La tua working directory \u00e8 piena di modifiche a met\u00e0. Non sei pronto per fare commit, ma devi cambiare branch subito.
In questo tutorial ti mostrer\u00f2 come usare l\u2019intera suite di comandi di git stash. Imparerai a salvare, ispezionare, ripristinare, fare stash selettivo e pulire gli stash in Git. Per approfondire, ti consiglio di seguire il nostro corso Introduction to GitHub Concepts per saperne di pi\u00f9 sul version control e sul lavoro con i repository su GitHub.
Che cos’è Git stash?
git stash è un comando Git che mette temporaneamente da parte le modifiche non committate per tornare a una working directory pulita, senza creare un commit Git. Questo rende facile cambiare branch o gestire lavori urgenti senza perdere i progressi.
Gli stash sono salvati in una pila LIFO (last-in, first-out). Lo stash più recente è sempre stash@{0}, seguito da stash@{1} e così via.
Per impostazione predefinita, git stash salva i file tracciati modificati e le modifiche in stage (dall’index). Tuttavia, non include i nuovi file non tracciati e i file ignorati come quelli in .gitignore.
Come salvare le modifiche con git stash
In questa sezione ti guiderò in tre modi comuni per fare stash delle modifiche. Useremo questo scenario costante: supponi di lavorare a un progetto di data pipeline con i file data_pipeline.py, config.yaml e tests/test_pipeline.py.
Fare stash delle modifiche tracciate
Dal momento che git stash salva le modifiche modificate o in stage, esegui git status per controllare lo stato dei file nella tua working directory. Dopo aver eseguito git stash, sia le modifiche tracciate in stage che quelle non in stage vengono salvate, lasciandoti con una working directory pulita.

Includere modifiche non tracciate e nuovi file
Per impostazione predefinita, git stash ignora i file che non sono mai stati aggiunti al repository. Se hai creato un nuovo file di test, uno stash standard lo lascerà nella tua directory, il che può creare problemi quando cambi branch.

Se esegui git stash, quel file rimarrà. Per includerlo, usa il comando -u o --include-untracked:
git stash -u

Per includere proprio ogni file, compresi quelli esplicitamente ignorati dal tuo .gitignore, puoi usare git stash --all o -a. Fai però attenzione: potresti includere inavvertitamente file come log o artefatti di build.
Dai un nome al tuo stash
Quando usi git stash, messaggi predefiniti come WIP on main diventano confusi se hai più stash. Per evitare questo problema, aggiungi sempre un messaggio descrittivo quando vuoi pushare gli stash.
git stash push -m "refactor pipeline config handling."
Puoi usare il comando git stash list per visualizzare e confrontare l’elenco degli stash. Nota la differenza tra lo stash con nome e gli stash predefiniti.

Usare messaggi chiari rende molto più semplice identificare lo stash giusto in seguito, soprattutto quando gestisci più attività o collabori con un team.
Ti consiglio di provare i nostri skill track GitHub Foundations e Git Fundamentals per imparare il version control con Git, dalle basi ai workflow avanzati, compreso il tracciamento delle modifiche, la gestione dei repository e una collaborazione efficiente.
Come visualizzare e ispezionare i tuoi stash
Prima di applicare uno stash alla cieca, è importante verificare cosa contiene. Questo passaggio è spesso saltato, ma aiuta a evitare confusione o sovrascritture accidentali.
git stash list: elenca tutti gli stash
Usa il comando seguente per vedere la tua pila di stash:
git stash list

Dovresti ormai sapere che gli stash seguono un ordine LIFO (last-in, first-out). Lo stash più recente è sempre stash@{0} e ogni nuovo stash spinge i precedenti più in basso nella pila.
git stash show: ispeziona uno stash prima di applicarlo
Per ottenere un riepilogo rapido delle modifiche in uno stash, puoi usare il comando show su uno stash specifico. Ad esempio, il comando seguente mostra le modifiche apportate nello stash più recente:
git stash show stash@{0}

Per vedere le effettive modifiche al codice (il diff completo), usa il comando seguente per visualizzare tutte le modifiche riga per riga memorizzate in quello stash.
git stash show -p stash@{0}

Come buona pratica, ispeziona sempre uno stash prima di applicarlo, soprattutto se ha qualche giorno o non sei sicuro di cosa contenga.
Come ripristinare le modifiche in stash
Una volta salvato il lavoro con git stash, ti servirà un modo per riportarlo indietro. Esistono due metodi principali per ripristinare gli stash, incluso come puntare a uno specifico tramite il suo indice.
git stash pop: applica e rimuovi
Questo è il modo più comune per ripristinare uno stash. Prende lo stash in cima (stash@{0}), applica le modifiche al branch corrente e poi elimina quello stash dalla pila.
git stash pop

Dopo aver eseguito pop, le tue modifiche vengono ripristinate e lo stash viene rimosso. Quindi usa pop quando sei certo di aver finito con quello stato salvato e vuoi mantenere ordinata la lista degli stash.
Per capire più a fondo il comando pop, ti consiglio di consultare il nostro tutorial Git Stash Pop per imparare come salvare il lavoro non committato quando cambi branch nel tuo repo.
git stash apply: applica e conserva
Se vuoi ripristinare le modifiche ma mantenere lo stash per riutilizzarlo, usa il comando apply come segue:
git stash apply stash@{1}

Nota che fare riferimento a uno stash tramite indice stash@{1} prende di mira lo stash specifico da ripristinare. Questo metodo è utile quando vuoi applicare le stesse modifiche su più branch, ad esempio un aggiustamento di configurazione condiviso che deve andare su main e staging.
Puoi usare git stash list per confermare se lo stash è ancora lì dopo aver usato il comando apply.

Come fare stash in modo selettivo
Nei progetti reali, spesso le modifiche sono mescolate. In questi casi potresti voler mettere da parte solo una parte del lavoro mantenendo il resto disponibile. Git offre due metodi per un controllo più fine.
git stash push -m: fai stash di file specifici
Se sai esattamente quali file vanno messi da parte, puoi fare stash solo dei file selezionati specificandone i path:
Ad esempio, il comando seguente fa stash solo del file data_pipeline.py. È utile quando vuoi mettere in pausa il lavoro su una funzionalità sperimentale mantenendo una correzione di bug in stage, pronta per il commit.
git stash push -m "stash experimental pipeline logic" data_pipeline.py
Per verificare se il comando è stato eseguito correttamente, usa git status per mostrare il prima e dopo del tuo repo.

git stash push -p -m: fai stash interattivo di hunk specifici
A volte potresti avere il codice “buono” e quello “WIP” nello stesso file. In questo caso, usa il flag -p o --patch per avviare una sessione interattiva. Questo ti consente di scegliere specifici blocchi (“hunk”) di modifiche all’interno di un file.
git stash push -p -m "Selective stash of pipeline logic"

Vedrai l’output “Stash this hunk” con queste opzioni:
-
y: Sì, fai stash di questo hunk -
n: No, salta questo hunk -
q: Esci; non fare stash di questo hunk né dei successivi. -
a: Tutti; fai stash di questo hunk e di tutti i successivi nel file. -
d: Elimina; non fare stash di questo hunk né dei successivi nel file. -
?: help
Nota che questo workflow è molto simile a git add -p. È utile quando le modifiche nello stesso file non sono correlate e vanno gestite separatamente.
Come pulire il tuo stash
Gli stash dovrebbero essere di breve durata. Se li lasci accumulare, sarà più difficile trovare quello giusto più avanti e aumenterà il rischio di conflitti quando li applicherai.
git stash drop: elimina uno stash specifico
Per rimuovere un singolo stash, usa git stash drop con il suo indice. Ad esempio, il comando seguente elimina il quarto stash nell’elenco.
git stash drop stash@{3}

Dall’esempio sopra, puoi vedere che l’elenco degli stash si riduce e gli stash rimanenti vengono reindicizzati dopo l’eliminazione.
git stash clear: cancella tutti gli stash
Per rimuovere tutti gli stash in una volta sola, usa:
git stash clear
Questo comando non produce output in caso di successo; puoi verificare eseguendo git stash list.

Ti consiglio di fare particolare attenzione quando usi git stash clear perché questa azione è permanente e non c’è un undo integrato. Eseguilo solo quando sei sicuro di non aver più bisogno di nessuno stash.
git stash branch: converti uno stash in un branch
Se il tuo branch corrente è cambiato molto da quando hai creato lo stash, applicarlo potrebbe portare a conflitti di merge. In tal caso, puoi creare un nuovo branch direttamente dallo stash:
git stash branch pipeline-fix stash@{1}

Il comando sopra fa quanto segue:
- Crea un nuovo branch a partire dal commit originale in cui è stato creato lo stash
- Applica lo stash
- Lo rimuove dalla lista degli stash
Ti consiglio di dare un’occhiata al nostro tutorial Git Branch per saperne di più sulla gestione dei branch per uno sviluppo e una collaborazione migliori.
Altri comandi Git stash da conoscere
Oltre ai workflow più comuni, ecco alcuni comandi avanzati di git stash di cui dovresti essere a conoscenza:
-
git stash create: crea un oggetto stash senza aggiungerlo alla lista degli stash -
git stash store: memorizza uno stash creato con create -
git stash export: esporta uno stash in un riferimento o lo stampa -
git stash import: importa uno stash da un commit esistente
Errori comuni e come risolverli
Anche se git stash è semplice, alcuni problemi comuni possono metterti in difficoltà. Ecco alcuni errori che ho incontrato, come riconoscerli e come risolverli rapidamente.
No local changes to save
Questo è il più frequente “non-errore”. Si verifica quando esegui git stash su una working directory pulita in cui non ci sono file tracciati modificati o in stage.
Per risolvere, esegui git status e, se non appare nulla, non c’è niente da mettere in stash.

Conflitto durante l’applicazione di uno stash
I conflitti si verificano quando il branch su cui ti trovi ha modificato le stesse righe di codice presenti nel tuo stash. Ad esempio, quando esegui git stash pop sul nuovo branch dopo aver modificato il file, è probabile che tu riceva un messaggio di errore:

Potresti poi vedere i marcatori di conflitto all’interno del file:

Per risolvere, puoi fare una delle seguenti cose:
- Risolvi manualmente i conflitti nel file
- Metti in stage i file risolti
git add data_pipeline.py
- Elimina manualmente lo stash usando
git stash drop(se NON viene rimosso automaticamente in caso di conflitto)
Se i conflitti sono troppo complicati, usa il comando seguente per applicare le modifiche invece su una base pulita.
git stash branch recovery-branch stash@{0}
Hai fatto stash per errore di file che non intendevi
A volte potresti eseguire git stash senza controllare la working directory, per poi renderti conto che hai nascosto una correzione che invece volevi committare.
Per evitare questi errori, sii sempre esplicito sui file da mettere in stash. Ad esempio, il comando seguente farà stash solo del file data_pipeline.py invece che di tutto nella working directory.
git stash push data_pipeline.py
Puoi anche usare git stash -p per avviare la modalità interattiva (patch), che ti consente di fare stash selettivamente di parti di modifiche all’interno dei file, non dei file interi.
Come misura preventiva, controlla sempre git status prima di fare stash.
Conclusione
Come regola generale, mantieni gli stash di breve durata e usa sempre messaggi descrittivi. Se non tornerai su quel lavoro entro un giorno, creare un branch WIP è un’opzione più sicura perché può essere pushato su un remoto e non andrà perso.
Per rafforzare le tue competenze con Git, ti consiglio di seguire il nostro corso Intermediate Git per imparare a collaborare con Git. Ti consiglio anche il corso Advanced Git per imparare a lavorare con Git in progetti di grandi dimensioni e gestire scenari e problemi complessi di version control nello sviluppo di data pipeline.
Domande frequenti su Git Stash
Git stash salva i file non tracciati?
No, per impostazione predefinita git stash salva solo i file tracciati. Per includere i file non tracciati, usa git stash -u.
Git stash influisce sulla mia cronologia dei commit?
No, gli stash sono separati dalla tua cronologia di commit e non compaiono nei log del branch.
Qual è la differenza tra git stash pop e git stash apply?
git stash pop applica lo stash e lo rimuove, mentre git stash apply applica lo stash ma lo mantiene nella lista degli stash.
Perché Git dice “No local changes to save”?
Questo problema si verifica quando la tua working directory \u00e8 pulita: non ci sono file tracciati modificati o in stage da mettere in stash.
Cosa causa conflitti quando si ripristina uno stash?
I conflitti si verificano quando le stesse parti dei file sono state modificate sia nel tuo branch corrente sia nelle modifiche in stash.


