Annuler des changements — git reset, git restore, git revert
Objectifs de la section
- Comprendre les différentes façons d'annuler des changements dans Git
- Utiliser
git restorepour annuler les changements du répertoire de travail - Utiliser
git resetpour annuler des commits (avec différents impacts) - Utiliser
git revertpour annuler des commits publiés en toute sécurité - Savoir quelle commande utiliser dans quelle situation
Les 3 commandes d'annulation — Vue d'ensemble
| Commande | Ce qu'elle annule | Sûre pour les branches partagées ? |
|---|---|---|
git restore | Répertoire de travail ou zone de staging | Oui (local uniquement) |
git reset | Commits (déplace HEAD) | Seulement pour les commits locaux |
git revert | Cré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
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
| Mode | Ce qui se passe | Cas d'utilisation |
|---|---|---|
--soft | HEAD recule, fichiers restent stagés | Refaire le message de commit |
--mixed (défaut) | HEAD recule, fichiers retournent dans le répertoire de travail | Refaire ce qui était stagé |
--hard | HEAD recule, fichiers supprimés | Annuler 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
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
| Situation | Commande |
|---|---|
Commit buggé sur main | git revert <commit> |
| Annuler une fonctionnalité déployée | git revert <commit> |
| Branche partagée, mauvais commit | git revert <commit> |
| Branche locale uniquement | git 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
| Commande | Description |
|---|---|
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~1 | Annuler commit, garder en staging |
git reset HEAD~1 | Annuler commit, garder dans le répertoire de travail |
git reset --hard HEAD~1 | Annuler commit, supprimer les changements |
git revert <commit> | Créer un commit d'annulation (sûr) |
git stash | Sauvegarder temporairement le travail |
git stash pop | Restaurer le travail sauvegardé |
Prochaines étapes
- TP2 - Fondamentaux Git — Pratiquer toutes ces commandes
- Module 02 - Branches & Merge