GIT Tip: Utilizzare Git Stash

Danilo Del Fio
Aug 24, 2018 · 5 min read

Git è diventato de facto lo standard per gestire il versioning del nostro codice, grazie alla sua versatilità e semplicità.

Una delle funzionalità di Git che lo rendono così usabile e potente, è data dalla possibilità di fare il commit nel nostro “repository” locale. E’ risaputo, infatti, che Git è un SCM distribuito, ovvero non esiste un server centrale detentore della verità assoluta, ma, ogni qual volta cloniamo un repository.

git clone

Otteniamo un clone del repo, compresa la history di tutti i commit. Quando facciamo una modica a del del codice e ne vogliamo tracciare le modifiche, utilizziamo il comando

git commit

In questo modo facciamo in modo che le modifiche vengano tracciate e il nostro repository locale sia in linea con le modifiche appena effettuate.

Cosa succede se stiamo lavorando ad una funzionalità ed abbiamo bisogno di cambiare branch, perché un’altra funzionalità è diventata più urgente, ma non vogliamo “sporcare” il nostro repo locale?

Come sappiamo, Git ci impedisce di cambiare branch se abbiamo delle modifiche “in canna”, senza farne il commit. Per ottenere l’effetto descritto in precedenza, quindi, possiamo utilizzare il comando

git stash

Questo comando permette di “mettere da parte per dopo” le modifiche fatte al nostro codice, senza farne il commit, in modo che sia possibile, quindi, tornare all’ultimo “commit” locale e poter, eventualmente, cambiare branch in caso di necessità.

Facciamo un esempio per capire meglio come funziona.

Inizializziamo un repository locale con

git init

in questo modo git inizierà a tracciare le modifiche ai file e alle cartelle della directory in cui si è eseguito il comando.

Creiamo un file index.html all’interno della cartella.

1- Initial commit

A questo punto apportiamo delle modifiche al file, per esempio aggiungendo un campo label ed una lista non ordinata di elementi.

2- Prima modifica

Come possiamo vedere, anche l’IDE che sto utilizzando (Visual Studio code), ci dice che ci sono delle modifiche al file di cui andrà fatto il commit, per tracciarle. Infatti eseguento il comando

git status

otteniamo:

3- git status

Che ci dice che ci sono delle modifiche di cui è necessario fare il commit per poterle tracciare.

Supponiamo, invece, che vogliamo tornare all’ultimo commit senza “sporcare” il nostro repo locale con le modifiche appena effettuate. In questo caso, possiamo, eseguire il comando

git stash

Che, come conseguenza, ci farà tornare il codice alla versione precedente del codice senza perdere le modifiche appena effettuate, per poterci tornare magari a lavorare in un secondo momento.

4- git stash

Il comando, come si può leggere dal log, ci ha fatto tornare al commit “Initial commit” che era il primo commit che avevo eseguito nel mio repo. Eseguendo, di nuovo, il comando git status, otteniamo ora:

5- new git status

E come si può vedere, git non ci segnala nessuna modifica da tracciare, quindi potremmo tranquillamente cambiare branch.

Per visualizzare la lista delle modiche su cui abbiamo eseguito uno stash, basta eseguire il comando

git stash list

In questo modo andremo a visualizzare le varie modifiche effettuate e “messe da parte” con git stash

6- git stash list

stash@{0}: WIP on master f0225e3 Initial commit

ci dice che è stato inserito “qualcosa” nel nostro stash ed ha indice 0 (è importante tenere a mente che esiste un indice, perché potrà essere utile nel caso che utilizzassimo più volte il comando git stash e servirà per recuperare la modifica corrispondente).

Per ripristinare le modifiche che abbiamo “messo da parte” con git stash, basterà eseguire il comando:

git stash apply

Ora ci troviamo il file con le modifiche di figura 2 e possiamo continuare a lavorare alla nostra funzionalità.

Modifichiamo di nuovo il file:

7- nuova funzionalità

Però, ora, utilizziamo un altro comando per “mettere da parte” le modifiche. Eseguiamo:

git stash save “new functionality”

In questo modo il file torna di nuovo alle condizioni iniziali e se visualizziamo di nuovo la lista degli stash otteniamo:

8- git stash list con nuova funzionalità

Dalla lista, vediamo la lista degli stash eseguiti, in cui quello più recente è l’ultimo eseguito (come si può vedere dal messaggio che appare in corrispondenza di stash@{0}).

Ora se eseguissimo di nuovo il comando git stash apply verrebbe ripristinato lo stash più recente, ma possiamo decidere di ripristinare anche solo lo stash precedente (quello con indice 1), indicando l’indice da ripristinare nel comando apply:

git stash apply stash@{1}

9- git stash apply stash@{1}

Il file index.html è tornato ora alla situazione di figura 2, perché, ovviamente abbiamo ripristinato la modifica con indice 1 che era la prima effettuata.

Nella lista delle modifiche sono ancora presenti due stash, come in precedenza, ma esiste il modo di eliminare uno stash dalla lista una volta che viene ripristinato, tramite il comando:

git stash pop

In questo modo il file index.html tornerà alla situazione di figura 7, perché sono state ripristinate le modifiche dell’ultimo stash.

E’ possibile, inoltre, cancellare degli stash che non servono più, per esempio, tramite il comando :

git stash drop stash@{0}

10- empty stash list

Come vediamo, abbiamo la lista degli stash vuota ed il file è esattamente nella versione finale che desideravamo.

Conclusione

Il comando git stash (e tutti i sotto-comandi ad esso associati) è molto utile e se ben utilizzato può fare la differenza nella gestione delle versioni del nostro codice e della collaborazione con altri membri del team.

Danilo Del Fio

Written by

Crazy developer

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade