GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Comment résoudre les conflits de fusion dans Git

Présentation

La git merge La commande aide un contributeur à ajouter à un projet à partir d'une branche. Le concept est l'une des idées fondamentales de la programmation collaborative, permettant à plusieurs personnes de travailler sur leur partie du code sans aucun conflit.

Lorsque plusieurs contributeurs travaillent sur la même partie d'un code ou travaillent avec de nombreuses branches, des conflits de fusion sont inévitables. L'objectif principal de git merge est de résoudre ou d'avertir sur ces conflits automatiquement.

Ce guide explique ce qu'est un conflit de fusion et propose des solutions lorsqu'il ne se règle pas automatiquement. L'article fournit également des conseils utiles pour éviter les conflits de fusion Git.

Prérequis

  • Git installé et configuré (sur Windows, Mac et Ubuntu).
  • Un conflit git merge entre une branche locale et une branche distante.
  • Accès à un terminal ou à une ligne de commande
  • Éditeur Vim pour le tutoriel (Pour installer Vim, suivez l'un de nos guides :Comment installer Vim 8.2 sur Ubuntu 18.04 ou Comment installer Vim 8.2 sur CentOS 7)

Qu'est-ce qu'un conflit de fusion Git ?

Lorsque vous travaillez avec des systèmes de contrôle de version tels que Git, la plupart des conflits de fusion se résolvent automatiquement. Cependant, il existe des situations où git merge n'est pas en mesure de résoudre un problème.

Voici quelques exemples de conflits de fusion :

  • Modifier les mêmes lignes de code dans un fichier.
  • Suppression de fichiers pendant que des modifications se produisent à un autre endroit.

Étant donné que le problème se produit localement et que les autres membres du projet ne sont pas conscients du problème, la résolution du conflit est prioritaire et nécessite une solution immédiate.

Types de conflits de fusion Git

Les types généraux de conflits de fusion dépendent du moment où le problème apparaît. Les conflits se produisent soit :

  • Avant de fusionner , indiquant que des modifications locales ne sont pas à jour. Le message d'erreur de conflit s'affiche avant le début de la fusion pour éviter les problèmes.
  • Pendant la fusion , indiquant un problème d'écrasement. Le message d'erreur s'affiche et arrête le processus de fusion pour éviter d'écraser les modifications.

Comment résoudre les conflits de fusion dans Git

Il y a trois façons pour résoudre un conflit de fusion dans Git :

1. Acceptez la version locale . Pour accepter toutes les modifications apportées à un fichier à partir de la version locale, exécutez :

git checkout --ours <file name>

Alternativement, accepter la version locale pour tous fichiers en conflit, utilisez :

git merge --strategy-option ours

2. Acceptez la version distante . Pour mettre à jour les modifications sur un fichier depuis la branche distante, exécutez :

git checkout --theirs <file name>

Accepter la version distante pour tous fichiers en conflit avec :

git merge --strategy-option theirs

3. Examinez les modifications individuellement . La dernière option consiste à examiner chaque modification séparément. Cette option est également la meilleure voie à suivre, en particulier lorsque vous travaillez avec plusieurs fichiers et personnes. Pour rendre ce travail plus gérable, utilisez des outils spéciaux pour vous aider à examiner les conflits individuels .

En fin de compte, le choix des parties du code qui restent et qui ne dépendent pas de la décision du développeur pour le projet en cours.

Obtenir un conflit de fusion dans Git

Le conflit de fusion dans Git se produit lorsque la commande git merge renvoie une erreur.

Le message d'erreur imprime les informations sur l'emplacement du conflit. Vérifiez le fichier à partir du message d'erreur et regardez le contenu où le conflit de fusion s'est produit :

Git ajoute automatiquement trois indicateurs à côté des lignes de code en conflit :

  • <<<<<< (sept caractères "moins de") suivis de HEAD , qui est un alias pour la branche actuelle. Les symboles indiquent le début des modifications dans cette section.
  • ======= (sept caractères "signe égal"), qui indiquent la fin des révisions dans la branche actuelle et le début des modifications dans une nouvelle.
  • >>>>>> (sept caractères "supérieur à") suivis de la branche où la tentative de fusion s'est produite. Les symboles ajoutés indiquent la fin des modifications dans la branche en conflit.

La syntaxe ajoutée permet de rechercher dans le code pour trouver l'emplacement du conflit de fusion. Cependant, une approche beaucoup plus simple consiste à utiliser un outil de différence/fusion pour découvrir les problèmes et suivre les changements.

Configuration d'un outil Diff par défaut dans Git

Pour configurer l'outil de comparaison par défaut pour git mergetool :

1. Exécutez la ligne suivante dans votre terminal :

git mergetool --tool-help

La sortie imprime tous les outils de comparaison pris en charge pour votre configuration actuelle :

Différents outils sont disponibles en fonction de l'éditeur de votre choix. Par exemple :

  • Emacs outils de comparaison :Ediff ou emerge
  • Vim outils de comparaison :vimdiff, vimdiff2 ou vimdiff3

Les étapes suivantes montrent un exemple de configuration de vimdiff outil pour Vim.

2. Modifiez la git config pour définir l'outil de fusion par défaut :

git config merge.tool <tool name>

Par exemple, si vous utilisez Vim, exécutez :

git config merge.tool vimdiff

3. Configurez l'outil diff pour afficher l'ancêtre commun des deux fichiers, qui est la version avant toute modification :

git config merge.conflictstyle diff3

4. Définissez l'option pour ne pas demander avant d'exécuter :

git config mergetool.prompt false

La configuration de l'outil de comparaison pour Git est terminée.

Utiliser Mergetool pour voir les différences

Pour utiliser le mergetool et voyez les différences, exécutez :

git mergetool

La sortie affiche une fenêtre avec quatre vues :

1. LOCALE représente la version du fichier de la branche actuelle.

2. BASE est à quoi ressemblait le fichier avant toute modification.

3. TÉLÉCOMMANDE montre à quoi ressemble le fichier dans la branche distante où se trouvent les informations en conflit.

4. FUSIONNÉ a le fichier de fusion final. Ce résultat représente ce qui est enregistré dans le référentiel.

Les principales commandes de navigation entre ces fenêtres sont :

  • CTRL+WW pour se déplacer entre les fenêtres.
  • CTLR+WJ pour passer à la vue de la fenêtre FUSIONNÉE.
  • CTRL+WX pour changer de place des fenêtres.

Pour une navigation avancée, des informations sont disponibles avec la commande :help window-moving .

Mettre à jour et résoudre un conflit de fusion

Mettez à jour le fichier MERGED pour résoudre un conflit. Certains raccourcis pour mettre à jour la version MERGED incluent :

  •  :diffg LOCAL met à jour le vers la version LOCALE.
  •  :diffg BASE mises à jour de la version BASE.
  • :diffg REMOTE mises à jour de la version REMOTE.

Une fois les informations mises à jour, enregistrez et quittez avec :wqa .

Validation et nettoyage

La dernière étape consiste à valider et à nettoyer les fichiers supplémentaires. Validez la version mise à jour en exécutant :

git commit -m "<your message>"

L'outil diff crée des fichiers supplémentaires sur le projet pour comparer les versions. Nettoyez-les avec :

git clean -f

Conseils pour éviter les conflits de fusion

Les conflits de fusion se produisent uniquement lorsque l'ordinateur n'est pas en mesure de résoudre le problème automatiquement.

Voici quelques conseils pour éviter les conflits de fusion :

  • Utilisez un nouveau fichier au lieu d'un fichier existant dans la mesure du possible.
  • Évitez d'ajouter des modifications à la fin du fichier.
  • Poussez et tirez les modifications aussi souvent que possible.
  • N'embellissez pas le code et n'organisez pas les importations vous-même.
  • Évitez la mentalité de programmeur solo en gardant à l'esprit les autres personnes qui travaillent sur le même code.

Ubuntu
  1. Comment mettre à jour Git

  2. Comment fonctionne Git ?

  3. Comment créer une nouvelle branche dans Git

  4. Comment installer Git sur Ubuntu 18.04 / 20.04

  5. Comment installer Git sur CentOS 8

Comment installer Git sur Ubuntu 15.04

Comment installer Git sur Ubuntu 16.04

Comment installer Git sur Ubuntu 18.04 LTS

Comment installer Git sur Ubuntu 19.10

Comment installer Git sur Linux Mint 19

Comment installer Gitea sur Ubuntu 22.04