Vous travaillez tranquillement sur votre petite branche dans votre petite zone de confort, quand tout à coup, un PM sauvage apparait! Celui-ci pris de panique vient vous contaminer avec son stress et vous informe qu’il y a un bug en prod. Vous voilà maintenant embarqué dans une course contre la montre. Affolé et tenté par le fait de pouvoir changer de branche rapidement, vous vous apprêtez à faire un commit. Ensuite, vous reprenez vos esprits, et vous vous rappelez que la commande git stash existe !

Stasher vos changements avec git stash

En d’autres termes, dès que vous devez réaliser un checkout rapide ou un merge mais que vous n’avez pas envie de commit votre feature ou votre fix (car c’est encore en cours). Il vous suffit de stasher le tout. Vous retrouverez le code dans l’état dans lequel il était au moment du dernier commit. Concernant vos modifications, elles seront sauvegardées dans un fichier spécifique.

Pour stasher vos changements, rien de plus simple il suffit de faire :

git stash
#Vous pouvez également faire un git stash avec un message custom
git stash save "ma super feature"

Le head pointe maintenant sur le dernier commit et l’ensemble de vos changements sont sauvegardés dans un fichier.

Afficher la liste des stash avec git stash list

Pour afficher l’ensemble de vos stash il vous suffit de faire un git stash list :

$ git stash list
#Le stash le plus récent se trouve au dessus.
stash@{0}: On master: ma super feature 2
stash@{1}: On master: ma super feature

Si le message custom de votre stash ne vous rappel rien. Vous pouvez également obtenir plus d’infos sur ce que le stash contient avec la commande :

$ git stash show stash@{0}
# @{0} étant le numéro du stash que vous obtennez avec git stash list
about.php | 2 +- 
1 file changed, 1 insertion(+), 1 deletion(-)
#Si vous désirez voir les changements précis au niveau du code source, utilisez l'option -p -> git stash show stash@{0} -p 

Restaurer vos changements avec git stash pop et git stash apply

Une fois que vous avez terminé ce que vous aviez à faire, vous pouvez réappliquer vos changements contenu dans un stash directement dans votre working copy. Pour ce faire, deux solutions sont possibles :

  • La première façon de le faire est d’utiliser la commande git stash pop. Il faut voir cette commande comme si vous “popiez” un élement dans une stack. Cette commande à donc comme effet d’appliquer les changements de votre dernier stash sur la branche actuelle et de supprimer celui-ci.
git stash pop
  • Si par contre, vous désirez concerver votre stash (pour l’appliquer sur plusieurs branches par exemple). Il vous suffit d’utiliser git stash apply en spécifiant le numéro du stash.
git stash apply stash@{0}

Créer une branche depuis un stash

Si les changements de la branche locale actuelle diffèrent beaucoup trop avec ceux de votre stash. Vous avez la possibilité de créer une branche depuis votre stash :

$ git stash branch branch_name stash@{0}
Switched to a new branch 'branch_name'

Cette commande créera une nouvelle branche avec les changements de votre stash, supprimera votre stash et réalisera un checkout sur le nom de la branche.

Nettoyer vos stash

Vous pouvez supprimer un stash particulier avec la commande :

git stash drop stash@{0}

Et vous pouvez supprimer l’ensemble de vos stash avec la commande :

git stash clear

Stasher les fichiers non traqués

Quand vous réalisez un stash, git va par défaut stasher les fichiers qui ont été ajoutés dans votre index (avec un git add). GIT ne tiendra pas compte des nouveaux fichiers qui ne sont pas dans votre répertoire de travail ou des fichiers qui sont ignorés (dû à gitgnore par exemple).

$ touch app.py
$ git add .
$ touch test.py
$ git status
On branch master
Changes to be committed:
new file: app.py
Untracked files:
test.py
$ git stash
$ git status
On branch master
Untracked files:
test.py

Si vous désirez que GIT prenne en compte ces fichiers, il vous suffit d’utiliser l’option –include-untracked (équivalent à -u)

$ touch test.py
$ git stash -u
#équivalent à git stash --include-untracked
$ git status
On branch master
nothing to commit, working tree clean

Exemples de cas d’usage

Pouvoir réaliser un pull alors que des changements sont en cours

Pour pouvoir réaliser un pull alors que vous avez des changements en cours non “commités”. Si aucun conflit ne sont détectés, un simple pull devrait suffir. Par contre, en cas de conflits, vous pouvez stasher vos modifications, réaliser le pull et rétablir le stash.

$ git pull
 ...
Cannot pull because there are uncommitted changes. Commit or undo your changes before pulling again. See the Output window for details.
$ git stash
$ git pull
$ git stash pop

Réaliser un fix sur une branche sur laquelle vous travaillez actuellement

Si votre PM vous demande un rapide fix sur la branche sur laquelle vous travaillez actuellement. Ne créez pas une seconde branche pour pouvoir “committer” vos changements, mais procédez comme ceci :

# vous faites des changements
$ git stash
# vous réalisez le fix
$ git add .
$ git commit -m "Mon super fix"
$ git push origin ma_branche
$ git stash pop
# Vous continuez vos changements

Git stash cheat sheet

On vous a concocter une petite sheet qui récapitule toutes les commandes qui vous seront utiles si vous compter stasher vos changements 🙂

GIT stash cheat sheet

N’hésitez pas à nous faire part de vos remarques ou améliorations en commentaires 🙂

0 clap