Aller au contenu principal

Commande Git Revert


Table des matières


  1. Différence entre Reset et Revert
  2. Syntaxe de base
  3. Revert un commit simple
  4. Revert plusieurs commits
  5. Revert un merge commit
  6. Gestion des conflits
  7. Bonnes pratiques


1 - Différence entre Reset et Revert



Tableau comparatif

AspectResetRevert
HistoriqueRéécritPréservé
Nouveau commitNonOui
Branche partagée⚠️ Dangereux✅ Sécurisé
TraçabilitéPerteComplè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 ?

SituationCommande
Branche locale, pas encore partagéereset
Branche partagée (main, develop)revert
Vous voulez garder la tracerevert
Vous voulez un historique proprereset (local seulement)

🔝 Retour à la table des matières



2 - Syntaxe de base



Revert un commit

git revert <commit-hash>

Options courantes

OptionDescription
-n ou --no-commitNe pas créer de commit automatiquement
-e ou --editModifier le message (par défaut)
--no-editGarder 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

  1. Git ouvre l'éditeur pour le message de commit
  2. Message par défaut : Revert "feat: add broken feature"
  3. 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é

CommandeUsage
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 --abortAnnuler en cas de problème

🔝 Retour à la table des matières