← Git & GitHub : du premier commit au travail en équipe

Les conflits de merge, sans paniquer

≈ 20 minutes · Jalon M6 · Prérequis : La pull request : le rituel du travail en équipe

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 »).

Reformulons : un conflit n’est pas une erreur

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

  1. git status — liste les fichiers en conflit (« both modified »).

  2. 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
  3. É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.

  4. Scelle ta décision : git add <fichier> puis git 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é.

🖥️ Terminal d'entraînement Objectif : résoudre un vrai conflit, calmement.
(main) $

À toi de jouer — fabriquons le monstre

  1. 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"
  2. Fusionne la première branche — tout va bien :

    git switch main
    git merge reglage-a      # fast-forward, aucun souci
  3. Fusionne 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 <<< === >>>
  4. Pas 3 : ouvre config.py dans 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.

  5. 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-b
  6. Boucle d’entraînement : refais un conflit de mémoire (deux branches, même ligne), et cette fois teste aussi git merge --abort avant de le résoudre pour de bon.

Et dans une pull request ?

Même logique : GitHub affiche « This branch has conflicts ». La résolution standard : git switch ma-branchegit 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.