Un parcours du tutoriel Changement de branche d'urgence : comment git stash met de côté les changements non commités pour que vous puissiez changer de branche, et comment ramener le travail.
Ce scénario traite le problème « je dois changer de branche tout de suite, mais je suis en plein milieu de quelque chose ». Vous avez du travail inachevé dans l'arbre de travail et il vous faut une branche propre pour vous en aller. git stash est fait exactement pour ça.
La situation
Mettez votre travail en cours dans le stash pour changer de branche avec un arbre propre.
Vous êtes sur la branche feature/contact-form, à mi-parcours de l'ajout d'un formulaire de contact dans index.html. Le changement n'est pas commité et n'est pas prêt à l'être. Quelque chose d'urgent vous demande maintenant d'aller sur une autre branche.
Vous ne voulez pas commiter une demi-fonctionnalité, ni perdre le travail. Vous devez le mettre de côté, basculer, puis le reprendre plus tard.
Exécutez d'abord git status pour voir le changement non commité sur index.html. C'est exactement ce que le stash va vous garder.
Le flux, étape par étape
git stash pop ramène vos changements stashés dans l'arbre de travail.
Vérifier ce qui n'est pas commité
git status
index.html apparaît comme modifié. Ce travail en cours est ce que vous allez mettre dans le stash.
Mettre les changements dans le stash
git stash
Git sauvegarde vos changements non commités sur la pile de stash et rétablit l'arbre de travail dans un état propre. La branche a maintenant l'air de ne pas avoir encore commencé le formulaire.
Changer de branche et faire l'autre travail
git checkout main
Avec un arbre de travail propre, changer de branche est instantané et sûr. Vous pouvez vous occuper de la tâche urgente sur main.
Revenir et restaurer le travail
git checkout feature/contact-form
git stash pop
De retour sur la branche de feature, git stash pop réapplique vos changements du formulaire et les retire du stash. Vous êtes exactement là où vous vous étiez arrêté.
Stash plutôt que commit, pourquoi ?
Un commit est un point permanent de l'historique ; le stash est une zone de garde temporaire :
- Commiter quand le travail est une étape significative et complète.
- Stasher quand vous avez juste besoin de garer un instant un travail inachevé.
git stash list affiche tout ce que vous avez stashé. Vous pouvez stasher plusieurs fois, et chaque entrée attend jusqu'à ce que vous fassiez pop ou drop.
pop supprime l'entrée après réapplication. Si un conflit survient pendant le pop, résolvez-le comme un conflit de fusion ; l'entrée du stash reste jusqu'à ce que le pop réussisse.
La boîte à outils du stash
Chaque stash est empilé sur une pile : stash@{0}, stash@{1}, et ainsi de suite.
Le stash, c'est plus que push et pop. Les commandes vers lesquelles vous vous tournerez :
- Sauvegarder le travail —
git stash (changements suivis), git stash -u (aussi les fichiers non suivis), git stash push -m "message" (nommé, plus facile à retrouver plus tard)
- Voir ce que vous avez mis dans le stash —
git stash list, et git stash show -p stash@{0} pour afficher un diff
- Le ramener —
git stash pop (appliquer et retirer) ou git stash apply (appliquer et conserver) ; ciblez-en un précis avec git stash apply stash@{1}
- Faire le ménage —
git stash drop stash@{0} retire une entrée, git stash clear les retire toutes
- Transformer un stash en branche —
git stash branch <name>, pratique quand le stash ne s'applique plus proprement
Expérimentez ici avec plusieurs stash à la fois pour que stash@{0} et stash@{1} cessent d'être déroutants.