Git : annuler (presque) n'importe quoi

mis à jour le 2026-07-01#git#annuler#restore

Annuler des modifs non stagées

Tu as modifié un fichier et tu veux revenir à la dernière version commitée. ⚠️ git restore écrase tes modifications sans retour possible — vérifie avec git diff que tu ne jettes rien d'important.

shell
git diff                   # relis ce que tu vas perdre / re-read what you're about to lose
git restore <fichier>      # ⚠️ écrase les modifs du fichier / discards the file's changes
git restore .              # ⚠️ écrase TOUTES les modifs / discards ALL changes

Dé-stager un fichier

Tu as fait git add de trop ? restore --staged retire le fichier de la zone de staging sans toucher à son contenu. Aucun risque ici : tes modifs restent dans le fichier.

shell
git restore --staged <fichier>
git restore --staged .     # dé-stage tout / unstage everything

Corriger le dernier commit

Message raté, fichier oublié ? --amend remplace le dernier commit par un nouveau. ⚠️ Ça réécrit l'historique : ne le fais que si le commit n'a pas encore été poussé. S'il est déjà sur le distant, utilise revert (section suivante).

shell
git commit --amend -m "meilleur message"      # corrige le message / fix the message
git add fichier-oublie && git commit --amend --no-edit   # ajoute un fichier / add a file

Annuler un commit poussé

Le commit est déjà sur le distant, d'autres l'ont peut-être récupéré : ne réécris rien. git revert crée un nouveau commit qui applique l'inverse — l'historique reste intact et tout le monde reste synchronisé. C'est LA méthode sûre sur une branche partagée.

shell
git revert <commit>        # annule ce commit par un commit inverse / undo via an inverse commit
git push

Revenir en arrière localement

git reset déplace ta branche sur un commit antérieur. Trois modes, du plus doux au plus destructeur :

  • --soft : les modifs des commits annulés restent stagées (parfait pour re-découper).
  • --mixed (défaut) : elles restent dans les fichiers, non stagées.
  • ⚠️ --hard : tout est effacé, commits ET modifs en cours. À réserver au local, et seulement après un git status propre dans ta tête.
shell
git reset --soft HEAD~1    # annule le commit, garde tout stagé / undo commit, keep staged
git reset HEAD~1           # annule le commit, garde les fichiers / undo commit, keep files
git reset --hard HEAD~1    # ⚠️ efface commit ET modifs / wipes commit AND changes

Retrouver un commit « perdu »

reset --hard de trop, branche supprimée ? Respire : un commit n'est presque jamais vraiment perdu. git reflog journalise tous les déplacements de HEAD pendant ~90 jours. Retrouve le hash d'avant la bêtise, et repars de là.

shell
git reflog                        # historique des positions de HEAD / history of HEAD positions
git switch -c secours <hash>      # nouvelle branche sur le commit retrouvé / new branch on the recovered commit

push --force : le vrai danger

⚠️ Jamais de git push --force sur une branche partagée : tu écrases les commits que tes collègues ont pu pousser entre-temps, sans avertissement. Si tu dois vraiment forcer (après un rebase de TA branche de feature), utilise --force-with-lease : il refuse de pousser si le distant a bougé depuis ta dernière lecture.

shell
git push --force-with-lease    # force "poli" : échoue si le distant a changé / "polite" force: fails if remote changed