Aller au contenu
Développement medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Résoudre les conflits de merge Git

10 min de lecture

Git affiche CONFLICT et vous ne savez pas quoi faire ? Ce guide vous accompagne pas à pas : lire les marqueurs, choisir la bonne version, résoudre proprement et éviter les pièges classiques. Vous apprendrez aussi à utiliser rerere pour ne plus résoudre deux fois le même conflit, et à annuler un merge mal parti.

Prérequis : Merge et conflits et Rebase fondamental.

  • Lire les marqueurs de conflit <<<<<<<, =======, >>>>>>> sans panique
  • Résoudre un conflit manuellement étape par étape
  • Utiliser --ours et --theirs pendant un rebase pour résoudre vite
  • Annuler proprement un merge ou rebase conflictuel avec --abort
  • Configurer rerere pour mémoriser vos résolutions récurrentes

Git fusionne automatiquement les modifications quand elles touchent des fichiers ou zones différentes. Un conflit apparaît quand deux branches modifient la même zone du même fichier — Git ne peut pas deviner quelle version garder.

Situations typiques qui créent des conflits :

  • Deux développeurs modifient la même fonction
  • Une branche renomme un fichier, l’autre le modifie
  • Deux branches ajoutent du code au même endroit

Quand un conflit survient, Git insère des marqueurs dans le fichier :

<<<<<<< HEAD
function calculerTVA(prix) {
return prix * 0.20;
}
=======
function calculerTVA(prix, taux = 0.20) {
return prix * taux;
}
>>>>>>> feature/tva-configurable
MarqueurSignification
<<<<<<< HEADDébut de votre version (branche courante)
=======Séparation entre les deux versions
>>>>>>> feature/...Fin de la version de l’autre branche

Votre travail : choisir quelle version garder (ou combiner les deux), puis supprimer les marqueurs.

  1. Identifiez les fichiers en conflit

    Fenêtre de terminal
    git status

    Les fichiers en conflit apparaissent sous “Unmerged paths” avec le statut both modified.

  2. Ouvrez le fichier et éditez

    Supprimez les marqueurs et gardez le code correct. Par exemple, si vous voulez combiner les deux approches :

    function calculerTVA(prix, taux = 0.20) {
    return prix * taux;
    }
  3. Marquez le conflit comme résolu

    Fenêtre de terminal
    git add src/utils/tva.js
  4. Terminez le merge

    Fenêtre de terminal
    git commit

    Git préremplira le message avec Merge branch 'feature/...'.

Pour voir la liste complète des conflits restants :

Fenêtre de terminal
git diff --name-only --diff-filter=U

Quand vous savez d’avance quelle version garder, vous pouvez résoudre le conflit en une commande :

Fenêtre de terminal
# Garder VOTRE version (branche courante)
git checkout --ours src/utils/tva.js
git add src/utils/tva.js
# Garder la version de L'AUTRE branche
git checkout --theirs src/utils/tva.js
git add src/utils/tva.js

Pour appliquer la même stratégie à tous les fichiers en conflit :

Fenêtre de terminal
# Garder tous les fichiers de la branche courante
git checkout --ours .
git add .
# Garder tous les fichiers de l'autre branche
git checkout --theirs .
git add .

Si le merge est trop complexe ou si vous avez fait une erreur, vous pouvez tout annuler et revenir à l’état d’avant :

Fenêtre de terminal
git merge --abort

Le working directory revient exactement à l’état d’avant git merge.

Si vous avez déjà commité le merge mais regrettez :

Fenêtre de terminal
git reset --hard HEAD~1

Ou si le merge est déjà poussé :

Fenêtre de terminal
git revert -m 1 HEAD
Fenêtre de terminal
git rebase --abort

Revient à l’état d’avant le rebase — aucune modification perdue.

rerere (reuse recorded resolution) mémorise comment vous résolvez un conflit et réapplique automatiquement la même résolution si le conflit réapparaît :

Fenêtre de terminal
git config --global rerere.enabled true

Comment ça fonctionne :

  1. Vous résolvez un conflit manuellement
  2. Git enregistre la résolution dans .git/rr-cache/
  3. La prochaine fois que le même conflit survient (ex : rebase répété), Git le résout automatiquement

Vérification — après avoir activé rerere et résolu un conflit :

Fenêtre de terminal
git rerere status

Les fichiers binaires (images, PDF, archives) ne peuvent pas être fusionnés ligne par ligne. Git ne peut que garder l’une ou l’autre version :

Fenêtre de terminal
# Garder votre version de l'image
git checkout --ours logo.png
git add logo.png
# Garder la version de l'autre branche
git checkout --theirs logo.png
git add logo.png

Il n’y a pas de « combinaison » possible pour un fichier binaire.

Si vous anticipez beaucoup de conflits, merge --squash peut simplifier la situation en combinant tous les commits de la feature en un seul changement :

Fenêtre de terminal
git merge --squash feature/dashboard

Cela applique toutes les modifications de feature/dashboard dans votre working directory sans créer de commit de merge. Résolvez les éventuels conflits, puis commitez :

Fenêtre de terminal
git commit -m "feat: intégrer le dashboard"

L’avantage : un seul commit propre, pas d’historique de merge complexe. L’inconvénient : l’historique détaillé de la branche feature est perdu dans le merge.

Avant de résoudre, comprenez l’étendue des modifications :

Fenêtre de terminal
# Voir ce que la branche feature a modifié
git diff main...feature/dashboard --stat
# Voir les modifications en conflit en détail
git diff

Pour un diff à 3 voies (base commune + les 2 branches) :

Fenêtre de terminal
git config --global merge.conflictstyle diff3

Le format diff3 ajoute une section ||||||| montrant la version d’origine (avant les modifications des deux côtés) :

<<<<<<< HEAD
return prix * 0.20;
||||||| merged common ancestors
return prix * 0.196;
=======
return prix * taux;
>>>>>>> feature/tva-configurable

Cela aide à comprendre ce que chacun a voulu changer par rapport à l’original.

SymptômeCause probableSolution
Conflits sur des fichiers que vous n’avez pas touchésReformatage, fin de ligne, espacesVérifiez .gitattributes et core.autocrlf
merge --abort échoueModifications non commitées avant le mergegit stash puis git merge --abort
Le même conflit revient à chaque rebaseRésolution non mémoriséeActivez rerere : git config --global rerere.enabled true
--ours garde la mauvaise version pendant un rebaseLes sens sont inversés en rebasePendant un rebase, --ours = branche cible, --theirs = vos commits
Conflit « both deleted »Les deux branches ont supprimé le fichiergit rm fichier pour confirmer la suppression
Conflit « both added »Les deux branches ont créé le même fichierÉditez le fichier pour garder le bon contenu, puis git add
  • Marqueurs : <<<<<<< = votre version, ======= = séparation, >>>>>>> = l’autre version
  • Résolution : éditez le fichier, supprimez les marqueurs, git add, git commit
  • --ours/--theirs : attention, les sens sont inversés pendant un rebase
  • git merge --abort : annulez tout et revenez à l’état d’avant
  • rerere : activez-le (git config --global rerere.enabled true) pour ne plus résoudre deux fois le même conflit
  • diff3 : activez le format 3 voies pour mieux comprendre l’origine du conflit
  • Fichiers binaires : seul --ours ou --theirs, pas de fusion possible

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn