Aller au contenu principal

Prise en main de Git · Chapitre 5 / 5

Résoudre les conflits de fusion

Les conflits font peur à beaucoup de gens, mais ils sont normaux. Ce chapitre t'apprend à les lire et à les résoudre calmement, étape par étape.

Chapitre 5 / 5

Étape 01 / 13

Dans ce chapitre

Au chapitre 4, Git fusionnait tout seul. Mais parfois, il s'arrête et te demande de l'aide : c'est un conflit. Bonne nouvelle : c'est normal, ça arrive à tout le monde, et ça se résout toujours avec la même méthode.

À la fin de ce chapitre, tu sauras :

  • Expliquer pourquoi un conflit arrive
  • Repérer les fichiers en conflit avec git status
  • Lire les marqueurs de conflit dans un fichier
  • Choisir la bonne version : la tienne, l'autre ou un mélange
  • Terminer la fusion avec git add et git commit
  • Annuler une fusion avec git merge --abort

Étape 02 / 13

Un conflit, c'est quoi ?

Concept

Conflit de fusion : deux branches ont modifié la même partie du même fichier. Git ne sait pas quelle version garder, alors il te demande de choisir.

Imagine un document partagé. Toi et un collègue modifiez la même phrase en même temps. Le logiciel ne peut pas deviner laquelle garder : il vous demande de décider.

Un conflit n'est pas une erreur, et rien n'est cassé. C'est Git qui te dit : « je ne peux pas décider à ta place ».

Astuce

Git fusionne tout seul dans la grande majorité des cas : quand les branches touchent des fichiers différents, ou des parties différentes d'un même fichier. Un conflit n'arrive que si la même ligne a changé des deux côtés.

« Un conflit veut dire que mon dépôt est cassé. » Vrai ou faux ?

Étape 03 / 13

Quand un conflit arrive-t-il ?

Prenons un exemple concret avec mon-portfolio :

1

Sur main, le fichier index.html contient le titre « Hello ».

2

Un collègue crée la branche feature/header et remplace « Hello » par « Welcome ». Il commite.

3

Pendant ce temps, sur main, tu remplaces « Hello » par « Bonjour ». Tu commites.

4

Tu lances git merge feature/header depuis main. La même ligne a changé des deux côtés : conflit !

A
« Welcome »
B
feature
A
« Bonjour »
C
main

git merge → même ligne modifiée des deux côtés

Les deux branches ont changé la même ligne du même fichier : Git ne peut pas choisir, il te demande.

Git te prévient tout de suite :

$ git merge feature/header

Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

Astuce

Un conflit peut aussi apparaître pendant un git pull, puisque git pull fusionne tes commits avec ceux de GitHub. La méthode de résolution est exactement la même.

Étape 04 / 13

Repérer les fichiers en conflit

Première étape : savoir quels fichiers sont concernés. Ton réflexe, git status :

$ git status

On branch main
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
	both modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")

Les fichiers en conflit sont dans la section Unmerged paths, avec la mention both modified (modifié des deux côtés). Ici, un seul fichier : index.html.

À pratiquer

Pendant un conflit, Git te guide : relis les lignes entre parenthèses, elles indiquent les commandes possibles.

Étape 05 / 13

Lire les marqueurs de conflit

Ouvre le fichier en conflit dans ton éditeur. Git y a ajouté des marqueurs qui montrent les deux versions, l'une au-dessus de l'autre :

# Extrait du fichier index.html

<<<<<<< HEAD
<h1>Bonjour</h1>
=======
<h1>Welcome</h1>
>>>>>>> feature/header
<<<<<<< HEAD← ta version (la branche où tu es)

Bonjour

=======← le séparateur entre les deux versions

Welcome

>>>>>>> feature/header← la version de l'autre branche
Tout ce qui est entre les marqueurs est à toi : garde une version, l’autre, ou un mélange, puis supprime les 3 marqueurs.
  • <<<<<<< HEAD : le début du conflit. Juste en dessous, ta version, celle de la branche où tu es (ici main).
  • ======= : la séparation entre les deux versions.
  • >>>>>>> feature/header : la fin du conflit. Juste au-dessus, la version de l'autre branche, dont le nom est indiqué.

Astuce

Pour t'en souvenir : HEAD, c'est là où tu es. En haut, c'est chez toi ; en bas, c'est ce qui arrive de l'autre branche.

Dans un conflit, quel marqueur sépare TA version de celle de l'autre branche ?

Étape 06 / 13

Choisir la bonne version

Résoudre un conflit, c'est écrire la version finale du passage. Tu as trois options :

  • Garder ta version (celle du haut) : tu supprimes la version du bas.
  • Garder l'autre version (celle du bas) : tu supprimes la version du haut.
  • Combiner les deux : tu écris un mélange, par exemple <h1>Bonjour et welcome</h1>.

Dans tous les cas, tu supprimes aussi les trois lignes de marqueurs. Par exemple, si tu gardes ta version, le passage devient :

# Le même extrait, une fois résolu

<h1>Bonjour</h1>

Astuce

Dans VS Code, des boutons apparaissent au-dessus de chaque conflit : Accept Current Change (garder ta version), Accept Incoming Change (garder l'autre), Accept Both Changes (garder les deux). Ils font le travail pour toi, mais relis toujours le résultat.

À pratiquer

Avant de choisir, lis bien les deux versions. Si ce n'est pas ton code, demande à la personne qui l'a écrit. Effacer le travail d'un collègue sans le lire, c'est la pire façon de résoudre un conflit.

Tu as choisi la version à garder. Que reste-t-il à faire dans le fichier ?

Étape 07 / 13

Terminer la fusion

Quand tous les marqueurs ont disparu du fichier, dis à Git que le conflit est résolu avec git add, puis termine la fusion avec un commit :

$ git add index.html

$ git commit -m "Fusionner feature/header en gardant le titre Bonjour"

[main 4e9a1c7] Fusionner feature/header en gardant le titre Bonjour

Vérifie que tout est en ordre :

$ git status

On branch main
nothing to commit, working tree clean

Astuce

C'est fini ! Le commit de fusion est créé et le conflit appartient au passé. Tu peux le voir avec git log --oneline --graph.

Tu as édité le fichier en conflit et retiré les marqueurs. Ensuite ?

Étape 08 / 13

Annuler une fusion : git merge --abort

Tu es perdu au milieu d'un conflit, ou tu veux d'abord en parler à ton équipe ? Tu peux tout annuler :

$ git merge --abort

Ton dépôt revient exactement à l'état d'avant le git merge. Rien n'est perdu, ni de ton côté ni de l'autre. Tu pourras relancer la fusion quand tu seras prêt.

Astuce

git merge --abort ne fonctionne que pendant une fusion en cours, avant le commit final.

Quelle commande annule proprement une fusion en cours ?

Étape 09 / 13

Limiter les conflits

Les conflits sont normaux, mais quelques habitudes les rendent plus rares et plus petits :

  • Fais git pull souvent : tu travailles sur la version la plus récente.
  • Fusionne souvent : une branche qui vit trois semaines s’éloigne beaucoup plus de main qu’une branche qui vit deux jours.
  • Fais des petits commits ciblés : moins de lignes touchées, moins de risques de collision.
  • Parle avec ton équipe : si vous devez modifier le même fichier, organisez-vous.
  • Découpe ton code en petits fichiers : deux personnes ont moins de chances de toucher le même.

Étape 10 / 13

Récap : résoudre un conflit

1

git merge (ou git pull) annonce un CONFLICT

2

git status : tu repères les fichiers en conflit (both modified)

3

Tu ouvres chaque fichier, tu choisis la version et tu supprimes les marqueurs

4

git add : tu marques chaque fichier comme résolu

5

git commit : tu termines la fusion

Ton aide-mémoire du chapitre :

$ git status # repérer les fichiers en conflit

$ git add <fichier> # marquer un fichier comme résolu

$ git commit -m "message" # terminer la fusion

$ git merge --abort # tout annuler, revenir avant la fusion

git status
— Repérer les fichiers en conflit
Éditer le fichier
— Choisir la version, retirer les marqueurs
git add
— Marquer le fichier comme résolu
git commit
— Terminer la fusion
git merge --abort
— Tout annuler

Étape 11 / 13

Erreurs fréquentes

  • Laisser des marqueurs <<<<<<< dans le code : le fichier ne fonctionne plus. Cherche <<<<<<< dans tes fichiers avant de commiter.
  • Faire git add sans relire le fichier : vérifie que le résultat est bien celui que tu veux.
  • Effacer le travail de l'autre sans le comprendre : lis les deux versions, et demande si besoin.
  • Oublier un fichier : tant qu'un fichier reste dans Unmerged paths, Git refuse le commit. Relance git status.
  • Faire git merge --abort à chaque fois par peur : savoir annuler est utile, mais résoudre un conflit est une compétence qui s’apprend vite.

Étape 12 / 13

Bonus : sous le capot

Astuce

Partie facultative, pour les curieux. Tu peux passer directement au quiz.

Comment Git sait-il qu’il y a un conflit ? Il ne compare pas deux versions du fichier, mais trois :

  • La version de ta branche (HEAD)
  • La version de l'autre branche
  • La version de l'ancêtre commun : le dernier commit que les deux branches partagent, avant de se séparer

Si une ligne n'a changé que d'un côté par rapport à l'ancêtre, Git prend ce changement sans hésiter. Si elle a changé des deux côtés, de façon différente, c'est un conflit. On appelle ça une fusion à trois points (three-way merge).

Tu peux retrouver l'ancêtre commun de deux branches :

$ git merge-base main feature/header

3f2a1b4c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a

Astuce

Pour voir aussi la version de l'ancêtre dans les marqueurs, active ce réglage : git config --global merge.conflictStyle zdiff3. Une troisième partie, marquée |||||||, apparaît entre ta version et l'autre. Pratique pour comprendre qui a changé quoi.

Étape 13 / 13

Teste tes connaissances

Dernier quiz du parcours : vérifie que tu sais résoudre un conflit. Clique sur la réponse qui te semble correcte : chaque réponse est expliquée.

Quiz · Chapitre 5

1. Quand un conflit de fusion se produit-il ?

2. Dans un fichier en conflit, que trouve-t-on entre <<<<<<< HEAD et ======= ?

3. Comment repérer les fichiers en conflit ?

4. Tu as retiré tous les marqueurs d’index.html. Quelle est la suite ?

5. Que fait git merge --abort ?

6. Quelle habitude réduit le risque de conflits ?

Ton avis compte

Aide-nous à améliorer cette formation en partageant ton retour.

Pour qu'on puisse te répondre si besoin.