git stash
Découvrez la commande git stash, comment mettre de côté votre travail, et gérer plusieurs stashes et stashes partiels.
Ce que fait git stash
La commande git stash met de côté les modifications apportées à votre copie de travail afin que vous puissiez travailler sur autre chose, puis revenir et les réappliquer ultérieurement. C'est la réponse à une situation très courante : vous êtes au milieu d'une modification lorsque vous devez changer de branche, récupérer des mises à jour ou corriger un bug urgent — mais votre travail n'est pas suffisamment avancé pour être commité. Au lieu de créer un commit temporaire, vous stockez les modifications dans le stash, obtenez un répertoire de travail propre, effectuez l'autre travail, puis restaurez vos modifications ensuite.
Un stash est stocké sous forme d'un objet spécial semblable à un commit, sur une pile de type dernier entré, premier sorti (LIFO). Chaque entrée contient un instantané de vos fichiers suivis modifiés, et (par défaut) Git laisse votre répertoire de travail propre une fois le stash effectué.

Cette page couvre la mise en stash et la restauration des modifications, y compris les fichiers non suivis et ignorés, le travail avec plusieurs stashes, l'inspection et le stash partiel des modifications, la création d'une branche à partir d'un stash, et le nettoyage. Pour un rappel sur les modifications indexées et non indexées, consultez git add et git status.
Mettre votre travail en stash
La commande git stash prend à la fois les modifications non commitées indexées et non indexées des fichiers suivis, les sauvegarde pour une utilisation ultérieure, puis les supprime de votre copie de travail. Commencez par exécuter git status pour voir l'état non propre. Ensuite, exécutez git stash pour mettre les modifications en stash :
Vérifier l'état du répertoire de travail
git statusOn branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.htmlMettre les modifications en stash
git stashSaved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepageConfirmer que le répertoire de travail est maintenant propre
git statusOn branch master
nothing to commit, working tree cleanVos modifications sont stockées en toute sécurité et votre répertoire de travail correspond au dernier commit, vous pouvez donc changer de branche ou récupérer des mises à jour librement.
Réappliquer vos modifications mises en stash
Il existe deux commandes pour restaurer un stash, et la différence est importante :
git stash popréapplique le stash le plus récent à votre copie de travail et le supprime de la liste des stashes.git stash applyréapplique les modifications mais les conserve dans la liste des stashes, ce qui est pratique lorsque vous souhaitez appliquer le même stash à plusieurs branches.
Appliquer le stash le plus récent et le supprimer
git stash popOn branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{0} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)La ligne Dropped refs/stash@{0} confirme que l'entrée a été supprimée après un pop réussi.
Si la réapplication d'un stash produit des conflits de fusion (parce que les fichiers sous-jacents ont changé entre-temps), git stash pop ne supprimera pas le stash — il laisse les marqueurs de conflit pour que vous les résolviez et conserve l'entrée pour que vous ne perdiez pas votre travail. Résolvez les conflits, puis supprimez-le manuellement avec git stash drop.
Mettre en stash les fichiers non suivis ou ignorés
Par défaut, git stash ne stocke que les modifications que Git suit déjà : les modifications indexées et les modifications apportées aux fichiers suivis. Il ne mettra pas en stash les nouveaux fichiers qui n'ont jamais été indexés, ni les fichiers ignorés. Pour inclure les fichiers non suivis, utilisez l'option -u (ou --include-untracked) :
Inclure les fichiers non suivis
git stash -uPour mettre également en stash les fichiers ignorés, utilisez l'option -a (ou --all) :
Inclure les fichiers non suivis et ignorés
git stash -aLes fichiers correspondant à votre .gitignore ne sont mis en stash que lorsque vous passez -a. Utilisez cette option avec parcimonie — elle peut englober des artefacts de compilation et des configurations locales que vous ne vouliez probablement pas déplacer.
Conserver les modifications indexées avec --keep-index
Lorsque vous souhaitez tester uniquement vos modifications indexées de manière isolée, git stash --keep-index met tout en stash mais laisse le contenu de l'index dans votre répertoire de travail :
Tout mettre en stash mais conserver ce qui est indexé
git stash --keep-indexC'est utile avant de commiter : mettez le travail non indexé en stash, exécutez vos tests contre exactement ce que vous êtes sur le point de commiter, puis faites git stash pop pour ramener le reste.
Stashes multiples
Vous pouvez exécuter git stash plusieurs fois pour créer plusieurs stashes, puis exécuter git stash list pour les afficher. Par défaut, chaque stash est étiqueté "WIP" — work in progress (travail en cours) — avec la branche et le commit à partir desquels il a été créé. Le stash le plus récent est stash@{0} ; les plus anciens ont des index plus élevés.
Lister les stashes
git stash liststash@{0}: WIP on master: 5002d47 our new homepage
stash@{1}: WIP on master: 049d078 add navigation
stash@{2}: WIP on master: 38e3b29 initial layoutIl est recommandé d'ajouter un message descriptif plutôt que l'étiquette "WIP" par défaut, afin de pouvoir distinguer les stashes ultérieurement :
Mettre en stash avec un message
git stash push -m "wip: experimental dark theme"Par défaut, git stash pop réapplique le stash le plus récent, stash@{0}. Vous pouvez cibler un stash spécifique en passant sa référence à pop ou apply :
Récupérer un stash spécifique
git stash pop stash@{2}On branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{2} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)Afficher les diffs d'un stash
Utilisez git stash show pour afficher un résumé des fichiers modifiés par un stash :
Résumé d'un stash
git stash show index.html | 1 +
style.css | 3 +++
2 files changed, 4 insertions(+)Par défaut, git stash show affiche le stash le plus récent. Passez une référence telle que git stash show stash@{1} pour inspecter un stash plus ancien. Ajoutez l'option -p ou --patch pour voir le diff complet :
Diff complet d'un stash
git stash show -pdiff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>Stashes partiels
Git vous permet de choisir si vous souhaitez mettre en stash un seul fichier, un groupe de fichiers ou des modifications individuelles au sein des fichiers. La commande git stash -p (ou --patch) itère sur chaque hunk — un morceau continu de modification — dans la copie de travail et vous demande si vous souhaitez le mettre en stash :
Mettre en stash des hunks sélectionnés de manière interactive
git stash -pdiff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
Stash this hunk [y,n,q,a,d,/,e,?]? y
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>
Stash this hunk [y,n,q,a,d,/,e,?]? nCommandes de hunk
| Commande | Description |
|---|---|
| / | Rechercher un hunk par regex. |
| ? | Afficher l'aide. |
| n | Ne pas mettre le hunk en stash. |
| a | Mettre ce hunk et tous les hunks suivants du fichier en stash. |
| d | Ne pas mettre ce hunk ni les hunks suivants du fichier en stash. |
| e | Éditer manuellement le hunk actuel. |
| q | Quitter (les hunks sélectionnés seront mis en stash). |
| s | Diviser le hunk en hunks plus petits. |
| y | Mettre le hunk en stash. |
Créer une branche à partir d'un stash
Parfois, le commit à partir duquel vous avez mis des modifications en stash a tellement évolué que réappliquer le stash provoquerait des conflits. git stash branch résout ce problème en créant une nouvelle branche à partir du commit où le stash a été créé à l'origine, en y appliquant le stash, puis en le supprimant en cas de succès :
Créer une branche à partir d'un stash
git stash branch add-stylesheet stash@{1}Switched to a new branch 'add-stylesheet'
On branch add-stylesheet
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{1} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)Nettoyer le stash
Les stashes ne sont pas supprimés automatiquement, la liste peut donc s'allonger avec le temps. Supprimez un seul stash avec git stash drop :
Supprimer un stash
git stash drop stash@{1}Dropped stash@{1} (17e2697fd8251df6163117cb3d58c1f62a5e7cdb)Pour supprimer tous les stashes en même temps, utilisez git stash clear :
Supprimer tous les stashes
git stash cleargit stash clear et git stash drop suppriment définitivement les modifications mises en stash et celles-ci ne font partie d'aucune branche, donc un git log normal ne les affichera pas. Si vous supprimez un stash par erreur, vous pourrez peut-être encore récupérer l'objet via git reflog et git stash apply <commit-hash> avant que la collecte des déchets ne le supprime.
Référence rapide des commandes
| Commande | Ce qu'elle fait |
|---|---|
git stash | Mettre en stash les modifications indexées et non indexées des fichiers suivis. |
git stash -u | Inclure également les fichiers non suivis. |
git stash -a | Inclure également les fichiers non suivis et ignorés. |
git stash --keep-index | Mettre en stash, mais conserver les modifications indexées dans le répertoire de travail. |
git stash push -m "message" | Mettre en stash avec une étiquette descriptive. |
git stash list | Lister tous les stashes (le plus récent est stash@{0}). |
git stash show -p | Afficher le diff complet d'un stash. |
git stash pop | Réappliquer le stash le plus récent et le supprimer. |
git stash apply | Réappliquer le stash le plus récent et le conserver. |
git stash branch <name> | Créer une branche à partir d'un stash et l'appliquer. |
git stash drop / clear | Supprimer un / tous les stashes. |
Pour découvrir d'autres façons de déplacer et d'annuler du travail, consultez git reset, git restore et git checkout.