Durante lo sviluppo di un'applicazione inizializzata con git può capitare di iniziare a fare delle modifiche al repository locale ma bisogna ritornare al punto in cui eravamo prima di iniziare a modificare, però le nostre modifiche non sono ancora pronte per eseguire il commit e quindi il push sul repository remoto, ecco che ci viene in aiuto il comando git stash tramite il quale possiamo mettere da parte le nostre modifiche e ritornare ad una directory di lavoro pulita.
Per ritornare al punto in cui eravamo prima di iniziare ad apportare modifiche si usa il comando -u
$ git stash -u
Saved working directory and index state WIP on main: 0695e41 <last_commit>
dove "last_commit" è il commento usato nell'ultimo commit che abbiamo effettuato, possiamo visualizzare la lista dei stash che abbiamo archiviato tramite il comando list
$ git stash list
stash@{0}: WIP on main: 0695e41 <last_commit>
ogni stash è elencato con il suo nome, ad es. stash@{0} è l'ultimo stash archiviato, stash@{1} è quello precedente, e così via, se nella lista abbiamo tante voci di stash, possiamo applicare al repository uno specifico stash tramite il comando pop seguito dal nome della voce di stash
$ git stash pop stash@{n}
dove n è l'indice corrispondente alla voce di stash, in particolare questo comando elimina la voce di stash dall'archivio, cioè se rilanciamo il comando git stash list non l'avremo più disponibile nella lista.
Per cancellare una specifica voce di stash si usa il comando drop seguito dal nome della voce di stash, ad esempio se vogliamo eliminare stash@{0}
$ git stash drop stash@{0}
Dropped stash@{0} (be5394346d6224123de6c2668ddf83115e57bfed)
Se non vogliamo rimuovere la voce di stash dall'archivio quando la applichiamo al nostro repository (come avviene col comando pop), perchè ad esempio vogliamo avere più versioni diverse delle modifiche che stiamo apportando allora è possibile farlo tramite il comando apply
$ git stash apply stash@{n}
dove n è l'indice relativo alla voce di stash, se lanciamo il comando git stash list apparirà ancora la voce di stash che abbiamo applicato.
Un'altra funzionalità molto utile del comando git stash è quella di poter salvare in uno specifico branch tutte le modifiche archiviate in uno specifico stash.
Ad esempio ipotizziamo di avere i seguenti branch disponibili
$ git branch -a
* main
remotes/origin/HEAD -> origin/main
remotes/origin/main
e vogliamo salvare le modifiche archiviate nello stash stash@{0} in un nuovo branch che chiamiamo ad esempio develop, usiamo il comando branch
$ git stash branch develop stash@{0}
visualizzeremo un messaggio simile a questo
$ git stash branch develop stash@{0}
Switched to a new branch 'develop'
On branch develop
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: ......
no changes added to commit (use "git add" and/or "git commit -a")
Dropped stash@{0} (04ce639e4db9064b52449d874ff72ebbc30c2a86)
il comando crea il nuovo branch develop con le modifiche, successivamente possiamo fare il commit e quindi il push delle modifiche che avevamo archiviato nello stash stash@{0}, nel caso in cui il branch develop non sia presente sul repository remoto usare il seguente comando per crearlo
$ git push -u origin develop
se ritorniamo al branch main
$ git checkout main
avremo una directory di lavoro pulita senza le modifiche che abbiamo salvato nel branch develop.