Aller au contenu principal

Annuler des changements — git reset, git restore, git revert

Module 01 60 min

Objectifs de la section

  • Comprendre les différentes façons d'annuler des changements dans Git
  • Utiliser git restore pour annuler les changements du répertoire de travail
  • Utiliser git reset pour annuler des commits (avec différents impacts)
  • Utiliser git revert pour annuler des commits publiés en toute sécurité
  • Savoir quelle commande utiliser dans quelle situation

Les 3 commandes d'annulation — Vue d'ensemble

CommandeCe qu'elle annuleSûre pour les branches partagées ?
git restoreRépertoire de travail ou zone de stagingOui (local uniquement)
git resetCommits (déplace HEAD)Seulement pour les commits locaux
git revertCrée un nouveau commit « d'annulation »Oui (sûre pour les équipes)

git restore — Annuler les changements locaux

Annuler les changements dans le répertoire de travail

# Annuler les changements d'un fichier (restaurer à la version du dernier commit)
git restore README.md

# Annuler tous les changements non stagés
git restore .

# Restaurer à une version spécifique d'un commit
git restore --source=HEAD~2 README.md
Irréversible !

git restore sur le répertoire de travail est irréversible. Vos changements non commités seront définitivement perdus. Utilisez git stash si vous voulez les conserver temporairement.

Désindexer des fichiers (supprimer de la zone de staging)

# Supprimer un fichier de la zone de staging (garder les changements dans le répertoire de travail)
git restore --staged README.md

# Supprimer tous les fichiers de la zone de staging
git restore --staged .

git reset — Annuler des commits

git reset déplace le pointeur HEAD (et la branche) vers l'arrière dans l'historique. Il y a 3 modes :

Les 3 modes de git reset

ModeCe qui se passeCas d'utilisation
--softHEAD recule, fichiers restent stagésRefaire le message de commit
--mixed (défaut)HEAD recule, fichiers retournent dans le répertoire de travailRefaire ce qui était stagé
--hardHEAD recule, fichiers supprimésAnnuler complètement des commits

Exemples

# --soft : Annuler le dernier commit, garder les changements stagés
git reset --soft HEAD~1
# → Vos fichiers sont toujours stagés, prêts à être recommités

# --mixed (défaut) : Annuler le dernier commit, garder les changements dans le répertoire de travail
git reset HEAD~1
git reset --mixed HEAD~1
# → Vos fichiers sont modifiés mais non stagés

# --hard : Annuler complètement le dernier commit (DANGER : changements perdus !)
git reset --hard HEAD~1
# → Répertoire de travail restauré à l'état du commit précédent

Cas d'utilisation pratiques

# Annuler les 3 derniers commits mais garder les fichiers (pour les regrouper en un seul commit)
git reset --soft HEAD~3
git commit -m "feat: système d'authentification utilisateur complet"

# Annuler un commit et retravailler le staging
git reset HEAD~1
git add -p # Stager plus précisément
git commit -m "Meilleur message de commit et contenu"

# Annuler tout le travail depuis le dernier commit (DANGER)
git reset --hard HEAD
reset sur des branches partagées

N'utilisez jamais git reset sur des commits qui ont déjà été poussés vers une branche partagée. Cela réécrit l'historique et crée des conflits majeurs pour vos coéquipiers. Utilisez git revert à la place.


git revert — Annulation sûre pour les branches partagées

git revert crée un nouveau commit qui annule les changements d'un commit précédent. Il ne réécrit pas l'historique — il l'enrichit.

# Annuler le dernier commit
git revert HEAD

# Annuler un commit spécifique
git revert d5a1b4c

# Annuler sans ouvrir l'éditeur (utiliser le message automatique)
git revert HEAD --no-edit

# Annuler plusieurs commits
git revert HEAD~3..HEAD

# Annuler sans commiter immédiatement (staging uniquement)
git revert HEAD --no-commit

Quand utiliser git revert

SituationCommande
Commit buggé sur maingit revert <commit>
Annuler une fonctionnalité déployéegit revert <commit>
Branche partagée, mauvais commitgit revert <commit>
Branche locale uniquementgit reset (plus rapide)

Arbre de décision — Quelle commande utiliser ?


git stash — Sauvegarder temporairement le travail

git stash vous permet de sauvegarder temporairement votre travail sans le commiter — utile quand vous devez changer de contexte rapidement.

# Sauvegarder le travail actuel (répertoire de travail + staging)
git stash

# Sauvegarder avec un message descriptif
git stash save "WIP: formulaire de connexion en cours"

# Lister les stashs sauvegardés
git stash list
# stash@{0}: On main: WIP: formulaire de connexion en cours
# stash@{1}: WIP on main: d5a1b4c fix: validation email

# Appliquer le dernier stash (le garder dans la liste)
git stash apply

# Appliquer et supprimer de la liste
git stash pop

# Appliquer un stash spécifique
git stash apply stash@{1}

# Supprimer un stash
git stash drop stash@{0}

# Supprimer tous les stashs
git stash clear

# Afficher le contenu d'un stash
git stash show stash@{0}
git stash show -p stash@{0} # Avec diff complet

Workflow typique avec stash

# Vous travaillez sur une fonctionnalité (changements non commités)
# Urgence : bug critique à corriger sur main !

# 1. Sauvegarder votre travail actuel
git stash save "WIP: fonctionnalité tableau de bord"

# 2. Passer sur main pour corriger le bug
git checkout main
git pull
# ... corriger le bug ...
git commit -m "fix: vulnérabilité de sécurité critique"
git push

# 3. Revenir sur votre fonctionnalité
git checkout feature/dashboard

# 4. Restaurer votre travail sauvegardé
git stash pop

Tableau récapitulatif

CommandeDescription
git restore <fichier>Annuler les changements dans le répertoire de travail
git restore --staged <fichier>Supprimer de la zone de staging
git reset --soft HEAD~1Annuler commit, garder en staging
git reset HEAD~1Annuler commit, garder dans le répertoire de travail
git reset --hard HEAD~1Annuler commit, supprimer les changements
git revert <commit>Créer un commit d'annulation (sûr)
git stashSauvegarder temporairement le travail
git stash popRestaurer le travail sauvegardé

Prochaines étapes