Résoudre les conflits de fusion dans Git

Azhar Bashir Khan 15 janvier 2022
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.

git-mergetool-meld1

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.

git-mergetool-meld2

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.

Article connexe - Git Merge