top of page
Search
  • fabricefontenoy

Kouroukoukou roukoukou git stash

Updated: Oct 5, 2023


Kouroukoukou roukoukou git stash

Voici une commande bien pratique qui me rappelle à chaque fois ce groupe mythique de ma jeunesse (pour mémoire, la chanson «Stach Stach» est sortie il y a plus de 20 ans en 2002 😅)


Mais je ne suis pas le seul ! Je vous vois 👀, vous qui avez assisté à mes formations et qui, quand j'ai commencé à parler de cette fameuse commande, avez fredonné ce rythme entraînant 🎶 Kouroukoukou roukoukou stach stach 🎶 !


Vous l'avez compris, je ne vais pas vous parler des Bratisla Boys mais plutôt de la commande git stash.


La commande git stash vous permet se sauvegarder de façon temporaire votre travail sans le commiter et de realigner votre espace de travail avec le HEAD.


C'est très pratique notamment si vous avez commencé à travailler et que vous voulez récupérer les commits de la branch distante. Si vous avez un travail en cours, git ne voudra pas appliquer les commits. il faut alors soit supprimer vos modifications, soit les commiter, soit faire un stash. Si vous choisissez la troisième solution, il suffira de faire un stash de votre travail, de faire un rebase sur la branche distante (https://www.gitaddict.com/post/attention-a-git-pull pour comprendre pourquoi il est préférable de faire un rebase) et de réappliquer ensuite le stash.


Cette commande est aussi utile si vous avez commencé à travailler mais dans la mauvaise branche. Le changement de branche sera refusé si votre nouveau travail est conflictuel par rapport à la branche de destination. De la même manière, vous pouvez faire un stash, changer de branche et reappliquer le stash. S'il y a un conflit, il pourra alors être résolu comme pour un merge ou un rebase par exemple.


C'est bien beau tout ce blabla mais comment utilise-t-on cette commande ?


La façon la plus simple de faire un stash de votre travail est de taper la commande :

$ git stash

Votre espace de travail sera alors réaligné sur le HEAD :


Avant et après git stash

Et un nouveau stash sera créé, que vous pourrez voir en tapant :

$ git stash list

stash@{0}: WIP on master: 07ba130 My commit message

Pour le réappliquer, il faudra utiliser la commande :

$ git stash apply

Et vous retrouverez alors vos modifications comme avant :


Avant et après git stash apply

Enfin presque... car il y a une petite différence, l'index n'a pas été rétabli. Si besoin (c'est rarement le cas en réalité), on peut ajouter l'option ---keep-index pour garder l'état de l'index et l'option --keep-index pour le réappliquer cet état par la suite. De même, on voit que les fichiers non suivis ne sont pas traités. On peut les inclure également lors de la création du stash en utilisant l'option --include-untracked (ou -u pour les intimes).


Les stashs que vous sauvegardez sont alors empilés et chaque stash est identifié par un numéro (son index dans la pile) :


$ git stash list

stash@{0}: WIP on master: 07ba130 My commit message
stash@{1}: WIP on master: 07ba130 My commit message

Au lieu d'appliquer le dernier stash, on peut également spécifier un stash par son id :


$ git stash apply stash@{1}

Mais on voit dans l'exemple précédent que la commande de base donne comme description du stash le message :

WIP on <bracnh>: <SHA-1 du commit> <message du commit>

le commit étant le dernier commit sur lequel on est, c'est-à-dire sur lequel pointe le HEAD.


Cela peut donc être compliqué de retrouver quel stash correspond à quoi.

Si l'on veut spécifier un message plus précis pour mieux retrouver son stash par la suite, on peut utiliser la commande :

$ git stash save "This is my stash"

Et on peut également ne faire un stash que de certains fichiers :

$ git stash push file1 file2 -m "Partial stash"

On aura alors nos messages qui s'afficheront dans la liste des stashs :


$ git stash list

stash@{0}: on master: Partial stash
stash@{1}: on master: This is my stash
stash@{2}: WIP on master: 07ba130 My commit message
stash@{3}: WIP on master: 07ba130 My commit message

Une fois utilisé, on peut supprimer un stash avec la commande :

$ git stash drop [stash id]

Ou on peut directement l'appliquer et le supprimer en une commande en tapant :

$ git stash pop [stash id]

Cette commande est très pratique mais doit être utilisée que pour sauvegarder temporairement des modifications pour les réappliquer presque dans la foulée. Si vous devez garder vos modifications plus longtemps, je vous conseille des les commiter dans une branche que vous pourrez retrouver plus facilement par la suite.


Si vous avez fait un stash de vos modifications et qu'en fin de compte vous ne pouvez pas les réappliquer de suite, il y a une commande qui permet de facilement transformer un stash en branche :

$ git stash branch <branche> [stash id]


Voilà vous savez (presque) tout sur la commande stash ! Et si vous avez besoin de plus d'infos sur cette commande... RTFM (ou git stash --help) 😅

25 views

Recent Posts

See All

תגובות


bottom of page