Commande Git Revert
Table des matières
- Différence entre Reset et Revert
- Syntaxe de base
- Revert un commit simple
- Revert plusieurs commits
- Revert un merge commit
- Gestion des conflits
- Bonnes pratiques
1 - Différence entre Reset et Revert
Tableau comparatif
| Aspect | Reset | Revert |
|---|---|---|
| Historique | Réécrit | Préservé |
| Nouveau commit | Non | Oui |
| Branche partagée | ⚠️ Dangereux | ✅ Sécurisé |
| Traçabilité | Perte | Complète |
Visualisation
Reset : Supprime les commits de l'historique
Avant: A---B---C---D (HEAD)
Après: A---B (HEAD)
C et D sont supprimés
Revert : Crée un nouveau commit qui annule
Avant: A---B---C---D (HEAD)
Après: A---B---C---D---D' (HEAD)
D' annule les changements de D
Quand utiliser quoi ?
| Situation | Commande |
|---|---|
| Branche locale, pas encore partagée | reset |
| Branche partagée (main, develop) | revert |
| Vous voulez garder la trace | revert |
| Vous voulez un historique propre | reset (local seulement) |
🔝 Retour à la table des matières
2 - Syntaxe de base
Revert un commit
git revert <commit-hash>
Options courantes
| Option | Description |
|---|---|
-n ou --no-commit | Ne pas créer de commit automatiquement |
-e ou --edit | Modifier le message (par défaut) |
--no-edit | Garder le message par défaut |
-m <parent> | Spécifier le parent pour un merge commit |
🔝 Retour à la table des matières
3 - Revert un commit simple
Exemple
# Voir l'historique
git log --oneline
# abc1234 feat: add broken feature
# def5678 docs: update readme
# ghi9012 Initial commit
# Revert le commit problématique
git revert abc1234
Ce qui se passe
- Git ouvre l'éditeur pour le message de commit
- Message par défaut :
Revert "feat: add broken feature" - Un nouveau commit est créé qui annule les changements
Résultat
git log --oneline
# xyz7890 Revert "feat: add broken feature"
# abc1234 feat: add broken feature
# def5678 docs: update readme
# ghi9012 Initial commit
Revert sans éditeur
git revert abc1234 --no-edit
Revert avec message personnalisé
git revert abc1234 -m "fix: revert broken feature due to bug #123"
🔝 Retour à la table des matières
4 - Revert plusieurs commits
Méthode 1 : Un par un
git revert abc1234
git revert def5678
git revert ghi9012
Crée 3 commits de revert.
Méthode 2 : Plage de commits
# Revert les commits de A à C (A non inclus, C inclus)
git revert A..C
# Exemple : revert les 3 derniers commits
git revert HEAD~3..HEAD
Méthode 3 : Sans commit intermédiaire
# Préparer tous les reverts sans commiter
git revert --no-commit abc1234
git revert --no-commit def5678
git revert --no-commit ghi9012
# Vérifier les changements
git status
git diff --staged
# Un seul commit pour tout
git commit -m "revert: remove features X, Y, Z"
🔝 Retour à la table des matières
5 - Revert un merge commit
Le problème
Un merge commit a deux parents. Git ne sait pas lequel considérer comme "principal".
A---B---C feature
/ \
D---E---F---G---M main
↑ ↑
parent1 parent2
Solution : Spécifier le parent
# -m 1 = garder la ligne principale (main)
git revert -m 1 <merge-commit-hash>
# -m 2 = garder la branche mergée (feature)
git revert -m 2 <merge-commit-hash>
Exemple pratique
# Voir les parents d'un merge commit
git log --oneline <merge-commit>
# Merge: abc1234 def5678
# Revert en gardant main (généralement -m 1)
git revert -m 1 <merge-commit>
Attention !
Après avoir revert un merge, si vous voulez re-merger la même branche plus tard, vous devrez d'abord revert le revert :
# 1. Merge initial
git merge feature # Crée commit M
# 2. Problème, on revert
git revert -m 1 M # Crée commit R
# 3. Plus tard, on veut re-merger feature
# Mais feature semble déjà mergée !
git merge feature # "Already up to date"
# 4. Solution : revert le revert
git revert R # Crée commit R'
# 5. Maintenant on peut continuer avec feature
git merge feature # Fonctionne !
🔝 Retour à la table des matières
6 - Gestion des conflits
Pourquoi des conflits ?
Si le code a évolué depuis le commit à revert, Git peut ne pas savoir comment "annuler" proprement.
Résoudre les conflits
# Le revert génère un conflit
git revert abc1234
# CONFLICT (content): Merge conflict in file.txt
# 1. Voir les fichiers en conflit
git status
# 2. Éditer les fichiers et résoudre les conflits
code file.txt # ou votre éditeur
# 3. Marquer comme résolu
git add file.txt
# 4. Continuer le revert
git revert --continue
Annuler un revert en cours
git revert --abort
Exemple de conflit
Le fichier avant résolution :
<<<<<<< HEAD
Code actuel après évolutions
=======
Code original (avant le commit à revert)
>>>>>>> parent of abc1234
Vous devez choisir quelle version garder ou combiner les deux.
🔝 Retour à la table des matières
7 - Bonnes pratiques
✅ Utilisez revert quand...
- La branche a été partagée (push)
- D'autres développeurs ont basé leur travail dessus
- Vous voulez garder une trace claire de ce qui s'est passé
- Vous devez pouvoir annuler l'annulation plus tard
❌ N'utilisez PAS revert quand...
- Vous êtes sur une branche locale privée (utilisez reset)
- Vous voulez nettoyer l'historique avant un merge
Messages de commit
Bon message de revert :
Revert "feat: add payment processing"
This reverts commit abc1234.
Reason: Critical bug causing duplicate charges.
Will be reimplemented after fix in #456.
Workflow recommandé
# 1. Identifier le commit problématique
git log --oneline
# 2. Vérifier ce qu'il a changé
git show abc1234
# 3. Faire le revert
git revert abc1234
# 4. Tester que tout fonctionne
npm test # ou vos tests
# 5. Pousser
git push origin main
Résumé
| Commande | Usage |
|---|---|
git revert <hash> | Annuler un commit |
git revert --no-commit <hash> | Préparer sans commiter |
git revert -m 1 <hash> | Revert un merge |
git revert --abort | Annuler en cas de problème |