git stash

Branches et fusions

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 clear
[ ] facultatif| ou<arg> valeur à remplacer... répétable--flag option

Options

Cliquez sur une option pour la déplier

Débutant (7)

Enregistrer vos modifications locales dans une nouvelle entrée du stash et les annuler en revenant à HEAD. Utilisez -m pour ajouter un message descriptif. C’est l’action par défaut de 'git stash'.

RecommandéÀ utiliser avec -m pour pouvoir identifier chaque stash plus tard

Exemple

git stash push -m "Work in progress"

Appliquer le stash le plus récent (stash@{0}) à votre répertoire de travail et le retirer de la pile. Si l’application provoque des conflits, l’entrée est conservée pour que vous puissiez résoudre puis la supprimer vous-même.

RecommandéRétablit et supprime le dernier stash ; gardé si l’application provoque un conflit

Exemple

git stash pop

Appliquer un stash sans le retirer de la pile. Contrairement à pop, le stash reste disponible. On peut préciser lequel avec stash@{n}.

Si nécessaireQuand vous avez besoin du même stash plusieurs fois ou sur plusieurs branches

Exemple

git stash apply stash@{1}

Lister toutes les entrées du stash. Chaque entrée montre son index (stash@{n}), la branche où elle a été créée et le message ou la description du commit.

RecommandéVérifiez ce qui est dans le stash avant de faire pop ou drop

Exemple

git stash list

Afficher sous forme de diff les modifications enregistrées dans une entrée du stash. Par défaut, stash@{0}. Ajoutez -p pour voir le patch complet.

RecommandéPrévisualisez avec -p avant d’appliquer

Exemple

git stash show -p stash@{0}

Supprimer une seule entrée de la pile. Sans argument, supprime stash@{0}. Précisez stash@{n} pour en supprimer une autre. Notez le hash affiché - c’est le seul moyen simple de la récupérer.

Si nécessaireFaites le ménage après apply ; notez le hash affiché au cas où vous en auriez besoin

Exemple

git stash drop stash@{1}

Supprimer TOUTES les entrées du stash d’un coup, sans confirmation. On ne peut les récupérer qu’en cherchant des commits orphelins avec git fsck. À utiliser avec une extrême prudence.

DéconseilléSupprime tous les stashs d’un coup, sans confirmation

Exemple

git stash clear

Intermédiaire (3)

Inclure les fichiers non suivis dans le stash. Par défaut, git stash ne garde que les fichiers suivis. Permet de mettre aussi de côté les nouveaux fichiers pas encore ajoutés.

RecommandéSans elle, les nouveaux fichiers non suivis restent derrière

Exemple

git stash -u

Garder la zone de préparation intacte. Seules les modifications non indexées sont retirées du répertoire de travail ; les modifications indexées restent indexées (le stash les enregistre quand même).

Si nécessaireTester ou committer le travail préparé en mettant le reste de côté

Exemple

git stash -k

Créer une nouvelle branche à partir du commit où le stash a été créé, y appliquer le stash et le supprimer si tout se passe bien. Utile quand le stash entre en conflit avec la branche courante.

Si nécessaireLa meilleure solution quand un stash ne s’applique plus proprement sur la branche courante

Exemple

git stash branch new-feature stash@{0}

Avancé (1)

Choisir de façon interactive les blocs à mettre de côté. Permet de ne mettre de côté que certaines parties de vos modifications et de garder les autres dans le répertoire de travail.

Si nécessaireNe mettre de côté que les hunks choisis

Exemple

git stash -p

Choisir la bonne option

Restaurer des modifications mises de côté

Choisir la bonne commande pour restaurer votre travail mis de côté

CommandeGarde le stash ?S’applique àEn cas de conflit
git stash popNon - retiré après applicationBranche couranteStash gardé, conflit à résoudre
git stash applyOui - reste dans la pileBranche couranteStash gardé, conflit à résoudre
git stash branch <name>Non - retiré après applicationNouvelle branche à la base du stashAucun conflit (branche neuve)

Qu’est-ce qui est mis de côté ?

Contrôler quels fichiers entrent dans votre stash

CommandeSuivis modifiésPréparésNon suivisIgnorés
git stashOuiOuiNoNo
git stash -uOuiOuiOuiNo
git stash -aOuiOuiOuiOui
git stash -kOuiOui (et restent aussi indexés)NoNo

Stash ou autres façons de sauvegarder

Quand utiliser le stash plutôt que les alternatives

CommandeConservé oùPartageableIdéal pour
git stashReflog localNoChangement de contexte rapide, sauvegarde temporaire
git commit (WIP)Historique de la brancheOui (si poussé)Travail que vous voudrez peut-être partager ou retrouver
git worktreeRépertoire séparéN/ATravailler sur plusieurs branches en même temps

Gérer plusieurs stashs

Commandes pour travailler avec la pile du stash

CommandeMontre le contenuModifie la pileCas d’usage
git stash listIndex + messageNoVoir tous les stashs
git stash showDiffstatNoAperçu rapide des modifications
git stash show -pDiff completNoExamen détaillé avant application
git stash dropNoOui (en retire un)Supprimer un stash précis
git stash clearNoOui (retire TOUT)Repartir de zéro (dangereux)

Exemples

Mettre de côté les modifications en cours

git stash

Enregistre 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 pop

Applique 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 list

Affiche 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

1
git stash

Mettre de côté les modifications en cours

2
git checkout other-branch

Passer sur l’autre branche

3
(do work, commit if needed)

Terminer le travail urgent

4
git checkout original-branch

Revenir sur votre branche

5
git stash pop

Restaurer les modifications mises de côté

1
git stash push -m "WIP: login validation"

Stash avec un message descriptif

2
(days later...)

Le temps passe

3
git stash list

Voir tous les stashs avec leurs messages

4
git stash show stash@{0}

Prévisualiser le contenu du stash

5
git stash pop

L’appliquer et le retirer quand vous êtes prêt

1
git stash

Mettre vos modifications de côté

2
git checkout branch-a

Passer sur la première branche

3
git stash apply

Appliquer (garde le stash)

4
git commit -m "Add feature"

Committer sur branch-a

5
git checkout branch-b

Passer sur la deuxième branche

6
git stash apply

Appliquer de nouveau le même stash

7
git stash drop

Faire le ménage une fois fini

1
git add ready-file.js

Indexer les modifications prêtes

2
git stash -k

Mettre de côté le non-indexé, garder l’indexé

3
git commit -m "Ready feature"

Committer les modifications indexées

4
git stash pop

Restaurer 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

A:

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.

A:

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.

A:

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.

A:

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.

A:

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

A:

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.