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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Lire les marqueurs de conflit
<<<<<<<,=======,>>>>>>>sans panique - Résoudre un conflit manuellement étape par étape
- Utiliser
--ourset--theirspendant un rebase pour résoudre vite - Annuler proprement un merge ou rebase conflictuel avec
--abort - Configurer
rererepour mémoriser vos résolutions récurrentes
Pourquoi Git ne résout-il pas tout seul ?
Section intitulée « Pourquoi Git ne résout-il pas tout seul ? »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
Lire les marqueurs de conflit
Section intitulée « Lire les marqueurs de conflit »Quand un conflit survient, Git insère des marqueurs dans le fichier :
<<<<<<< HEADfunction calculerTVA(prix) { return prix * 0.20;}=======function calculerTVA(prix, taux = 0.20) { return prix * taux;}>>>>>>> feature/tva-configurable| Marqueur | Signification |
|---|---|
<<<<<<< HEAD | Dé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.
Résoudre un conflit manuellement
Section intitulée « Résoudre un conflit manuellement »-
Identifiez les fichiers en conflit
Fenêtre de terminal git statusLes fichiers en conflit apparaissent sous “Unmerged paths” avec le statut
both modified. -
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;} -
Marquez le conflit comme résolu
Fenêtre de terminal git add src/utils/tva.js -
Terminez le merge
Fenêtre de terminal git commitGit préremplira le message avec
Merge branch 'feature/...'.
Pour voir la liste complète des conflits restants :
git diff --name-only --diff-filter=UUtiliser —ours et —theirs
Section intitulée « Utiliser —ours et —theirs »Quand vous savez d’avance quelle version garder, vous pouvez résoudre le conflit en une commande :
# Garder VOTRE version (branche courante)git checkout --ours src/utils/tva.jsgit add src/utils/tva.js
# Garder la version de L'AUTRE branchegit checkout --theirs src/utils/tva.jsgit add src/utils/tva.jsPour appliquer la même stratégie à tous les fichiers en conflit :
# Garder tous les fichiers de la branche courantegit checkout --ours .git add .
# Garder tous les fichiers de l'autre branchegit checkout --theirs .git add .Annuler un merge raté
Section intitulée « Annuler un merge raté »Si le merge est trop complexe ou si vous avez fait une erreur, vous pouvez tout annuler et revenir à l’état d’avant :
Pendant le merge (conflits non résolus)
Section intitulée « Pendant le merge (conflits non résolus) »git merge --abortLe working directory revient exactement à l’état d’avant git merge.
Après le commit de merge
Section intitulée « Après le commit de merge »Si vous avez déjà commité le merge mais regrettez :
git reset --hard HEAD~1Ou si le merge est déjà poussé :
git revert -m 1 HEADPendant un rebase
Section intitulée « Pendant un rebase »git rebase --abortRevient à l’état d’avant le rebase — aucune modification perdue.
Activer rerere : ne résoudre qu’une fois
Section intitulée « Activer rerere : ne résoudre qu’une fois »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 :
git config --global rerere.enabled trueComment ça fonctionne :
- Vous résolvez un conflit manuellement
- Git enregistre la résolution dans
.git/rr-cache/ - 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 :
git rerere statusConflits sur les fichiers binaires
Section intitulée « Conflits sur les fichiers binaires »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 :
# Garder votre version de l'imagegit checkout --ours logo.pnggit add logo.png
# Garder la version de l'autre branchegit checkout --theirs logo.pnggit add logo.pngIl n’y a pas de « combinaison » possible pour un fichier binaire.
Merge —squash comme alternative
Section intitulée « Merge —squash comme alternative »Si vous anticipez beaucoup de conflits, merge --squash peut
simplifier la situation en combinant tous les commits de la feature
en un seul changement :
git merge --squash feature/dashboardCela 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 :
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.
Diagnostic : visualiser les conflits
Section intitulée « Diagnostic : visualiser les conflits »Avant de résoudre, comprenez l’étendue des modifications :
# Voir ce que la branche feature a modifiégit diff main...feature/dashboard --stat
# Voir les modifications en conflit en détailgit diffPour un diff à 3 voies (base commune + les 2 branches) :
git config --global merge.conflictstyle diff3Le format diff3 ajoute une section ||||||| montrant la version
d’origine (avant les modifications des deux côtés) :
<<<<<<< HEADreturn prix * 0.20;||||||| merged common ancestorsreturn prix * 0.196;=======return prix * taux;>>>>>>> feature/tva-configurableCela aide à comprendre ce que chacun a voulu changer par rapport à l’original.
Dépannage : problèmes courants
Section intitulée « Dépannage : problèmes courants »| Symptôme | Cause probable | Solution |
|---|---|---|
| Conflits sur des fichiers que vous n’avez pas touchés | Reformatage, fin de ligne, espaces | Vérifiez .gitattributes et core.autocrlf |
merge --abort échoue | Modifications non commitées avant le merge | git stash puis git merge --abort |
| Le même conflit revient à chaque rebase | Résolution non mémorisée | Activez rerere : git config --global rerere.enabled true |
--ours garde la mauvaise version pendant un rebase | Les sens sont inversés en rebase | Pendant un rebase, --ours = branche cible, --theirs = vos commits |
| Conflit « both deleted » | Les deux branches ont supprimé le fichier | git 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 |
À retenir
Section intitulée « À retenir »- 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 rebasegit merge --abort: annulez tout et revenez à l’état d’avantrerere: activez-le (git config --global rerere.enabled true) pour ne plus résoudre deux fois le même conflitdiff3: activez le format 3 voies pour mieux comprendre l’origine du conflit- Fichiers binaires : seul
--oursou--theirs, pas de fusion possible