infra / git-github
Stash
Explication
Ce que vous allez apprendre
- Mettre de côté un travail en cours sans le committer avec
git stash - Comprendre pourquoi le stash n'est pas un commit mais une pile séparée de l'historique
- Récupérer un stash avec
pop(retire) ouapply(conserve une copie) - Éviter le piège des fichiers non suivis oubliés par un
git stashsimple (-u) - Créer une branche directement depuis un stash en cas de conflit à l'application
Dans quel contexte ?
Un développeur est en plein milieu d'une refonte du formulaire de connexion sur feature/login-refactor, avec des fichiers modifiés mais pas prêts pour un commit, quand un bug critique de paiement doit être corrigé immédiatement sur main. Plutôt que de committer un travail à moitié fini, git stash met ce travail de côté le temps de traiter l'urgence, puis le restitue exactement dans l'état où il a été laissé.
Le problème du travail interrompu
D'abord, il arrive régulièrement d'être en plein milieu d'un développement, avec des fichiers modifiés mais pas encore prêts pour un commit, quand une urgence survient : un bug critique à corriger immédiatement sur une autre branche.
Une mauvaise solution : committer à moitié fini
Committer un travail à moitié fini juste pour "libérer" son espace de travail pollue l'historique de messages du type "wip" peu clairs.
La solution : une troisième option, propre
Le stash offre une troisième option : mettre de côté temporairement ces changements non finalisés, en dehors de l'historique de commits, pour les retrouver plus tard exactement dans l'état où tu les as laissés.
Un espace de rangement, pas l'historique
Il est important de comprendre que le stash n'est pas un commit : c'est une pile de sauvegardes temporaires, séparée de l'historique du projet.
Ce que cette flexibilité permet
On peut en accumuler plusieurs, les nommer pour s'y retrouver, les inspecter avant de les réappliquer, ou même les abandonner s'ils ne sont plus utiles.
Première façon de récupérer son travail
pop réapplique le dernier stash ET le retire immédiatement de la liste, ce qui convient dans le cas simple où tu es sûr de vouloir le réintégrer maintenant.
| Commande | Réapplique le stash ? | Le retire de la liste ? |
|---|---|---|
git stash pop | Oui | Oui |
git stash apply | Oui | Non, garde une copie de sécurité |
git stash drop | Non | Oui |
Une deuxième façon, plus prudente
apply réapplique sans le retirer, gardant une copie de sécurité, utile si tu n'es pas certain que l'application se passera sans accroc.
Un piège fréquent : les nouveaux fichiers
Par défaut, un simple git stash ne met PAS de côté les fichiers totalement nouveaux, non suivis : ils restent visibles dans le répertoire de travail.
La correction à ce piège
L'option -u corrige ce comportement en incluant explicitement les fichiers non suivis dans la sauvegarde temporaire.
Piège fréquent
Un simple git stash avant de basculer sur une autre branche laisse les nouveaux fichiers non suivis visibles dans le répertoire de travail, ce qui peut semer la confusion en pensant que "tout" a été mis de côté. Utilise systématiquement git stash push -u si ta modification en cours inclut des fichiers tout juste créés.
Maintenant que tu sais gérer les interruptions proprement, la leçon suivante s'attaque à un besoin ciblé : appliquer un seul commit précis d'une branche sans tout fusionner, avec le cherry-pick.
Commandes & code
Stash
Le stash met de côté des modifications non commitées, pour changer de contexte rapidement sans les perdre.
# Mettre de côté le travail en cours (working directory redevient propre)
git stash
git stash push -m "WIP: refonte du formulaire de login"
# Inclure aussi les fichiers non suivis (untracked)
git stash push -u -m "WIP avec nouveaux fichiers"
git status # working directory propre, prêt pour un checkout/switch urgentgit switch main
git pull
git switch -c hotfix/critical-bug
# ... corrige le bug urgent, commit, push ...
git switch feature/login-refactor# Récupérer le travail mis de côté
git stash list
# stash@{0}: On feature/login-refactor: WIP: refonte du formulaire de login
# stash@{1}: On main: ancien stash oublié
git stash pop # applique le dernier stash ET le retire de la liste
git stash apply stash@{1} # applique SANS le retirer (garde une copie de sécurité)
git stash drop stash@{1} # supprime un stash précis sans l'appliquer
git stash clear # vide TOUT l'historique de stash# Inspecter un stash avant de l'appliquer, sans risque
git stash show -p stash@{0}
# Créer une branche directement depuis un stash (utile en cas de conflit à l'application)
git stash branch fix/from-stash stash@{0}Résumé
git stashsauvegarde temporairement des changements non commités hors de l'historique.popapplique et supprime,applyapplique et conserve,dropsupprime sans appliquer.stash push -uinclut aussi les fichiers non suivis.stash branchévite un conflit d'application en créant une branche dédiée depuis le stash.
Exercices pratiques
Mission : sauver un travail en cours avant l'urgence
Objectif : Mettre de côté un travail non terminé sans rien perdre, y compris les fichiers nouvellement créés, et le restaurer sans conflit.
Contexte
Un développeur est en plein milieu de la refonte du formulaire de login sur feature/login-refactor, avec le fichier login.js modifié et un tout nouveau fichier login.css jamais encore ajouté à Git, quand un bug critique de paiement doit être corrigé immédiatement sur main.