Comment annuler un merge avec Git : astuces et solutions
Git est un outil de gestion de versions qui est largement utilisé dans l’industrie du développement logiciel. Il permet aux développeurs de travailler en équipe sur un même projet en suivant les modifications apportées au code source. Git est également très utile pour gérer les conflits lors de la fusion de branches.
Cependant, il peut arriver que la fusion de branches ne se déroule pas comme prévu et il est nécessaire d’annuler le merge. Dans cet article, nous allons voir différentes astuces et solutions pour annuler un merge avec Git.
Introduction aux merges
Avant de commencer, il est important de comprendre ce qu’est un merge avec Git. Un merge est une opération qui permet de fusionner deux branches différentes en une seule. Lors d’un merge, Git compare les modifications apportées à chaque branche et essaie de les combiner de manière cohérente.
Les merges peuvent être effectués de deux façons différentes : le fast-forward merge et le true merge. Le fast-forward merge est utilisé lorsque la branche à fusionner est une branche enfant de la branche courante. Dans ce cas, Git avance simplement la tête de la branche courante jusqu’à la tête de la branche à fusionner.
Le true merge, quant à lui, est utilisé lorsque les branches à fusionner n’ont pas de relation parent-enfant. Dans ce cas, Git crée un nouveau commit qui représente la fusion des deux branches. Ce nouveau commit a deux parents : le dernier commit de la branche courante et le dernier commit de la branche à fusionner.
Annuler un merge avec Git
Maintenant que nous avons une compréhension de base des merges avec Git, voyons comment annuler un merge qui n’a pas fonctionné comme prévu. Il existe plusieurs façons de le faire, en fonction de la situation.
Annuler un merge avec git reset
La première méthode pour annuler un merge est d’utiliser la commande git reset. Cette commande permet de défaire les changements apportés à la branche courante en revenant à un commit précédent.
Pour annuler un merge avec git reset, il suffit de revenir au commit précédent au moment du merge. Pour cela, il faut identifier le hash du commit précédent à l’aide de la commande git log. Ensuite, il suffit d’utiliser la commande git reset en spécifiant le hash du commit précédent :
$ git log
commit 8f77f5d9a8f45169d0c0517d2db81a22efc7d1e1 (HEAD -> master, origin/master)
Merge: 2d55140 ba4c8b5
Author: Jean Dupont
Date: Fri Sep 3 17:31:43 2021 +0200
Merge branch 'new-feature'
$ git reset --hard 8f77f5d9a8f45169d0c0517d2db81a22efc7d1e1
Cette commande revient au commit précédent en écrasant tous les changements apportés à la branche courante depuis le commit du merge. Cela annule complètement le merge et restaure la branche courante à son état précédent.
Cependant, il est important de noter que git reset est une commande qui modifie l’historique du projet. Par conséquent, si le commit annulé avait déjà été partagé avec d’autres développeurs, il est fortement déconseillé d’utiliser git reset. Dans ce cas, il vaut mieux utiliser une autre méthode pour annuler le merge.
Annuler un merge avec git revert
Une autre méthode pour annuler un merge est d’utiliser la commande git revert. Cette commande permet de créer un nouveau commit qui annule les changements apportés par un commit précédent.
Pour annuler un merge avec git revert, il suffit d’utiliser la commande git revert en spécifiant le hash du commit du merge :
$ git log
commit 8f77f5d9a8f45169d0c0517d2db81a22efc7d1e1 (HEAD -> master, origin/master)
Merge: 2d55140 ba4c8b5
Author: Jean Dupont
Date: Fri Sep 3 17:31:43 2021 +0200
Merge branch 'new-feature'
$ git revert -m 1 8f77f5d9a8f45169d0c0517d2db81a22efc7d1e1
La commande git revert crée un nouveau commit qui annule les changements apportés par le commit du merge. L’option -m 1 spécifie que le parent du nouveau commit est le premier parent du commit du merge, c’est-à-dire le dernier commit de la branche courante.
Git crée alors un nouveau commit qui annule le merge. Ce nouveau commit est ajouté à l’historique du projet. Il est important de synchroniser le nouveau commit avec les autres développeurs pour éviter les conflits.
Annuler un merge avec git merge –abort
La troisième méthode pour annuler un merge est d’utiliser la commande git merge –abort. Cette commande annule le merge en cours et restaure la branche courante à son état précédent.
Pour annuler un merge avec git merge –abort, il suffit d’utiliser la commande git merge –abort :
$ git merge new-feature
Auto-merging file.txt
CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.
$ git merge --abort
Cette commande annule le merge en cours et restaure la branche courante à son état précédent. Elle est très utile lorsqu’un merge a échoué en raison d’un conflit de fusion.
Annuler un merge avec git revert -m
La quatrième méthode pour annuler un merge est d’utiliser la commande git revert -m. Cette commande est similaire à la commande git revert, mais elle permet de spécifier le parent du nouveau commit.
Pour annuler un merge avec git revert -m, il suffit d’utiliser la commande git revert -m en spécifiant le numéro du parent :
$ git log
commit 8f77f5d9a8f45169d0c0517d2db81a22efc7d1e1 (HEAD -> master, origin/master)
Merge: 2d55140 ba4c8b5
Author: Jean Dupont
Date: Fri Sep 3 17:31:43 2021 +0200
Merge branch 'new-feature'
$ git revert -m 2 8f77f5d9a8f45169d0c0517d2db81a22efc7d1e1
L’option -m 2 spécifie que le parent du nouveau commit est le deuxième parent du commit du merge, c’est-à-dire le dernier commit de la branche à fusionner.
Git crée alors un nouveau commit qui annule le merge en utilisant le deuxième parent comme base. Ce nouveau commit est ajouté à l’historique du projet.
Annuler un merge avec git reflog
La cinquième méthode pour annuler un merge est d’utiliser la commande git reflog. Cette commande affiche l’historique des références de Git, y compris les modifications effectuées sur les branches.
Pour annuler un merge avec git reflog, il suffit d’utiliser la commande git reflog pour afficher l’historique des modifications :
$ git reflog
8f77f5d HEAD@{0}: HEAD -> master
2d55140 HEAD@{1}: checkout: moving from new-feature to master
6a1a343 HEAD@{2}: merge new-feature: Merge made by the 'recursive' strategy.
2d55140 HEAD@{3}: checkout: moving from master to new-feature
8f77f5d HEAD@{4}: commit: Update file.txt
Cette commande affiche l’historique des modifications effectuées sur la branche courante. Pour annuler un merge, il suffit de revenir au commit précédent au moment du merge en utilisant la commande git reset.
$ git reset --hard 2d55140
Cette commande revient au commit précédent au moment du merge en écrasant tous les changements apportés à la branche courante depuis le commit du merge. Cela annule complètement le merge et restaure la branche courante à son état précédent.
Conclusion
Annuler un merge avec Git peut sembler compliqué, mais il existe plusieurs méthodes pour le faire en fonction de la situation. Les méthodes présentées dans cet article sont très utiles pour annuler un merge qui n’a pas fonctionné comme prévu.
Il est important de comprendre que toutes ces méthodes ont des conséquences sur l’historique du projet. Par conséquent, il est important de les utiliser avec précaution et de les synchroniser avec les autres développeurs pour éviter les conflits.
Note : Cet article n'est pas mis à jour régulièrement et peut contenir des informations obsolètes ainsi que des erreurs.