Vous avez fait une erreur sur un commit et vous cherchez comment corriger ? Ce guide part de ce que vous observez (le symptôme) et vous mène directement à la solution. Que le commit soit local ou déjà poussé, qu'il s'agisse d'une faute de frappe ou d'un commit entier à annuler, Git a une commande adaptée. Vous repartirez avec un arbre de décision clair pour ne plus hésiter.
Prérequis : Annuler des modifications et Git reset démystifié.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Choisir entre
--amend,resetetrevertselon la situation - Corriger un message de commit sans modifier le contenu
- Annuler un commit local proprement sans laisser de trace
- Inverser un commit publié avec
git revertsans réécrire l'historique - Récupérer des commits après un
reset --hardaccidentel
Arbre de décision : quelle commande utiliser ?
Section intitulée « Arbre de décision : quelle commande utiliser ? »Avant de taper quoi que ce soit, posez-vous deux questions : le commit est-il déjà poussé ? et que voulez-vous corriger ?
Mon commit a un problème├── Le commit est LOCAL (pas encore poussé)│ ├── Juste le message → git commit --amend│ ├── Fichier oublié → git add + git commit --amend│ ├── Annuler 1 commit → git reset --soft HEAD~1│ └── Annuler N commits → git reset --soft HEAD~N│├── Le commit est PUBLIÉ (déjà poussé)│ ├── Annuler 1 commit → git revert <SHA>│ ├── Annuler un merge → git revert -m 1 <SHA>│ └── Annuler plusieurs → git revert <SHA1>..<SHA2>│└── J'ai fait reset --hard par erreur └── git reflog + git reset --hard <SHA>La règle est simple : --amend et reset pour le local, revert
pour le publié. Le reflog est votre filet de sécurité.
« Mon message de commit est faux »
Section intitulée « « Mon message de commit est faux » »Vous venez de commiter et le message contient une faute ou ne décrit pas bien la modification :
git commit --amend -m "feat: ajouter la validation du formulaire"Vérification :
git log --oneline -1Le SHA du commit change, c'est un nouveau commit qui remplace l'ancien. Le contenu des fichiers reste identique.
« J'ai oublié un fichier dans mon commit »
Section intitulée « « J'ai oublié un fichier dans mon commit » »Vous avez commité, puis vous réalisez qu'un fichier manque :
-
Ajoutez le fichier oublié au staging
Fenêtre de terminal git add fichier-oublie.ts -
Intégrez-le au dernier commit
Fenêtre de terminal git commit --amend --no-edit
Le --no-edit conserve le message original. Le résultat est un seul
commit contenant toutes les modifications.
Pour retirer un fichier commité par erreur (sans le supprimer du disque) :
git restore --staged fichier-secret.envgit commit --amend --no-edit« Je veux annuler mon dernier commit local »
Section intitulée « « Je veux annuler mon dernier commit local » »Le commit n'a pas été poussé et vous voulez le défaire. Choisissez le
mode de reset selon ce que vous voulez garder :
| Mode | Commande | Modifications | Staging |
|---|---|---|---|
| Soft | git reset --soft HEAD~1 | Conservées | Conservées (prêtes à recommiter) |
| Mixed (défaut) | git reset HEAD~1 | Conservées | Vidé (à re-ajouter avec git add) |
| Hard | git reset --hard HEAD~1 | Supprimées | Vidé |
Le cas le plus courant est --soft, il annule le commit mais garde
tout en staging, prêt à être recommité différemment :
git reset --soft HEAD~1Vérification :
git status# Les fichiers sont dans "Changes to be committed"Pour annuler les 3 derniers commits et les regrouper en un :
git reset --soft HEAD~3git commit -m "feat: fonctionnalité complète"« Je veux annuler un commit déjà poussé »
Section intitulée « « Je veux annuler un commit déjà poussé » »Le commit est sur le remote et d'autres développeurs l'ont peut-être
récupéré. On ne réécrit pas l'historique partagé, on crée un commit
inverse avec git revert :
git revert a1b2c3dGit ouvre l'éditeur pour le message (par défaut :
Revert "Message original"). Sauvegardez pour créer le commit de
revert.
Vérification :
git log --oneline -3Sortie attendue :
f8e7d6c Revert "feat: ajouter le cache"a1b2c3d feat: ajouter le cache9a8b7c6 fix: corriger le timeoutLe commit a1b2c3d reste dans l'historique, revert ne l'efface pas,
il applique les modifications inverses dans un nouveau commit.
Revert sans ouvrir l'éditeur
Section intitulée « Revert sans ouvrir l'éditeur »git revert --no-edit a1b2c3dRevert de plusieurs commits
Section intitulée « Revert de plusieurs commits »Pour annuler une série de commits (du plus ancien au plus récent) :
git revert --no-edit a1b2c3d..e5f6a7b« Je veux annuler un merge déjà poussé »
Section intitulée « « Je veux annuler un merge déjà poussé » »Un merge commit a deux parents. Il faut indiquer à Git quel parent
est la « branche principale » avec -m :
git revert -m 1 <SHA-du-merge>-m 1 signifie : « garde le premier parent (généralement main) et
annule les changements amenés par le second parent (la feature branch) ».
Vérification, confirmez que le merge est bien inversé :
git diff HEAD~1 HEAD --statLes fichiers modifiés par le merge doivent apparaître comme « supprimés » ou « modifiés inversement ».
« J'ai fait reset --hard par erreur »
Section intitulée « « J'ai fait reset --hard par erreur » »Pas de panique. Le reflog enregistre chaque mouvement de HEAD dans votre repo local. Vos commits ne sont pas vraiment perdus, ils sont juste « déréférencés ».
-
Consultez le reflog pour retrouver le SHA perdu
Fenêtre de terminal git reflogSortie typique :
a1b2c3d HEAD@{0}: reset: moving to HEAD~3e4f5a6b HEAD@{1}: commit: feat: ma feature importantec7d8e9f HEAD@{2}: commit: fix: corriger le bug loginb0a1c2d HEAD@{3}: commit: docs: mise à jour README -
Restaurez HEAD à la position d'avant le reset
Fenêtre de terminal git reset --hard e4f5a6bOu en utilisant la notation reflog :
Fenêtre de terminal git reset --hard HEAD@{1}
Vérification :
git log --oneline -5Vos commits sont de retour. Le reflog conserve 90 jours les
entrées encore accessibles, mais seulement 30 jours celles qui
ne le sont plus (gc.reflogExpireUnreachable). Un commit écarté par
un reset ou un amend tombe dans la seconde catégorie : comptez
sur un mois, pas sur trois.
Dépannage : problèmes courants
Section intitulée « Dépannage : problèmes courants »| Symptôme | Cause probable | Solution |
|---|---|---|
--amend a changé le SHA et le push est rejeté | Le commit original était déjà poussé | git push --force-with-lease (si vous êtes seul sur la branche) ou git revert |
error: could not revert + conflits | Le revert entre en conflit avec des changements ultérieurs | Résolvez les conflits, puis git revert --continue |
git revert --abort pour repartir à zéro | Revert trop complexe, vous voulez annuler | Normal, repart à l'état avant le revert |
reset --soft n'annule qu'un seul commit | Vous voulez annuler plusieurs commits | Utilisez HEAD~N (ex : HEAD~3 pour 3 commits) |
| Le reflog est vide | Reflog expiré (30 jours pour une entrée devenue inaccessible) ou repo fraîchement cloné | Essayez git fsck --lost-found pour trouver les objets orphelins |
revert d'un merge échoue sans -m | Git ne sait pas quel parent garder | Ajoutez -m 1 pour garder le premier parent (main) |
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »- Arbre de décision :
--amendpour corriger le dernier commit local,resetpour annuler des commits locaux,revertpour les commits publiés git commit --amendcorrige le message ou ajoute des fichiers au dernier commit (change le SHA)git reset --soft HEAD~Nannule N commits en gardant les modifications prêtes à recommitergit revertcrée un commit inverse, sûr pour les branches partagéesgit revert -m 1est nécessaire pour annuler un merge commit- Le reflog (
git reflog) est votre filet de sécurité, il conserve 90 jours les entrées accessibles, 30 jours celles qui ne le sont plus, et c'est le cas de ce que vous cherchez après unresetou unamend ORIG_HEADpermet d'annuler immédiatement la dernière opération
FAQ : questions fréquentes
Section intitulée « FAQ : questions fréquentes »git reset --soft HEAD~1
Il annule le commit mais garde vos modifications prêtes à recommiter. Variantes : --mixed (défaut, vide aussi le staging) et --hard (supprime tout, à manier avec prudence).Si le commit est déjà poussé, n'utilisez pas reset : préférez git revert (voir plus bas).git reset |
git revert |
|
|---|---|---|
| Effet | Supprime des commits | Crée un commit inverse |
| Historique | Réécrit (nouveaux SHA) | Préservé |
| Usage | Commits locaux non poussés | Commits déjà poussés |
reset pour le local, revert pour le publié. On ne réécrit jamais un historique partagé.git revert, qui crée un commit inverse sans réécrire l'historique partagé :git revert a1b2c3d
Le commit original reste dans l'historique ; un nouveau commit applique les changements inverses. Pour annuler un merge déjà poussé, précisez le parent à garder :git revert -m 1 <SHA-du-merge>
git commit --amend, tant que le commit n'est pas poussé :git commit --amend -m "feat: ajouter la validation du formulaire"
Le SHA change (c'est un nouveau commit qui remplace l'ancien), mais le contenu des fichiers reste identique. Pour aussi ajouter un fichier oublié : git add fichier puis git commit --amend --no-edit.git reflog
git reset --hard HEAD@{1}
Juste après l'opération, encore plus rapide :git reset --hard ORIG_HEAD
En dernier recours, git fsck --lost-found retrouve les objets orphelins.Pour aller plus loin
Section intitulée « Pour aller plus loin »- Récupérer des données perdues dans Git : Le reflog rattrape un reset qui a effacé plus de commits que prévu.
- Débloquer un push Git rejeté : La marche à suivre quand une correction locale ne passe plus sur le dépôt distant.
- Nettoyer l'historique et les fichiers Git : Le traitement d'un secret ou d'un gros fichier déjà committé, au-delà d'une simple annulation.