Retour au cours

infra / git-github

Stash

Leçon 81 exercice

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) ou apply (conserve une copie)
  • Éviter le piège des fichiers non suivis oubliés par un git stash simple (-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.

CommandeRéapplique le stash ?Le retire de la liste ?
git stash popOuiOui
git stash applyOuiNon, garde une copie de sécurité
git stash dropNonOui

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.

bash
# 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 urgent
bash
git switch main
git pull
git switch -c hotfix/critical-bug
# ... corrige le bug urgent, commit, push ...
git switch feature/login-refactor
bash
# 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
bash
# 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 stash sauvegarde temporairement des changements non commités hors de l'historique.
  • pop applique et supprime, apply applique et conserve, drop supprime sans appliquer.
  • stash push -u inclut 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

1 disponible
1

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.

Résoudre l’exercice →