git stash
Mettre de côté les modifications d’un répertoire de travail modifié
La commande 'git stash' prend vos modifications non committées (indexées ou non), les met de côté pour plus tard, puis les retire de votre copie de travail. Vous pouvez réappliquer les modifications mises de côté avec 'git stash pop' ou 'git stash apply'. Le stash est utile quand vous devez changer vite de contexte pour travailler sur autre chose, alors que votre modification en cours n’est pas prête à être committée. Le stash est une pile : vous pouvez avoir plusieurs stashs.
Synopsis
git stash list [<log-options>]
git stash show [-u | --include-untracked | --only-untracked] [<diff-options>] [<stash>]
git stash drop [-q | --quiet] [<stash>]
git stash pop [--index] [-q | --quiet] [<stash>]
git stash apply [--index] [-q | --quiet] [<stash>]
git stash branch <branchname> [<stash>]
git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet] [-u | --include-untracked] [-a | --all] [(-m | --message) <message>] [--] [<pathspec>...]]
git stash clearOptions
Choisir la bonne option
Restaurer des modifications mises de côté
Choisir la bonne commande pour restaurer votre travail mis de côté
| Commande | Garde le stash ? | S’applique à | En cas de conflit |
|---|---|---|---|
git stash pop | Non - retiré après application | Branche courante | Stash gardé, conflit à résoudre |
git stash apply | Oui - reste dans la pile | Branche courante | Stash gardé, conflit à résoudre |
git stash branch <name> | Non - retiré après application | Nouvelle branche à la base du stash | Aucun conflit (branche neuve) |
Qu’est-ce qui est mis de côté ?
Contrôler quels fichiers entrent dans votre stash
| Commande | Suivis modifiés | Préparés | Non suivis | Ignorés |
|---|---|---|---|---|
git stash | Oui | Oui | No | No |
git stash -u | Oui | Oui | Oui | No |
git stash -a | Oui | Oui | Oui | Oui |
git stash -k | Oui | Oui (et restent aussi indexés) | No | No |
Stash ou autres façons de sauvegarder
Quand utiliser le stash plutôt que les alternatives
| Commande | Conservé où | Partageable | Idéal pour |
|---|---|---|---|
git stash | Reflog local | No | Changement de contexte rapide, sauvegarde temporaire |
git commit (WIP) | Historique de la branche | Oui (si poussé) | Travail que vous voudrez peut-être partager ou retrouver |
git worktree | Répertoire séparé | N/A | Travailler sur plusieurs branches en même temps |
Gérer plusieurs stashs
Commandes pour travailler avec la pile du stash
| Commande | Montre le contenu | Modifie la pile | Cas d’usage |
|---|---|---|---|
git stash list | Index + message | No | Voir tous les stashs |
git stash show | Diffstat | No | Aperçu rapide des modifications |
git stash show -p | Diff complet | No | Examen détaillé avant application |
git stash drop | No | Oui (en retire un) | Supprimer un stash précis |
git stash clear | No | Oui (retire TOUT) | Repartir de zéro (dangereux) |
Exemples
Mettre de côté les modifications en cours
git stashEnregistre toutes les modifications non committées (indexées ou non) dans la pile du stash et ramène le répertoire de travail à HEAD.
Stash avec un message descriptif
git stash push -m "WIP: login feature"Met les modifications de côté avec un message personnalisé, pour s’y retrouver facilement quand vous avez plusieurs stashs.
Appliquer et retirer le dernier stash
git stash popApplique le stash le plus récent (stash@{0}) à votre répertoire de travail et le retire de la pile.
Lister tous les stashs
git stash listAffiche toutes les entrées du stash avec leur index, le nom de la branche et le message. Utile pour gérer plusieurs stashs.
Exemples de workflows
git stashMettre de côté les modifications en cours
git checkout other-branchPasser sur l’autre branche
(do work, commit if needed)Terminer le travail urgent
git checkout original-branchRevenir sur votre branche
git stash popRestaurer les modifications mises de côté
git stash push -m "WIP: login validation"Stash avec un message descriptif
(days later...)Le temps passe
git stash listVoir tous les stashs avec leurs messages
git stash show stash@{0}Prévisualiser le contenu du stash
git stash popL’appliquer et le retirer quand vous êtes prêt
git stashMettre vos modifications de côté
git checkout branch-aPasser sur la première branche
git stash applyAppliquer (garde le stash)
git commit -m "Add feature"Committer sur branch-a
git checkout branch-bPasser sur la deuxième branche
git stash applyAppliquer de nouveau le même stash
git stash dropFaire le ménage une fois fini
git add ready-file.jsIndexer les modifications prêtes
git stash -kMettre de côté le non-indexé, garder l’indexé
git commit -m "Ready feature"Committer les modifications indexées
git stash popRestaurer le reste de votre travail
Dépannage
error: Your local changes to the following files would be overwritten by merge
Cause : Tentative de pop/apply d’un stash qui entre en conflit avec le répertoire de travail actuel
Committez ou mettez de côté les modifications en cours d’abord, ou utilisez 'git stash branch <name>' pour créer une nouvelle branche à partir du stash
No stash entries found
Cause : La pile du stash est vide, ou vous regardez le mauvais index
Lancez 'git stash list' pour voir les stashs disponibles. Rappelez-vous que stash@{0} est le plus récent.
Le stash n’a pas gardé mes nouveaux fichiers
Cause : Par défaut, git stash ne garde que les fichiers suivis
Utilisez 'git stash -u' pour inclure les fichiers non suivis, ou 'git stash -a' pour inclure aussi les fichiers ignorés
Mauvais stash appliqué / annuler un pop
Cause : Vous avez fait pop sur la mauvaise entrée du stash
Si le pop a échoué avec des conflits, le stash est toujours là. S’il a réussi, vos modifications sont dans le répertoire de travail - refaites simplement 'git stash' si besoin
Stash perdu après clear/drop
Cause : git stash clear/drop supprime définitivement des entrées du stash
Essayez 'git fsck --unreachable | grep commit' puis 'git show <hash>' pour retrouver les commits de stash perdus. Récupération non garantie.
Astuces et pièges
Bonnes pratiques
- ✓Donnez toujours des messages descriptifs avec 'git stash push -m "description"' - vous vous en remercierez plus tard
- ✓Préférez 'git stash apply' à 'git stash pop' quand vous risquez d’avoir encore besoin du stash
- ✓Utilisez 'git stash -u' si vous avez de nouveaux fichiers non suivis à mettre de côté
- ✓Ne laissez pas les stashs s’accumuler - nettoyez régulièrement les anciens avec 'git stash drop'
- ✓Pour une sauvegarde de longue durée, envisagez un commit WIP plutôt qu’un stash
- ✓Utilisez 'git stash show -p' pour relire le contenu d’un stash avant de l’appliquer
- ✓Quand stash pop échoue à cause de conflits, le stash est conservé - résolvez les conflits puis supprimez-le à la main
Erreurs fréquentes
- ✗Oublier que 'git stash' ne garde par défaut que les fichiers suivis. Utilisez '-u' ou '--include-untracked' pour mettre de côté les nouveaux fichiers non suivis.
- ✗Utiliser 'git stash pop' alors que vous pourriez vouloir appliquer le même stash sur plusieurs branches. Utilisez plutôt 'git stash apply' pour garder le stash.
- ✗Ne pas donner de messages descriptifs aux stashs, puis oublier ce que contient chacun. Utilisez toujours 'git stash push -m "description"'.
- ✗Lancer 'git stash clear' sans réaliser qu’il supprime TOUS les stashs sans confirmation. On ne peut les récupérer qu’en fouillant les commits orphelins avec 'git fsck'.
- ✗Confondre l’ordre de la pile : stash@{0} est le stash le PLUS récent, pas le plus ancien.
FAQ
Pop applique le stash ET le retire de la pile. Apply l’applique seulement et garde le stash disponible. Utilisez apply quand vous pourriez avoir besoin du même stash ailleurs.
Par défaut, le stash ne garde que les fichiers suivis. Utilisez 'git stash -u' pour inclure les fichiers non suivis, ou 'git stash -a' pour inclure aussi les fichiers ignorés.
Utilisez 'git stash show' pour un résumé rapide, ou 'git stash show -p' pour le diff complet. Ajoutez stash@{n} pour voir un stash précis.
Oui ! Utilisez 'git stash push -m "message" -- file1.js file2.js' pour ne mettre de côté que certains fichiers, ou 'git stash -p' pour choisir les blocs de façon interactive.
Le stash n’est PAS retiré en cas de conflit. Résolvez les conflits à la main, puis utilisez 'git stash drop' pour supprimer le stash une fois terminé.
Les stashs ne dépendent pas des branches. Passez simplement sur la branche cible et lancez 'git stash apply'. Ou utilisez 'git stash branch <name>' pour créer une nouvelle branche.