Accéder au contenu principal

Git Revert Merge Commit : Un guide avec des exemples

Apprenez à annuler en toute sécurité une fusion Git en utilisant `git revert`, en préservant l'historique des livraisons et en résolvant les conflits potentiels.
Actualisé 14 févr. 2025  · 7 min de lecture

Nous pouvons compromettre une application en fusionnant du code problématique, que ce soit en intégrant accidentellement un travail inachevé dans la branche principale ou en négligeant un bogue critique qui a échappé aux tests automatisés.

Dans cet article, je vais vous guider à travers le processus d'utilisation de git revert pour annuler une fusion en toute sécurité, en veillant à ce que l'historique des livraisons reste intact et que l'intégrité du projet soit préservée.

Devenez ingénieur en données

Développez vos compétences en Python pour devenir un ingénieur de données professionnel.
Commencez gratuitement

Comment git revert Travaux

Nous pouvons considérer git revert comme la version Git de la commande undo. Cependant, la commande git revert ne supprime pas les commits et ne permet pas de revenir à un état antérieur de la branche. Au lieu de cela, il crée un nouveau commit qui annule les modifications d'un commit spécifique.

Illustration du fonctionnement de git revert

La syntaxe pour revenir sur un commit avec le hash est la suivante :

git revert <commit_hash>

Nous pouvons lister les commits avec leurs identifiants de hachage à l'aide de la commande git log. La sortie de git log liste les commits du plus récent au plus ancien, comme suit :

Identifier le hash du commit avec git log

Par exemple, pour annuler le commit qui implémente la fonction de soustraction, nous utiliserons la commande :

git revert 7ba24a3e62d4d37182428ccfaa070baa222b1151

En utilisant git revert, nous pouvons annuler les changements d'un commit spécifique sans affecter l'historique du commit.

Notez que git revert n'est pas magique et qu'en fonction de l'historique des livraisons, il peut en résulter un conflit qui doit être résolu manuellement.

Avantages de la git revert Plus de changements manuels

Pourquoi git revert est-il utile si nous devons résoudre un conflit manuellement ? Ne serait-il pas plus simple d'annuler manuellement les modifications ? Voyons ses avantages :

  • Préservation de l'historique : git revert crée un nouveau commit qui annule les modifications d'un commit spécifié tout en préservant l'ensemble de l'historique du commit. Cela permet de conserver un historique transparent des modifications et des annulations.
  • Inversion atomique : Il garantit que les inversions sont atomiques et cohérentes. Lorsque nous supprimons et validons manuellement des modifications, il y a un risque d'erreur humaine. 
  • Sensibilisation aux conflits : Il garantit que nous sommes alertés par les conflits s'il y a des intégrations ou des changements qui dépendent de la livraison originale. Cela peut sembler peu pratique, mais cela permet d'éviter des effets secondaires involontaires.
  • Métadonnées : Le nouveau commit créé par git revert inclut des métadonnées et un message de commit qui décrit contextuellement ce qui a été annulé, aidant ainsi à la compréhension future. Sans git revert, ce contexte pourrait être perdu.

Annulation d'une fusion dans différents scénarios

Dans cette section, nous verrons comment annuler une fusion. Pour les besoins de l'exemple, nous supposons que nous fusionnons une branche nommée feature dans la branche main en exécutant la commande à partir de la branche main:

git merge feature

Ce que nous apprenons ici peut être appliqué à deux branches quelconques en remplaçant les noms de manière appropriée.

Annulation d'une fusion qui n'est pas associée à un commit

La commande git merge ne crée pas toujours un nouveau commit. Un commit n'est créé que si la branche main a divergé de la branche feature. Parce que git revert nécessite un commit pour fonctionner, nous ne pouvons pas l'utiliser dans ce cas.Explication de ce que sont des branches Git divergentes

Les branches main et feature divergent lorsque de nouveaux commits sont créés sur main qui ne sont pas des ancêtres de la branche feature. En d'autres termes, de nouveaux commits ont été créés sur main après la création de feature.

Si les branches n'ont pas divergé, lorsque nous lançons la commande git merge feature sur la branche principale, Git utilisera l'avance rapide pour fusionner. Cela signifie qu'il déplace le site HEAD de la branche main vers le site HEAD de la branche feature.

Illustration de ce qui se passe lorsque nous déplaçons le HEAD du <code data-mce-selected=>.

Nous pouvons observer que cela s'est produit en regardant le résultat de git merge:

Comment identifier que l'avance rapide a été utilisée pour fusionner

Pour annuler une telle fusion, il suffit de remettre le site HEAD de la branche main à l'endroit où il se trouvait. Pour cela, nous :

  1. Identifiez le site HEAD précédent à l'aide de la fonction git reflog
  2. Réinitialisez le site HEAD en utilisant git reset --hard , en remplaçant par le site HEAD.

La sortie de git reflog ressemblera à ceci :

Trouver l'ancienne référence HEAD

Nous pouvons identifier le précédent HEAD en regardant la ligne qui dit "checkout : moving from feature to main" (il écrit feature et main parce que ce sont les noms de nos branches). 

Dans ce cas, la tête précédente est fe59838. Pour déplacer le site HEAD de la branche principale vers celle-ci et annuler la fusion, nous utilisons la commande suivante :

git reset --hard fe59838

Illustration de ce qui se passe lorsque l'on recule le HEAD

Annulation d'une fusion à laquelle est associé un commit

Si les branches main et feature ont divergé, lorsque nous fusionnons deux branches, un nouveau commit est créé, appelé commit de fusion. 

Illustration d'un commit de fusion

Le commit de fusion applique les modifications d'une branche à une autre. Dans ce cas, les modifications apportées à feature sont appliquées à la branche main.

Pour revenir sur les modifications de la branche main, nous utilisons la branche git revert sur le commit de fusion. Cela créera un nouveau commit qui annulera les changements apportés à la branche main avec la fusion, rétablissant ainsi l'état de la branche principale tel qu'il était avant la fusion.

Tout d'abord, nous devons identifier le hachage du commit de fusion. Nous pouvons le faire à l'aide de la commande git log:

Identifier le hachage du commit de fusion

Parce que le commit de fusion a deux parents, la syntaxe de git revert est légèrement différente. Nous devons utiliser l'option -m 1 pour spécifier que nous voulons annuler les changements relatifs à la branche main:

git revert -m 1 b8dab2c8611e324ed0d273133987415350e6d10d

Illustration de ce qui se passe lorsque nous inversons un commit git merge

Résolution des conflits lors de l'annulation d'un engagement

Des conflits peuvent parfois survenir lors de l'annulation d'un commit, en particulier si le commit annulé entre en conflit avec des modifications ultérieures de la base de code. Dans ce cas :

  1. Git met en pause le retour à l'état initial : Nous devons résoudre manuellement les conflits. Git marquera les fichiers en conflit et demandera une intervention.
  2. Résolvez les conflits : Nous ouvrons chaque fichier conflictuel, résolvons les conflits marqués par Git et enregistrons les modifications.
  3. Mettez en scène les fichiers résolus : git add
  4. Poursuivre le renversement : git revert --continue

Conclusion

L'utilisation de git revert pour annuler les commits de fusion permet de s'assurer que chaque changement et correction est documenté dans l'historique des commits.

En outre, la compréhension des scénarios appropriés pour appliquer git reset par rapport à git revert nous permet de prendre de meilleures décisions, en particulier lorsqu'il s'agit de flux de travail collaboratifs ou de modifications locales uniquement.

Vous trouverez plus d'informations à ce sujet dans la section FAQ ci-dessous. Si vous souhaitez en savoir plus sur Git, je vous recommande les ressources suivantes :

FAQ

Puis-je revenir sur une fusion déjà publiée avec git revert ?

Oui, c'est le principal cas d'utilisation de git revert pour les fusions. Si les modifications sont locales, git reset est un moyen plus facile d'annuler la fusion.

Pour que les autres puissent voir les changements, nous devons les pousser vers le référentiel distant. Ainsi, pour annuler une fusion déjà effectuée, nous procédons comme suit :

git revert -m 1 
git push origin 

Remplacer par le hash du commit de fusion et par le nom de la branche où la fusion a été effectuée.

Le commit de fusion sera-t-il supprimé après l'utilisation de git revert ?

Non. Le commit de fusion reste dans l'historique, mais ses modifications sont annulées par le nouveau commit. L'intérêt d'annuler une fusion avec git revert est de préserver l'historique des livraisons.

Existe-t-il d'autres moyens que git revert pour annuler une fusion ?

Une autre façon d'annuler une fusion est d'utiliser git reset. Cette méthode réinitialise la branche à un état antérieur au commit de fusion. Cette approche est plus intrusive et peut poser des problèmes si d'autres collaborateurs ont déjà basé leur travail sur les commits que nous prévoyons de réinitialiser. Par conséquent, elle n'est recommandée que lorsque nous sommes sûrs qu'elle n'affectera pas les autres.

git reset --hard 
git push --force

Remplacement de par le hash du commit sur lequel nous voulons revenir.

Quand dois-je utiliser git reset pour annuler une fusion ?

Je recommande de n'utiliser git reset pour annuler une fusion que lorsque la fusion n'a eu lieu que localement et qu'elle n'a pas encore été poussée.


François Aubry's photo
Author
François Aubry
LinkedIn
L'enseignement a toujours été ma passion. Dès mes premiers jours d'études, j'ai cherché avec enthousiasme des occasions de donner des cours particuliers et d'aider d'autres étudiants. Cette passion m'a amenée à poursuivre un doctorat, où j'ai également été assistante d'enseignement pour soutenir mes efforts académiques. Au cours de ces années, j'ai trouvé un immense épanouissement dans le cadre d'une classe traditionnelle, en favorisant les liens et en facilitant l'apprentissage. Cependant, avec l'avènement des plateformes d'apprentissage en ligne, j'ai reconnu le potentiel de transformation de l'éducation numérique. En fait, j'ai participé activement au développement d'une telle plateforme dans notre université. Je suis profondément engagée dans l'intégration des principes d'enseignement traditionnels avec des méthodologies numériques innovantes. Ma passion est de créer des cours qui sont non seulement attrayants et instructifs, mais aussi accessibles aux apprenants à l'ère du numérique.
Sujets

Les meilleurs cours d'ingénierie des données

cursus

Ingénieur de données

40 heures hr
Acquérir des compétences très demandées pour ingérer, nettoyer et gérer efficacement les données, ainsi que pour planifier et surveiller les pipelines, vous permettra de vous démarquer dans le domaine de l'ingénierie des données.
Afficher les détailsRight Arrow
Commencer le cours
Voir plusRight Arrow