Page 8 sur 10. Choisir restore, revert, reset, stash ou reflog selon ce qu’il faut préserver.
1. Commencer par identifier ce qui existe
Avant une correction d’historique, posez quatre questions : le changement est-il seulement dans les fichiers ? Est-il préparé ? Est-il déjà commité ? A-t-il été partagé ? La réponse détermine les outils adaptés. Lisez status, le diff et le graphe ; copiez si nécessaire un contenu non enregistré important.
| Situation | Outil possible | Effet principal |
|---|---|---|
| Préparation incorrecte | restore --staged | Retire de l’index en conservant le travail |
| Modification locale à abandonner | restore sur un chemin | Remplace le fichier ciblé depuis la source choisie |
| Commit partagé à annuler | revert | Ajoute un nouveau commit inverse |
| Dernier commit privé à refaire | reset --soft ou amend | Réécrit la pointe locale |
| Travail temporaire | stash | Met de côté une sélection de changements |
Il n’existe pas une commande universelle « annuler ». Le périmètre et le caractère partagé du travail comptent davantage que le nom de l’outil.
2. Restore : agir sur les versions des fichiers
git restore --staged README.md
git diff
git diff --cachedLa préparation de README.md est remise à la version de HEAD ; les modifications du fichier restent dans le dossier de travail. Pour abandonner au contraire une modification non préparée de ce fichier, on peut utiliser la commande suivante, uniquement après avoir vérifié que ce contenu doit être perdu :
git restore README.mdPar défaut, cette forme restaure le fichier depuis l’index. Si une première modification est préparée et une seconde non préparée, la seconde est abandonnée au profit de la version préparée. git restore --source=HEAD README.md choisit explicitement HEAD comme source pour le dossier de travail, sans déplacer la branche.
Un contenu jamais commité ni mis de côté n’est pas garanti récupérable par reflog. Lire avant de remplacer est donc essentiel.
3. Revert pour conserver un historique partagé
git log --oneline -5
git revert IDENTIFIANT_DU_COMMITRemplacez l’identifiant par celui du commit à inverser. Revert prépare et enregistre un changement inverse dans un nouveau commit ; les commits d’origine restent dans l’histoire. Cette propriété le rend adapté à beaucoup de corrections sur une branche partagée.
L’inversion peut provoquer des conflits si le contenu a évolué. Après résolution, préparez les fichiers puis utilisez git revert --continue. Pour abandonner l’opération en cours, utilisez git revert --abort.
Un commit de fusion demande un choix de parent et un raisonnement sur les futures fusions ; ne le traitez pas comme un commit ordinaire sans comprendre son rôle. Dans ce cours, l’exercice de revert porte sur un commit simple.
4. Amend et reset sur un travail privé
git add README.md
git commit --amend --no-editAmend remplace le dernier commit par un nouveau, en utilisant l’index et en conservant ici son message. Il peut corriger un oubli avant partage. Son nouvel identifiant explique pourquoi il ne faut pas l’appliquer sans coordination à un commit déjà utilisé par d’autres.
git reset --soft HEAD~1Cette commande recule la branche d’un commit tout en conservant l’index et les fichiers, à condition qu’un parent existe. Les changements du commit retiré peuvent donc être réenregistrés. Le mode mixed, par défaut pour un reset de commit, remet aussi l’index à la cible tout en conservant les fichiers.
5. Stash : interrompre puis reprendre
git stash push -u -m "Brouillon du formulaire"
git stash list
git stash show -p "stash@{0}"
git stash apply "stash@{0}"
git statusDans ce parcours, stash met de côté les changements suivis et, avec -u, les fichiers non suivis. Les fichiers ignorés ne sont pas inclus par cette option. Les guillemets autour de stash@{0} évitent une interprétation du shell, notamment sous PowerShell.
Apply restaure le contenu sans retirer l’entrée. Après vérification de la reprise, git stash drop "stash@{0}" peut supprimer cette entrée. Pop combine une tentative d’application et une suppression en cas de succès ; un conflit peut conserver l’entrée pour permettre la reprise.
Un stash n’est pas un commit envoyé automatiquement au distant et ne doit pas devenir le stockage durable de plusieurs mois de travail. Pour une étape cohérente à partager, préférez un commit sur une branche adaptée.
6. Reflog, HEAD détaché et recherche de régression
git reflog
git switch -c secours IDENTIFIANT_RETROUVEReflog montre des déplacements de références connus localement. Si un commit encore présent n’a plus de branche pratique, créer une branche à son identifiant peut le rendre à nouveau accessible. Les entrées et objets peuvent expirer ; reflog n’est pas une sauvegarde éternelle et ne contient pas tout ce qui a été tapé dans l’éditeur.
Consulter un ancien commit avec git switch --detach IDENTIFIANT place HEAD directement sur ce commit. Pour conserver de nouveaux commits créés dans cette situation, créez une branche avant de quitter ce travail. Une branche nommée clarifie où les retrouver.
git bisect aide à rechercher un commit ayant introduit une régression en testant des versions intermédiaires entre une version bonne et une version mauvaise. Il faut un test reproductible et terminer par git bisect reset pour revenir au contexte initial. Cet outil complète la lecture de log et de diff lorsque l’historique est long.
Exercices corrigés
Exercice 1 - Commit partagé incorrect
L’équipe utilise déjà le commit erroné. Quel outil permet de conserver l’histoire et d’enregistrer son inverse ?
Voir le corrigé détaillé
git revert crée un nouveau commit inverse. Il peut nécessiter une résolution de conflits. Reset déplace une référence et ne produit pas ce même historique partagé.
Exercice 2 - Stash et fichiers ignorés
stash push -u inclut-il node_modules ignoré ?
Voir le corrigé détaillé
Non. -u inclut les fichiers non suivis, mais pas les fichiers ignorés. Il faut connaître le périmètre exact de ce qui est mis de côté.
Exercice 3 - Limite de reflog
Un texte jamais commité a été remplacé par restore. Reflog garantit-il sa récupération ?
Voir le corrigé détaillé
Non. Reflog suit des déplacements de références et ne sauvegarde pas chaque état de l’éditeur. Chercher éventuellement les sauvegardes de l’éditeur ou du système, sans supposer une récupération par Git.
Avant de passer à la suite
Je choisis une récupération en fonction du contenu à préserver et du partage des commits.
Pour approfondir
Sources officielles consultées pour ce chapitre : git restore, git reset, git revert, git stash, git reflog. Cours et schémas originaux ; exemples NKILItech pédagogiques. Vérification documentaire : 28 octobre 2026.