W3docs

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.

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 status
On branch master
Changes to be committed:
  new file:   style.css
Changes not staged for commit:
  modified:   index.html

Salva le modifiche nello stash

git stash
Saved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepage

Conferma che l'albero di lavoro è ora pulito

git status
On branch master
nothing to commit, working tree clean

Le 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 pop riapplica lo stash più recente alla tua copia di lavoro e lo rimuove dall'elenco degli stash.
  • git stash apply riapplica 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 pop
On 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.

Nota

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 -u

Per salvare nello stash anche i file ignorati, usa l'opzione -a (o --all):

Includi i file non tracciati e ignorati

git stash -a

I 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-index

Questo è 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 list
stash@{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 -p
diff --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 -p
diff --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,?]? n

Comandi per gli hunk

ComandoDescrizione
/Cerca un hunk tramite regex.
?Stampa la guida.
nNon salvare l'hunk nello stash.
aSalva questo hunk e tutti gli hunk successivi nel file nello stash.
dNon salvare questo hunk né gli hunk successivi nel file nello stash.
eModifica manualmente l'hunk corrente.
qEsci (gli hunk selezionati verranno salvati nello stash).
sDividi l'hunk in hunk più piccoli.
ySalva 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 clear
Attenzione

git 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

ComandoCosa fa
git stashSalva nello stash le modifiche staged e unstaged dei file tracciati.
git stash -uSalva nello stash anche i file non tracciati.
git stash -aSalva nello stash anche i file non tracciati e ignorati.
git stash --keep-indexSalva 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 listElenca tutti gli stash (il più recente è stash@{0}).
git stash show -pMostra la diff completa di uno stash.
git stash popRiapplica l'ultimo stash e lo rimuove.
git stash applyRiapplica l'ultimo stash e lo mantiene.
git stash branch <nome>Crea un branch da uno stash e lo applica.
git stash drop / clearElimina uno / tutti gli stash.

Per apprendere altri modi per spostare e annullare il lavoro, consulta git reset, git restore e git checkout.

Esercitazione

Pratica
Quali sono le funzionalità del comando 'git stash'?
Quali sono le funzionalità del comando 'git stash'?
Was this page helpful?