Résoudre les conflits de fusion

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019

Visual Studio 2019 | Visual Studio 2022

Lorsque vous fusionnez ou rebasez, vous indiquez à Git d’intégrer les modifications apportées à une branche à celles apportées à une autre. Souvent, Git effectue une fusion ou un rebase automatiquement sans votre aide. Toutefois, si Git découvre une modification apportée à une branche en conflit avec une modification apportée à une autre branche, il vous invite à résoudre le conflit. Un conflit de fusion peut se produire lorsque les branches fusionnées modifient différemment la même ligne de fichier, ou lorsqu’une branche modifie un fichier et qu’une autre branche le supprime. Le processus de résolution des conflits de fusion s’applique à la fois à une fusion et un rebase Git.

Vous pouvez résoudre les conflits de fusion dans Visual Studio ou à l’aide de la ligne de commande et d’un éditeur de texte.

Pour obtenir une vue d’ensemble du flux de travail Git, consultez le tutoriel Git Azure Repos.

Cet article fournit des procédures pour les tâches suivantes :

  • Comprendre les conflits de fusion
  • Résoudre les conflits de fusion

Comprendre les conflits de fusion

Git fusion ou rebase intègre les validations d’une branche source dans votre branche locale actuelle (branche cible). La fusion Git effectue une fusion en avance rapide ou sans avance rapide. La fusion sans avance rapide est également appelée fusion triple ou fusion vraie. Rebase Git est un autre type de fusion. Ces types de fusion sont présentés dans le diagramme suivant.

Diagramme affichant les validations avant et après l'utilisation de Git fusion et rebase.

Pour la fusion Git, si le conseil de la branche cible existe dans la branche source, le type de fusion par défaut sera une fusion à avance rapide. Sinon, le type de fusion par défaut sera une fusion sans avance rapide.

Une fusion à avance rapide ne peut jamais avoir de conflit de fusion, puisque Git n’applique aucune fusion à avance rapide si l’extrémité de la branche cible a divergé de la branche source. Par défaut, Git utilise une fusion rapide dans la mesure du possible. Par exemple, Git applique une fusion à avance rapide sur une branche locale que vous mettez à jour uniquement en extrayant sur sa branche équivalente distante.

Une fusion sans avance rapide génère une nouvelle « validation de fusion » de branche cible intégrant les modifications de branche source avec les modifications de branche cible. Les modifications applicables sont celles effectuées suite à la dernière validation commune aux deux branches. Dans le diagramme précédent, la validation C constitue la dernière validation commune dans les deux branches. Si un changement de branche source est en conflit avec un changement de branche cible, Git vous invite à résoudre le conflit de fusion. La validation de fusion (L) contient les modifications de branche source et de branche cible intégrées. Les conseils de branche source et cible (K et E) sont les parents de la validation de fusion. Dans l’historique de validation de votre branche, une validation de fusion est un marqueur utile pour une opération de fusion et indique clairement les branches fusionnées.

Git rebase réordonne l’historique des validations de la branche cible de manière à contenir toutes les validations de branche source, suivies de toutes les validations de branche cible depuis la dernière validation commune. Dans le diagramme précédent, la validation C constitue la dernière validation commune dans les deux branches. Une autre manière de voir ceci est qu'un rebase reproduit les changements dans votre branche cible au-delà de l'historique de la branche source. Si un changement de branche source est en conflit avec un changement de branche cible, Git vous invite à résoudre le conflit de fusion. Comme avec la fusion à avance rapide, un rebase ne crée aucune validation de fusion. Notamment, un rebase modifie la séquence des validations de branche cible existantes, ce qui n’est pas le cas pour les autres stratégies de fusion. Dans le diagramme précédent, la validation K' contient les mêmes modifications que K, mais avec un nouvel ID de validation, puisqu’il renvoie à la validation E au lieu de C.

La fusion et le rebase Git modifient uniquement la branche cible ; la branche source reste inchangée. Lorsque vous rencontrez un ou plusieurs conflits de fusion, vous devez les résoudre pour terminer la fusion ou le rebase. Vous pouvez également annuler l’opération de fusion/rebase et retourner la branche cible à son état antérieur.

Pour plus d’informations concernant les options et stratégies de fusion, consultez le manuel de référence Git et les stratégies de fusion Git.

Quand résoudre les conflits de fusion

La fusion Git et le rebase Git sont largement utilisés dans le workflow Git. Lorsque vous travaillez sur une fonctionnalité locale ou une branche de correction de bogues, il est courant de :

  1. Conserver votre branche locale main actuelle avec son équivalent distant en tirant régulièrement pour récupérer et fusionner les validations distantes.
  2. Intégrer les mises à jour de branche locale main dans votre branche de fonctionnalité locale à l’aide d’un rebase ou d’une fusion.
  3. Enregistrer votre travail sur la branche de fonctionnalité locale en latransmettant à la branche distante correspondante.
  4. Une fois la fonctionnalité terminée, créez une requête de tirage pour fusionner vos branches de fonctionnalité distantes dans la branche distantemain.

En intégrant fréquemment les modifications distantes dans votre référentiel local, vous pouvez rester informé des travaux récents d’autres utilisateurs et résoudre rapidement les conflits de fusion qui surviennent.

Résoudre les conflits de fusion

Le processus de résolution des conflits de fusion s’applique à la fois à une fusion et un rebase Git. Bien que les étapes suivantes décrivent la manière de résoudre les conflits de fusion durant une fusion, vous pouvez également résoudre les conflits de fusion lors d’un rebase.

Conseil

Si la branche source est une branche de suivi à distance, assurez-vous de la mise à jour de la branche en exécutant une récupération Git avant une fusion. Ou exécutez la commande tirage Git, associant une récupération Git avec une fusion Git.

Visual Studio 2022 offre une expérience de contrôle de version Git à l’aide du menu Git, des modifications Git et des menus contextuels dans l’Explorateur de solutions. Visual Studio 2019 version 16.8 offre également l’interface utilisateur Git de Team Explorer. Pour plus d’informations, consultez l’onglet Visual Studio 2019 - Team Explorer.

  1. Dans le volet Branches de la fenêtre Référentiel Git , extrayez la branche cible. Cliquez ensuite avec le bouton droit sur la branche source et choisissez Fusionner <la branche source> dans <la branche cible>.

    Capture d'écran de l'option Fusion figurant dans le menu contextuel de la branche, de la fenêtre Référentiel Git de Visual Studio.

  2. Visual Studio vous avertit si Git a arrêté la fusion en raison de conflits. Dans ce cas, vous pouvez résoudre les conflits ou annuler la fusion et revenir à l’état de pré-fusion. La section Modifications non fusionnées de la fenêtre Modifications Git répertorie les fichiers présentant des conflits de fusion. Pour un fichier présentant des conflits de fusion dans son contenu, double-cliquez sur le fichier pour l’ouvrir dans l’éditeur de fusion.

    Capture d'écran des fichiers présentant des conflits de fusion dans la fenêtre Modifications Git de Visual Studio.

  3. Dans l’éditeur de fusion, le volet Entrant affiche la version du fichier de branche source, le volet Actuel affiche la version du fichier de branche cible et le volet Résultat affiche le fichier de fusion résultant. Pour appliquer des modifications spécifiques à la branche source ou cible, cochez la case à côté des lignes conflictuelles que vous souhaitez conserver. Vous pouvez également modifier directement le fichier de fusion dans le volet Résultats. Choisissez Accepter la fusion une fois tous les conflits de fusion dans le fichier actif résolus. Répétez cette étape pour chaque fichier présentant des conflits de contenu.

    Capture d’écran de l’éditeur de fusion dans Visual Studio.

  4. Pour un fichier modifié dans une branche et supprimé dans l’autre, cliquez avec le bouton droit sur le fichier et sélectionnez l’action de branche souhaitée.

    Capture d’écran du menu contextuel d’un fichier conflictuel dans la fenêtre Modifications Git de Visual Studio.

  5. Dans la fenêtre Modifications Git, insérez un message de validation et choisissez validation indexée pour terminer la fusion, une fois tous les conflits de fusion pour tous les fichiers résolus.

    Capture d'écran du message de validation et du bouton Validation indexée dans la fenêtre Modifications Git de Visual Studio.

Étapes suivantes