Continuons notre série d’articles sur Git – le b.a.-ba.

Quand vous travaillez dans un dépôt Git, vous avez parfois besoin de sauvegarder votre travail en cours sans forcément le commiter. Ceci est possible avec le remisage et la commande git stash.

Jusqu’à présent je n’utilisais que 2 commandes pour le remisage :

# remiser le travail en cours
$ git stash

# retourner dans la dernière version de travail
$ git stash pop

Ce sont vraiment les 2 lignes de commandes minimales à connaitre. Mais quand on multiplie les branches et surtout les interruptions (ie. les tâches en parallèle), il est nécessaire de mieux connaitre le fonctionnement du remisage et les commandes utiles.

Sauvegarder et mettre de côté les modifications

Nous venons de le voir, un simple git stash fera l’affaire. Après avoir exécuté cette commande, toutes vos modifications disparaissent de votre espace de travail.

Restaurer les dernières modifications

Si on souhaite seulement restaurer les dernières modifications, il faut alors procéder à un git stash apply. Dans ce cas, vos modifications seront de nouveau présentes dans votre espace de travail. Et elles sont également toujours sauvegardées. Vous pourrez donc les appliquer de nouveau plus tard si besoin.

Ce qui est intéressant ici, c’est qu’il est possible d’appliquer la modification à une autre branche que la branche sur laquelle a été faite la modification à l’origine.

De plus, par défaut, seules les modifications sont appliquées. Si vous aviez des indexations en cours lors du remisage, il est possible de les restaurer également avec l’option --index et donc de cette façon git stash apply --index.

Lister les modifications sauvegardées

Pas de suspens. Il faut faire un git stash list pour avoir la liste de vos modifications enregistrées.

Nommer une modification

En multipliant les modifications, il va être rapidement nécessaire de pouvoir les identifier rapidement. Heureusement pour nous, il est possible de nommer une modification lors du remisage avec la commande git stash save "test du nouveau framework JS à la mode".

Restaurer une modification en particulier

La liste des remisages retourne un identifiant de la forme stash@{N}. Il est possible de restaurer une modification en particulier à partir de cet identifiant avec la commande suivante git stash apply stash@{0}.

Consulter une sauvegarde

Vous souhaitez vérifier le contenu d’une sauvegarde avant de l’appliquer ? Rien de plus simple avec git stash show stash@{0} qui retournera l’équivalent d’un git diff --stat. Si vous souhaitez obtenir le contenu des modifications (comme avec git diff), il faut alors ajouter l’option -p comme ceci : git stash show -p stash@{0}.

Supprimer une sauvegarde

Le dernier remisage peut être supprimé avec la commande git stash drop. Si vous souhaitez supprimer une sauvegarde en particulier, il faut alors préciser son identifiant : git stash drop stash@{0}.

Restaurer et supprimer une sauvegarde

On retrouve ici la commande de base git stash pop qui vous permet d’appliquer votre modification précédemment sauvegardée tout en l’oubliant.

Créer une branche à partir d’une sauvegarde

Vous aviez mis de côté une modification et maintenant vous devez vous remettre dessus et même créer une branche spécifique ? Rien de plus simple avec git stash branch stash@{0}.

Annuler une restauration

Imaginons que vous avez restauré une modification sur laquelle vous réalisez d’autres modifications. Puis arrive un moment où vous souhaitez annuler seulement les modifications de la remise mais pas celles qui ont suivi. Vous suivez ? Ceci est possible en chainant 2 commandes git : git stash show -p stash@{0} | git apply -R.

Aller plus loin

Comme vous avez pu le constater, un “stash” se manipule comme un commit. vous pouvez donc y appliquer les mêmes opérations telles que merge, patch, checkout, etc…

Sans pousser une utilisation aussi avancée, vous avez maintenant toutes les clés pour gérer vos différentes modifications concurrentes sans avoir à créer des branches ou faire des commits pour rien.