Aller au contenu
English
English
Développement medium

Annuler des modifications dans Git

30 min de lecture

Ce guide vous apprend à corriger vos erreurs dans Git. Que vous ayez ajouté un fichier par erreur au staging, commité trop vite, ou publié un commit défectueux, Git offre une commande pour chaque situation. Trois d'entre elles ne détruisent rien. La quatrième, git restore sur un fichier, supprime définitivement vos modifications non commitées, et cette page le signale à chaque fois qu'elle l'emploie.

Prérequis : comprendre le cycle add/commit et consulter l'historique.

  • Retirer un fichier du staging sans perdre vos modifications
  • Annuler des modifications dans le répertoire de travail avec restore
  • Modifier le dernier commit avec --amend avant de partager
  • Inverser un commit public avec revert sans réécrire l'historique
ScénarioCommandeDanger
Retirer un fichier du staginggit restore --stagedAucun, les fichiers restent modifiés
Annuler les modifications d'un fichiergit restorePerte des modifications non commitées
Corriger le dernier commitgit commit --amendRéécrit l'historique local
Inverser un commit publiégit revertAucun, crée un nouveau commit

Le tableau ci-dessus résume les quatre situations que vous rencontrerez. Les sections suivantes détaillent chacune d'elles.

Vous avez fait git add sur un fichier par erreur. Le fichier est dans le staging, mais vous ne voulez pas le commiter.

Fenêtre de terminal
git restore --staged style.css

Vérification :

Fenêtre de terminal
git status

Le fichier passe de "Changes to be committed" à "Changes not staged for commit". Les modifications dans le fichier ne sont pas perdues, elles restent dans votre répertoire de travail.

Pour retirer tous les fichiers du staging :

Fenêtre de terminal
git restore --staged .

Vous avez modifié un fichier et vous voulez abandonner ces modifications. La commande est git restore, et sa subtilité tient en une phrase : elle restaure depuis l'index, pas depuis le dernier commit. Tant que vous n'avez rien mis dans l'index, les deux portent la même version et la nuance ne se voit pas. Dès que vous faites un git add, elle décide du résultat.

Fenêtre de terminal
git restore style.css

Vérification :

Fenêtre de terminal
git diff style.css

Aucune sortie signifie que le fichier est désormais identique à l'index. C'est exactement ce que compare git diff sans argument : le répertoire de travail et l'index, pas le répertoire de travail et le dernier commit.

Pour restaurer tous les fichiers modifiés :

Fenêtre de terminal
git restore .

La démonstration tient en quelques commandes. On met trois versions différentes dans les trois arbres de Git, puis on regarde laquelle git restore ramène :

Fenêtre de terminal
git show HEAD:style.css # ce que porte le dernier commit
git show :style.css # ce que porte l'index
cat style.css # ce que porte le répertoire de travail
version COMMITEE
version INDEXEE
version TRAVAIL
Fenêtre de terminal
git restore style.css
cat style.css
version INDEXEE

Le fichier revient à la version indexée, pas à celle du commit. Si vous vouliez celle du commit, il faut la demander.

Chaque forme dit d'où vient le contenu et où il va. C'est le seul modèle à retenir, il rend les trois commandes évidentes :

CommandeSourceDestination
git restore style.cssl'indexle répertoire de travail
git restore --staged style.cssle dernier commitl'index
git restore --source=HEAD --staged --worktree style.cssle dernier commitl'index et le répertoire de travail

La troisième forme est celle qui correspond vraiment à « remettre ce fichier comme au dernier commit ». Les deux premières sont des demi-tours partiels, ce qui est souvent ce qu'on veut, à condition de le savoir.

Vous pouvez restaurer un fichier depuis n'importe quel commit :

Fenêtre de terminal
git restore --source=a1b2c3d style.css

Le fichier est restauré avec le contenu qu'il avait dans le commit a1b2c3d. La modification est placée dans votre répertoire de travail, prête à être commitée.

Vous avez fait une faute de frappe dans votre message de commit :

Fenêtre de terminal
git commit --amend -m "Message corrigé"

Vous avez oublié d'inclure un fichier dans le dernier commit :

  1. Ajoutez le fichier oublié au staging

    Fenêtre de terminal
    git add fichier-oublie.css
  2. Corrigez le commit en conservant le même message

    Fenêtre de terminal
    git commit --amend --no-edit

Le résultat est un seul commit contenant toutes les modifications. L'ancien commit est remplacé par le nouveau (SHA différent).

Quand un commit a déjà été poussé et partagé avec d'autres développeurs, on ne réécrit pas l'historique. On crée un nouveau commit qui annule les modifications du commit fautif :

Fenêtre de terminal
git revert a1b2c3d

Git ouvre l'éditeur pour le message. Le message par défaut est Revert "Message du commit original". Vous pouvez le modifier si besoin, puis sauvegarder.

Vérification :

Fenêtre de terminal
git log --oneline -3

Sortie attendue :

f8e7d6c Revert "Message du commit original"
a1b2c3d Message du commit original
9a8b7c6 Commit précédent

Le commit a1b2c3d est toujours dans l'historique, git revert ne l'efface pas. Il crée un nouveau commit (f8e7d6c) qui applique les modifications inverses.

Fenêtre de terminal
git revert --no-edit a1b2c3d

Pour inverser une série de commits :

Fenêtre de terminal
git revert --no-edit a1b2c3d..e5f6a7b

Cela crée un commit de revert pour chaque commit de la plage, du plus récent au plus ancien.

J'ai fait git add par erreur ?
└─→ git restore --staged <fichier>
Je veux abandonner mes modifications locales ?
└─→ git restore <fichier> (IRRÉVERSIBLE) (source : l'index)
Je veux vraiment revenir au dernier commit ?
└─→ git restore --source=HEAD --staged --worktree <fichier>
Mon dernier commit a un problème ? (pas encore poussé)
└─→ git commit --amend
Mon commit est déjà poussé/partagé ?
└─→ git revert <SHA>
SymptômeCause probableSolution
git restore ne fait rienLe fichier est déjà identique à l'index, sa source par défautVérifiez avec git status et git diff
git restore ne ramène pas la version attendueLe fichier avait été indexé : c'est l'index qui est restauré, pas le commitgit restore --source=HEAD --staged --worktree <fichier>
error: could not revertConflit lors du revertRésolvez le conflit, puis git revert --continue
--amend a modifié le mauvais commitVous aviez des commits non poussés entregit reflog pour retrouver l'ancien SHA, puis git reset --soft SHA
Modifications perdues après git restoreComportement normal, les modifications non commitées sont suppriméesCommitez souvent pour éviter les pertes
git revert HEAD~3..HEAD ne revert pas ce que j'attendaisLa syntaxe de plage exclut la borne gaucheUtilisez HEAD~3^..HEAD ou revertissez un par un

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

10 questions
6 min.
70% requis

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

  • git restore --staged retire un fichier du staging sans le modifier : il copie le dernier commit dans l'index
  • git restore copie l'index dans le répertoire de travail, pas le dernier commit. Pour viser le commit, il faut --source=HEAD --staged --worktree (irréversible dans les deux cas)
  • git commit --amend corrige le dernier commit local (message ou contenu)
  • git revert crée un commit inverse, sûr pour les commits partagés
  • Règle d'or : --amend pour le local, revert pour le partagé
  • Commitez souvent, c'est la meilleure protection contre les pertes
  • Alias et productivité : Des raccourcis pour les commandes de correction que vous venez de voir.
  • Les branches Git : Le module qui isole vos essais, de sorte qu'une annulation ne touche jamais la branche principale.
  • Reset démystifié : Les trois arbres de Git et les modes soft, mixed et hard qui agissent derrière chaque annulation.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens ce site gratuitement, sans publicité, sans profilage et sans compte à créer. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn