Un conflit fait peur la première fois qu'on le rencontre, surtout si c'est en pleine urgence, sur un vrai projet. La meilleure préparation consiste à en provoquer un exprès, dans un cadre sans enjeu, pour comprendre calmement ce que Git affiche et pourquoi. C'est exactement ce que ce guide vous propose sur mon-premier-site.

Pourquoi un conflit apparaît

Git fusionne automatiquement la grande majorité des changements, y compris quand deux branches ont modifié le même fichier, tant que ce n'est pas exactement la même portion de contenu. Un conflit survient uniquement quand deux branches ont modifié la même ligne (ou des lignes très proches) de façon différente, depuis leur point de séparation. Git refuse alors de choisir à votre place : il vous montre les deux versions et attend une décision humaine.

Provoquer le conflit, étape par étape

Partez de main, à jour, avec un dossier propre. Créez une nouvelle branche nommée corriger-titre, mais ne basculez pas dessus tout de suite : modifiez d'abord index.html directement sur main.

corriger-titre existe maintenant, mais pointe encore vers le même commit que main à cet instant précis : c'est leur point de séparation. Sur main, modifiez la ligne du titre dans index.html :

Basculez maintenant sur corriger-titre. Comme cette branche a été créée avant votre dernier commit sur main, elle ne le contient pas : vous devriez retrouver l'ancien titre.

Modifiez la même ligne, mais avec un texte différent de celui choisi sur main :

À ce stade, les deux branches ont chacune un commit qui modifie exactement la même ligne, de deux façons différentes. C'est la situation parfaite pour un conflit.

Déclencher le conflit

Retournez sur main, puis demandez la fusion de corriger-titre.

Voilà, le conflit est là. Rien n'est cassé : Git vous informe simplement qu'il a besoin de votre décision sur cette ligne précise, et attend que vous la lui donniez avant de continuer.

Lire git status pendant un conflit

« both modified » signifie exactement ce qui s'est passé : les deux branches ont modifié ce fichier, sur la même zone, et Git ne peut pas décider seul laquelle garder.

Ouvrir le fichier et lire les marqueurs

Ouvrez index.html dans votre éditeur. La ligne du titre a été remplacée par un bloc qui contient les deux versions, entourées de marqueurs.

Ces trois marqueurs ne sont pas du contenu HTML valide, ils ne doivent jamais rester dans le fichier final. Voici ce qu'ils signifient : tout ce qui se trouve entre <<<<<<< HEAD et ======= vient de votre branche actuelle, main. Tout ce qui se trouve entre ======= et >>>>>>> corriger-titre vient de la branche que vous avez essayé de fusionner. Le nom après le dernier marqueur vous rappelle précisément quelle branche a apporté cette seconde version.

Résoudre le conflit

Il n'existe aucune règle automatique pour choisir : la bonne résolution dépend de ce que vous voulez réellement obtenir. Ici, les deux titres ont chacun leur intérêt. Décidez de les combiner en un seul texte cohérent, remplacez tout le bloc, marqueurs compris, par une seule ligne propre :

Vérifiez qu'il ne reste plus aucune trace de <<<<<<<, ======= ou >>>>>>> dans le fichier : c'est l'erreur la plus fréquente à ce stade, un marqueur oublié qui se retrouve committé par accident. Enregistrez le fichier, puis testez-le si possible en l'ouvrant dans un navigateur, pour confirmer que le résultat correspond à ce que vous vouliez.

Terminer la fusion

Une fois le fichier corrigé, indiquez à Git que le conflit est résolu avec la commande qu'il vous a déjà suggérée : git add.

Le message est clair : le conflit est réglé, mais la fusion n'est pas encore terminée. Un dernier commit doit venir la conclure.

Git propose automatiquement un message de fusion par défaut, que vous pouvez conserver tel quel dans la plupart des cas. Le commit se crée, et la fusion est enfin terminée.

Vérifier que tout est réellement propre

« nothing to commit, working tree clean » confirme que plus aucun conflit n'est en attente. Relisez une dernière fois index.html pour être certain qu'aucun marqueur n'a survécu à la résolution.

À retenir

Ne choisissez jamais automatiquement « la version du haut » ou « la version du bas » sans lire les deux. La bonne résolution dépend entièrement du résultat que vous voulez obtenir, pas de la position du bloc dans le fichier. Sur un vrai projet, en cas de doute sur l'intention d'une modification, demandez à la personne qui l'a écrite avant de trancher seul.

Vérifiez que vous avez compris

Si deux branches modifient chacune un fichier différent, par exemple l'une index.html et l'autre style.css, un conflit va-t-il forcément apparaître lors de la fusion ?

Non. Un conflit n'apparaît que lorsque la même zone d'un même fichier a été modifiée différemment des deux côtés. Deux branches qui touchent des fichiers différents, ou des parties suffisamment éloignées d'un même fichier, se fusionnent automatiquement sans aucune intervention de votre part.