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