Résoudre les conflits de fusion dans Git
Dans ce tutoriel, nous montrerons comment résoudre les conflits survenant lors de la fusion de deux branches dans Git.
En règle générale, le travail est souvent effectué sur les mêmes fichiers par différents membres de l’équipe dans un environnement d’équipe collaboratif. Par exemple, un membre de l’équipe travaillant sur le développement d’une fonctionnalité peut modifier le fichier README
pour fournir des informations sur la fonctionnalité développée.
Un autre membre de l’équipe travaillant sur la correction des bogues peut ajouter des informations sur les bogues corrigés dans le même fichier README
. Ils peuvent travailler sur différentes branches et engager leurs modifications dans leurs branches respectives.
De temps en temps, différentes branches doivent être fusionnées pour fournir une construction cohérente. Ainsi, cette opération provoquera un conflit de fusion lorsque les mêmes fichiers sont mis à jour dans des branches différentes.
Il faut ensuite résoudre les conflits et fusionner les modifications. Nous allons maintenant illustrer cela avec un exemple.
Résoudre les conflits survenant lors de la fusion de deux branches avec git mergetool
Avant de résoudre les conflits de fusion, nous devons configurer l’outil de comparaison utilisé par Git comme suit.
$ git config merge.tool meld
$ git config merge.conflictstyle diff3
$ git config mergetool.prompt false
Les commandes ci-dessus définissent meld
comme outil de comparaison par défaut. De plus, nous avons mis en place le conflictstyle
sur diff3
(c’est-à-dire ); cela définit l’outil diff pour afficher l’ancêtre commun des deux fichiers (la branche actuelle et celle de la branche à partir de laquelle fusionner).
Pour voir les différents outils de comparaison pris en charge, exécutez la commande suivante.
$ git mergetool --tool-help
Maintenant, nous commençons par l’exemple pour montrer comment résoudre les conflits. Disons que nous avons deux branches comme suit.
$ git branch
* main
feature1
La première branche est la branche main
et la seconde est une branche de développement de fonctionnalités nommée feature1
.
Nous avons un fichier README.md
dont le contenu est le suivant dans la branche main
.
$ cat README.md
# Upwork
Upwork projects
Comme indiqué ci-dessus, nous sommes actuellement dans la branche main
. Ensuite, on passe à la branche feature1
.
$ git checkout feature1
Switched to branch 'feature1'
$ git branch
main
* feature1
Nous mettons à jour le README.md
et imprimons son contenu comme suit.
$ cat README.md
This is conflicting branch line.
Maintenant, nous allons fusionner la branche main
avec la branche feature1
pour obtenir les derniers changements dans cette branche.
Lors de la fusion, Git affiche les conflits de fusion comme suit.
$ git merge main
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
Nous pouvons obtenir de plus amples informations sur le conflit comme suit.
$ git status
On branch feature1
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both added: README.md
no changes added to commit (use "git add" and/or "git commit -a")
Nous allons maintenant imprimer le contenu du fichier README.md
, qui a le conflit.
$ cat README.md
<<<<<<< HEAD
This is conflicting branch line.
||||||| merged common ancestors
=======
# Upwork
Upwork projects
>>>>>>> main
Le fichier affiche maintenant divers symboles.
Et les symboles <<<<<<<
suivis de HEAD
est un alias pour la branche courante. Ceci indique le début des modifications dans cette section.
Les symboles =======
indiquent la fin des révisions dans la branche actuelle et le début des modifications dans une nouvelle.
Les symboles >>>>>>>
suivis du nom de la branche distante, à savoir. main
, indique où la tentative de fusion a eu lieu.
Maintenant, nous allons utiliser mergetool
pour résoudre les conflits.
$ git mergetool
Merging:
README.md
Normal merge conflict for 'README.md':
{local}: created file
{remote}: created file
Cela lancera meld
(car nous l’avons défini comme outil de comparaison par défaut). Veuillez voir l’image ci-dessous.
Le volet de gauche montre les modifications apportées au fichier README.md
effectuées dans la branche locale. Le volet du milieu contient le résultat des modifications apportées pour résoudre le conflit. Le volet de droite affiche les modifications effectuées dans la branche distante, à savoir. main
(c’est-à-dire) la branche que nous voulons fusionner.
Nous pouvons choisir de conserver à la fois les modifications locales et distantes ou l’une d’entre elles. Nous choisirons de conserver les modifications de la branche distante comme suit.
Nous allons ensuite enregistrer et quitter l’outil meld
.
Nous imprimerons le fichier README.md
et verrons la mise à jour.
$ cat README.md
# Upwork
Upwork projects
Nous allons maintenant valider les modifications dans Git.
$ git commit -m "merged from main"
[feature1 3c39d7b] merged from main
Nous allons maintenant exécuter la commande git diff
pour vérifier les conflits entre les branches feature1
et main
.
$ git diff feature1 main
Nous allons vérifier le statut de la branche feature1
.
$ git status
On branch feature1
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md.orig
Il montre un fichier, README.md.orig
, qui a été créé par le mergetool
lors de la fusion.
Exécutez la commande suivante pour le supprimer :
$ git clean -f
Ainsi, nous avons réussi à résoudre les conflits lors de la fusion de deux branches à l’aide du mergetool
de Git.