Git protip : gérer les conflits à la chaîne avec mergetool
Par Maxime Bréhin • Publié le 6 février 2023 • 3 min

This page is also available in English.

Que tu sois dans le terminal ou dans ton éditeur, lorsque tu dois gérer de nombreux fichiers conflictuels suite à une fusion qui a mal tourné, c’est parfois pénible ! Tu dois ouvrir les fichiers les uns après les autres, puis tu dois valider tes arbitrages en ajoutant les fichiers au stage. Autant dire que, outre le fait que tu n’y prends pas plaisir, c’est long et tu risques d’oublier d’ajouter certains fichiers au stage si tu n’es pas vigilant·e.

Idéalement on aimerait que ces fichiers soient ouverts à la chaîne par Git, et qu’une fois notre arbitrage terminé (fichier modifié, enregistré et fermé), il soit automatiquement validé / ajouté au stage.

Devine quoi ? Git propose cette fonctionnalité ! Il s’agit de la commande mergetool. En gros, au lieu d’ouvrir toi-même les fichiers conflictuels, tu lances cette commande et Git les ouvrira pour toi ! 🪄

git mergetool
# Tu peux aussi limiter l’ouverture aux fichiers qui t’intéressent
# git mergetool file1.txt dir1/ *.js

Avant de foncer tête baissée et de lancer cette commande dans ton terminal, prends le temps de lire la suite, car il y a quelques astuces et subtilités.

Pour commencer, tu dois définir l’outil par défaut que tu souhaites utiliser. Il existe déjà une liste d’outils disponibles sur ta machine ainsi qu’une liste de suggestions d’outils à installer. Pour voir tout ça, tu peux renseigner la commande avec l’option :

> git mergetool --tool-help

'git mergetool --tool=<tool>' may be set to one of the following:
araxis Use Araxis Merge (requires a graphical session)
vimdiff Use Vim with a custom layout (see `git help mergetool`'s `BACKEND SPECIFIC HINTS` section)
vimdiff1 Use Vim with a 2 panes layout (LOCAL and REMOTE)
vimdiff2 Use Vim with a 3 panes layout (LOCAL, MERGED and REMOTE)
vimdiff3 Use Vim where only the MERGED file is shown

user-defined:
vscode.cmd code --wait $MERGED

The following tools are valid, but not currently available:
bc Use Beyond Compare (requires a graphical session)
bc3 Use Beyond Compare (requires a graphical session)
bc4 Use Beyond Compare (requires a graphical session)
codecompare Use Code Compare (requires a graphical session)

Par défaut, Git regardera les outils déjà présents et ouvrira le premier qu’il trouvera. Ces outils font généralement bien le job, mais il faut savoir les utiliser (ou en sortir quand il s’agit de vim 😅 : ZZ ou :q!). Si tu souhaites occasionnellement utiliser un outil disponible dans la liste, tu peux alors passer l’option --tool à la commande :

git mergetool --tool=araxis

Mais pour être peinard·e, tu voudras surtout définir ton outil par défaut. Pour ça, il faut passer par la configuration :

git config --global merge.tool araxis

Attention, si tu souhaites utiliser un éditeur non présent dans la liste, tu dois le signaler à Git comme mergetool personnalisé (ce que tu vois plus haut dans la liste user-defined). Là encore ça passe par la configuration :

# git config --global mergetool.<le-nom-voulu>.cmd '<la-commande-d’appel>'
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
# N’oublie pas ensuite de le configurer comme outil par défaut
git config --global merge.tool vscode

Et voilà, le tour est joué ! Aux prochains conflits, plus besoin d’aller ouvrir tes fichiers à la mano, tu n’auras plus qu’à lancer git mergetool.

Des astuces en veux-tu en voilà !

On a tout plein d’articles et de vidéos existants et encore beaucoup à venir. Pour ne rien manquer, tu devrais penser à t’abonner à notre newsletter, à notre chaîne YouTube, à nous suivre sur Twitter ou sur Mastodon ou encore mieux, à suivre notre formation du feu de dieu 🔥 : Git Total !

Découvrez nos cours vidéo ! 🖥

Nos cours vidéo sont un complément idéal et bon marché à nos articles techniques et formations présentielles. Autour de Git, de JavaScript et d’autres sujets, retrouvez des contenus de très grande qualité à des prix abordables, spécialement conçus pour lever vos plus gros points de blocage.