Objectifs
- Comprendre pourquoi et quand un conflit de fusion se produit.
- Identifier les marqueurs de conflit (
<<<<<<<,=======,>>>>>>>) que Git insère dans les fichiers. - Résoudre un conflit simple manuellement en éditant le fichier.
- Finaliser l’opération (merge ou rebase) une fois le conflit résolu.
Quand un conflit se produit-il ?
Un conflit de fusion survient lorsque vous essayez de fusionner deux branches qui ont modifié les mêmes lignes dans le même fichier. Git ne peut pas décider quelle version est la “bonne” et s’arrête, vous demandant de trancher. C’est une partie normale et saine du travail collaboratif.
Anatomie d’un conflit
Lorsque Git détecte un conflit, il modifie le fichier problématique pour y inclure les deux versions contradictoires, entourées de marqueurs spéciaux :
Le début du fichier est sans conflit.
Voici le contenu de la ligne dans votre branche actuelle (HEAD).
C'est la version que vous essayez de fusionner.
La fin du fichier est aussi sans conflit.
<<<<<<< HEAD: Marque le début de la version de votre branche courante.=======: Sépare les deux versions.>>>>>>> ...: Marque la fin de la version de la branche que vous intégrez.
Le processus de résolution
La résolution d’un conflit se fait en 3 étapes : Éditer, Ajouter, Commiter.
Étape 1 : Identifier et Éditer le fichier
Git vous dira quels fichiers sont en conflit. Ouvrez-les dans votre éditeur de code. Votre travail consiste à modifier le fichier pour ne laisser que la version finale souhaitée. Cela peut être :
- Garder uniquement votre version.
- Garder uniquement l’autre version.
- Un mélange des deux.
- Quelque chose de complètement nouveau qui combine la logique des deux.
L’important est que vous devez supprimer manuellement les marqueurs <<<<<<<, =======, et >>>>>>>.
Étape 2 : Marquer le conflit comme résolu (git add)
Une fois que le fichier a l’apparence finale que vous désirez, vous devez le dire à Git en l’ajoutant au staging area.
git add <fichier_resolu.txt>
Cette commande ne fait pas un nouveau commit, elle indique simplement à Git “J’ai fini de résoudre les conflits pour ce fichier”.
Étape 3 : Finaliser l’opération
La dernière étape dépend de l’opération qui a causé le conflit.
-
Si c’était un
git merge: Vous terminez en créant le commit de fusion.git commitGit vous proposera un message de commit par défaut (ex: “Merge branch ‘feature/x’”), que vous pouvez conserver.
-
Si c’était un
git rebase: Vous continuez simplement le processus de rebase.git rebase --continue
Outils graphiques
La plupart des éditeurs de code modernes (comme VS Code, JetBrains IDEs) ont des outils de résolution de conflits intégrés. Ils affichent les deux versions côte à côte et vous permettent de choisir quelle ligne ou quel bloc garder en cliquant sur des boutons, ce qui est souvent plus simple que d’éditer les marqueurs manuellement.
Bonnes pratiques
- Ne paniquez pas. Un conflit n’est pas une erreur, c’est une demande de clarification de la part de Git.
- Communiquez avec vos collaborateurs pour savoir pourquoi ils ont modifié la même ligne que vous.
- Faites des commits petits et fréquents. Il est beaucoup plus facile de résoudre un petit conflit sur quelques lignes qu’un énorme conflit sur des centaines de lignes après deux semaines de travail.
- Si vous êtes perdu, vous pouvez toujours annuler :
git merge --abortpour annuler une fusion.git rebase --abortpour annuler un rebase.
Exercices
Reprenons l’exercice de la leçon précédente où nous avons intentionnellement créé un conflit.
-
Provoquez le conflit :
- Sur une branche
main, modifiez un fichier. Commitez. - Créez une branche
feature/conflit, modifiez la même ligne différemment. Commitez. - Revenez sur
mainet essayez de fusionner :git merge feature/conflit. Git devrait s’arrêter en signalant un conflit.
- Sur une branche
-
Résolvez le conflit :
- Exécutez
git statuspour voir quel fichier est en conflit. - Ouvrez ce fichier. Observez les marqueurs
<<<<<<<. - Éditez le fichier pour qu’il ait le contenu final que vous souhaitez (en supprimant les marqueurs).
- Exécutez
-
Finalisez la fusion :
- Exécutez
git add <fichier_resolu>. - Exécutez
git commit. Gardez le message de commit par défaut. - Vérifiez l’historique avec
git log --oneline --graphpour voir le commit de fusion.
- Exécutez