Les conflits de merge, sans paniquer
Le gain du jour : provoquer un conflit de merge exprès, le regarder en face, et le résoudre calmement. Après cette leçon, le message « CONFLICT (content): Merge conflict » ne te fera plus jamais peur.
Échauffement — de mémoire, sans tricher
0. Quand un merge est dit « fast-forward », que s'est-il passé ?
D’où vient un conflit ?
Quand deux branches ont toutes les deux avancé, Git fabrique un commit de fusion en combinant les deux histoires. Il y arrive presque toujours tout seul — deux personnes qui modifient des fichiers différents, ou des endroits différents du même fichier, fusionnent sans friction. Le conflit ne survient que dans un cas précis : les deux branches ont modifié les mêmes lignes du même fichier, et Git refuse de choisir à ta place (Pro Git, « Branches et fusions : les bases »).
C’est Git qui te dit : « deux humains ont pris deux décisions incompatibles sur ces lignes — c’est à un humain de trancher, pas à moi ». Rien n’est cassé, rien n’est perdu : Git attend simplement ta décision.
La méthode en 4 pas
git status— liste les fichiers en conflit (« both modified »).Ouvre chaque fichier : Git y a inséré des marqueurs :
<<<<<<< HEAD seuil = 0.5 ← la version de TA branche (où tu es) ======= seuil = 0.7 ← la version de la branche fusionnée >>>>>>> reglage-seuilÉdite : garde une version, ou l’autre, ou écris une troisième voie — puis supprime les trois lignes de marqueurs. Le fichier doit redevenir un fichier normal et valide.
Scelle ta décision :
git add <fichier>puisgit commit(message pré-rempli « Merge branch … » — garde-le).
Et si tu veux tout annuler et respirer : git merge --abort ramène le dépôt
exactement à l’état d’avant le merge. Il y a toujours une sortie de secours.
Entraîne-toi ici — terminal simulé
Avant de passer au vrai terminal, fais l’exercice dans ce simulateur : il accepte les vraies commandes du cours et valide ton résultat automatiquement. Erreur sans conséquence, bouton reset à volonté.
À toi de jouer — fabriquons le monstre
Crée deux branches qui modifient la même ligne :
cd ~/Workspaces/pythons/git-entrainement git switch main echo "seuil = 0.4" > config.py git add config.py && git commit -m "Ajoute la configuration du seuil" git switch -c reglage-a echo "seuil = 0.5" > config.py git add config.py && git commit -m "Monte le seuil à 0.5" git switch main git switch -c reglage-b echo "seuil = 0.7" > config.py git add config.py && git commit -m "Monte le seuil à 0.7"Fusionne la première branche — tout va bien :
git switch main git merge reglage-a # fast-forward, aucun souciFusionne la seconde — boum :
git merge reglage-b« CONFLICT (content): Merge conflict in config.py ». Parfait : c’est exactement ce qu’on voulait. Respire, et applique la méthode :
git status # pas 1 : « both modified: config.py » cat config.py # pas 2 : observe les marqueurs <<< === >>>Pas 3 : ouvre
config.pydans ton éditeur, décide (disons 0.7… ou coupe la poire en deux avec 0.6 !), supprime les marqueurs. Le fichier final doit contenir une seule ligne saine, par exemple :seuil = 0.6.Pas 4 : scelle et vérifie :
git add config.py git commit # garde le message « Merge branch 'reglage-b' » git log --oneline --graph # admire : les deux histoires convergent en un commit de fusion git branch -d reglage-a reglage-bBoucle d’entraînement : refais un conflit de mémoire (deux branches, même ligne), et cette fois teste aussi
git merge --abortavant de le résoudre pour de bon.
Même logique : GitHub affiche « This branch has conflicts ». La résolution standard :
git switch ma-branche → git merge main → résoudre comme ci-dessus →
push. La PR redevient verte. Les conflits simples peuvent aussi se résoudre dans
l’éditeur web de GitHub.
Vérifie ta compréhension
1. Dans quel cas un merge produit-il un conflit ?
2. Dans les marqueurs de conflit, que contient la section sous <<<<<<< HEAD ?
3. Le conflit te dépasse, tu veux revenir à l'état d'avant le merge. Que tapes-tu ?
Pour aller plus loin
📖 Source principale : Pro Git (fr) — « Branches et fusions : les bases » (section « Conflits de fusions »). En secours au quotidien : Oh Shit, Git!?! (fr). 🎮 Et pour visualiser les merges : Learn Git Branching, séquence « Introduction » niveaux 3–4.
🗂 Fiche mise à jour : Commandes Git — antisèche.