Git : annuler (presque) n'importe quoi
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.
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 changesDé-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.
git restore --staged <fichier>
git restore --staged . # dé-stage tout / unstage everythingCorriger 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).
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 fileAnnuler 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.
git revert <commit> # annule ce commit par un commit inverse / undo via an inverse commit
git pushRevenir 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 ungit statuspropre dans ta tête.
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 changesRetrouver 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à.
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 commitpush --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.
git push --force-with-lease # force "poli" : échoue si le distant a changé / "polite" force: fails if remote changed