Il comando git stash serve per mettere da parte tutte le attuali modifiche non committate, per recuperarle in un secondo momento. In pratica, serve in tutte quelle occasioni in cui si sono effettuate una serie di modifiche “WIP” (work in progress), non è ancora il momento di effettuare un commit, ma è necessario tornare tornare temporaneamente a una situazione “pulita”.
$ git status On branch master Changes to be committed: modified: style.css Changes not staged for commit: modified: index.html $ git stash Saved working directory and index state WIP on master: c5dfcdb add new logo $ git status On branch master nothing to commit, working tree clean
Le modifiche (staged e non) messe da parte sono salvate nello stack degli stash e potranno essere applicate nuovamente in un secondo momento.
Nota: lo stash fa parte del proprio repository locale, non sono trasferiti al server remoto.
Per utilizzare al meglio gli stash è utile ricordare alcune cose:
- non si è limitati a salvare un singolo stash, ogni volta che si mette da parte uno stash questo finisce in cima alla pila di stash
- è possibile recuperare l’ultimo stash salvato togliendo dalla pila con git stash pop oppure lasciandolo nella pila con git stash apply
- è possibile recuperare uno degli stash precedenti usando il loro indice git stash pop stash@{2} (0 il più recente)
- nello stash finiscono di default solo le modifiche apportate ai file tracciati, ma è possibile usare l’opzione git stash -u per includere anche i file untracked
$ git stash list stash@{0}: WIP on main: 5002d47 our new homepage stash@{1}: WIP on main: 5002d47 our new homepage stash@{2}: WIP on main: 5002d47 our new homepage
La pila degli stash ci permette di sapere rispetto a quale branch e commit è stato creato il singolo stash (nota: la pila degli stash è del repository, quindi si possono trovare stash da branch locali diversi)
Alcune azioni comuni lavorando con gli stash:
- git stash drop stash@{1} – rimuove uno specifico stash (1)
- git stash clear – elimina tutti gli stash
- git stash show -p – mostra il diff di uno stash (nota: rispetto al commit/branch da cui è stato “creato”, non rispetto alla attuale working copy)