W3docs

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é.

stash

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 status
On branch master
Changes to be committed:
  new file:   style.css
Changes not staged for commit:
  modified:   index.html

Mettre les modifications en stash

git stash
Saved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepage

Confirmer que le répertoire de travail est maintenant propre

git status
On branch master
nothing to commit, working tree clean

Vos 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 pop réapplique le stash le plus récent à votre copie de travail et le supprime de la liste des stashes.
  • git stash apply ré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 pop
On 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.

Note

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 -u

Pour mettre également en stash les fichiers ignorés, utilisez l'option -a (ou --all) :

Inclure les fichiers non suivis et ignorés

git stash -a

Les 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-index

C'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 list
stash@{0}: WIP on master: 5002d47 our new homepage
stash@{1}: WIP on master: 049d078 add navigation
stash@{2}: WIP on master: 38e3b29 initial layout

Il 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 -p
diff --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 -p
diff --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,?]? n

Commandes de hunk

CommandeDescription
/Rechercher un hunk par regex.
?Afficher l'aide.
nNe pas mettre le hunk en stash.
aMettre ce hunk et tous les hunks suivants du fichier en stash.
dNe pas mettre ce hunk ni les hunks suivants du fichier en stash.
eÉditer manuellement le hunk actuel.
qQuitter (les hunks sélectionnés seront mis en stash).
sDiviser le hunk en hunks plus petits.
yMettre 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 clear
Avertissement

git 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

CommandeCe qu'elle fait
git stashMettre en stash les modifications indexées et non indexées des fichiers suivis.
git stash -uInclure également les fichiers non suivis.
git stash -aInclure également les fichiers non suivis et ignorés.
git stash --keep-indexMettre 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 listLister tous les stashes (le plus récent est stash@{0}).
git stash show -pAfficher le diff complet d'un stash.
git stash popRéappliquer le stash le plus récent et le supprimer.
git stash applyRé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 / clearSupprimer 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.

Pratique

Pratique
Quelles sont les fonctionnalités de la commande 'git stash' ?
Quelles sont les fonctionnalités de la commande 'git stash' ?
Was this page helpful?