Qu'est-ce que Git Stash ?
Vous êtes en plein développement d'une fonctionnalité quand quelque chose d'urgent survient. Un bug doit être corrigé sur la branch principale, ou un collègue a besoin que vous examiniez sa pull request. Vous n'êtes pas prêt à faire un commit de votre travail en cours, mais vous ne pouvez pas changer de branch avec des modifications non committées dans votre répertoire de travail. C'est exactement le problème que git stash a été conçu pour résoudre.
Git stash prend vos modifications non committées -- à la fois celles en staging et celles qui ne le sont pas -- et les enregistre dans une zone de stockage temporaire. Votre répertoire de travail revient à un état propre, correspondant au dernier commit. Quand vous êtes prêt, vous pouvez récupérer ces modifications. Pensez-y comme si vous posiez votre travail sur une étagère pour vous occuper d'autre chose, puis le repreniez exactement là où vous l'aviez laissé.
Utilisation de base : Stash, Apply et Pop
Sauvegarder des modifications dans le stash
La forme la plus simple est :
git stash
Cela prend tous les fichiers suivis modifiés et en staging et les stocke. Votre répertoire de travail devient propre. Notez que les fichiers non suivis (fichiers que vous n'avez jamais ajoutés à Git) ne sont pas inclus dans le stash par défaut. Pour les inclure, utilisez :
git stash -u
Ou pour tout inclure, même les fichiers ignorés :
git stash -a
Récupérer les modifications avec apply
Une fois votre tâche annexe terminée et que vous voulez récupérer votre travail mis en stash, utilisez :
git stash apply
Cela restaure les modifications du stash dans votre répertoire de travail mais conserve l'entrée du stash intacte. Le stash est toujours sur l'étagère, ce qui peut être utile si vous voulez appliquer les mêmes modifications à plusieurs branches.
Récupérer les modifications avec pop
git stash pop
Pop fonctionne comme apply, mais supprime également l'entrée du stash après l'avoir appliquée. C'est le choix le plus courant quand vous voulez simplement récupérer votre travail et n'avez pas besoin de conserver le stash.
La différence clé : apply conserve le stash, pop le supprime après restauration. Utilisez apply quand vous pourriez avoir besoin du stash à nouveau. Utilisez pop quand vous en avez terminé avec.
Ajouter un message à votre stash
Par défaut, Git étiquette les stashes avec une description auto-générée comme WIP on main: a3b4c5d commit message. Ce n'est pas très utile quand vous avez plusieurs stashes. Vous pouvez ajouter un message descriptif :
git stash push -m "refactoring the auth module"
Cela facilite grandement l'identification du contenu de chaque stash lorsque vous les listez plus tard.
Gérer plusieurs stashes
Lister vos stashes
Git maintient une pile de stashes. Vous pouvez tous les voir avec :
git stash list
Le résultat ressemble à ceci :
stash@{0}: On main: refactoring the auth module
stash@{1}: WIP on feature/checkout: 9f2e1d0 add cart logic
stash@{2}: WIP on main: 7c8d9e1 update dependencies
Le stash le plus récent est toujours stash@{0}. Chaque nouveau stash pousse les plus anciens vers le bas de la pile.
Appliquer ou dépiler un stash spécifique
Par défaut, apply et pop opèrent sur le stash le plus récent. Pour cibler un stash spécifique, référencez-le par son index :
git stash apply stash@{2}
git stash pop stash@{1}
Voir le contenu d'un stash
Avant d'appliquer un stash, vous voudrez peut-être voir ce qu'il contient :
git stash show stash@{0}
Cela affiche un résumé des fichiers modifiés. Pour le diff complet, ajoutez -p :
git stash show -p stash@{0}
Mettre en stash des fichiers spécifiques
Parfois vous ne voulez pas tout mettre en stash. Peut-être souhaitez-vous mettre de côté les modifications d'un ou deux fichiers seulement. Depuis Git 2.13, vous pouvez faire ceci :
git stash push -m "sidebar layout changes" src/components/Sidebar.tsx src/styles/sidebar.css
Seuls les fichiers spécifiés sont mis en stash. Tout le reste reste dans votre répertoire de travail.
Supprimer et vider les stashes
Supprimer un seul stash
Si vous n'avez plus besoin d'un stash spécifique, supprimez-le avec :
git stash drop stash@{1}
Cela supprime cette entrée de stash. Les stashes restants sont ré-indexés automatiquement.
Vider tous les stashes
Pour supprimer tous les stashes d'un coup :
git stash clear
Soyez prudent avec cette commande. Il n'y a pas d'annulation possible. Toutes les modifications mises en stash sont définitivement supprimées.
Créer une branch à partir d'un stash
Parfois vous mettez des modifications en stash, puis réalisez qu'elles méritent leur propre branch. Au lieu d'appliquer le stash puis de créer une branch, Git offre un raccourci :
git stash branch new-feature-branch stash@{0}
Cela crée une nouvelle branch à partir du commit où le stash a été initialement créé, applique le stash et le supprime. C'est particulièrement utile lorsque l'application du stash sur votre branch actuelle provoquerait des conflits.
Pièges courants
- Oublier ses stashes. Les stashes sont faciles à oublier. Lancez
git stash listrégulièrement pour vérifier si vous avez des stashes restants qui devraient être appliqués ou supprimés. - Conflits de stash. Si le code a significativement changé depuis que vous avez fait le stash, l'appliquer peut produire des conflits de merge. Résolvez-les de la même manière que vous résoudriez n'importe quel conflit de merge.
- S'appuyer sur le stash au lieu des commits. Si vous vous retrouvez à faire des stashes fréquemment, envisagez de faire un commit de votre travail en cours à la place. Vous pouvez toujours amend ou squash ces commits plus tard. Le stash est idéal pour les changements de contexte rapides et de courte durée, pas pour le stockage à long terme.
Travailler avec les stashes dans GitSquid
GitSquid affiche les stashes directement sur le graphe de commits, vous permettant de voir d'un coup d'œil quels stashes existent et à partir de quel commit ils ont été créés. Un clic droit sur un stash ouvre un menu contextuel avec des options pour apply, pop, drop ou vider tous les stashes. Cela rend la gestion des stashes plus rapide que de taper des commandes, surtout quand vous avez plusieurs stashes et devez les inspecter ou les nettoyer.
Référence rapide
| Commande | Ce qu'elle fait |
|---|---|
git stash |
Met en stash les modifications suivies |
git stash -u |
Met en stash y compris les fichiers non suivis |
git stash push -m "msg" |
Met en stash avec un message descriptif |
git stash list |
Liste tous les stashes |
git stash apply |
Restaure le stash, conserve l'entrée |
git stash pop |
Restaure le stash, supprime l'entrée |
git stash drop stash@{n} |
Supprime un stash spécifique |
git stash clear |
Supprime tous les stashes |
git stash show -p |
Affiche le diff complet d'un stash |
git stash branch <name> |
Crée une branch à partir d'un stash |
Git stash est un de ces outils qui semble mineur jusqu'à ce que vous en ayez besoin. Une fois que vous êtes à l'aise avec, le changement de contexte entre les tâches devient fluide. Gardez vos stashes organisés avec des messages, nettoyez les anciens régulièrement, et utilisez pop plutôt qu'apply quand vous n'avez pas besoin de conserver le stash.