Mise en place et utilisation de Meld comme votre git difftool et mergetool

bien qu'une grande partie de l'information contenue dans cette question et réponse soit disponible sur StackOverflow , elle est répartie sur de nombreuses pages et parmi d'autres réponses qui sont erronées ou trompeuses. Ça m'a pris du temps de rassembler tout ce que je voulais savoir.

Il ya beaucoup de programmes différents qui peuvent être utilisés comme votre git difftool et mergetool, et il n'y a certainement pas de consensus sur ce qui est le meilleur (opinions, exigences, et Oss sera clairement différent).

Meld est un choix populaire multiplateformes (UNIX / Linux, OSX, Windows) comme le montre le StackOverflow question, Quel est le meilleur outil de fusion visuelle pour Git? , dans lequel la réponse proposant la fusion a plus de trois fois les voix comme tout autre outil.

les 2 questions suivantes seront répondues dans ma réponse ci-dessous:

  • Comment puis-je configurer et utiliser la soudure comme mon git difftool?
  • Comment puis-je configurer et utiliser Meld comme mon outil de fusion?

Note: Il n'est pas nécessaire d'utiliser le même programme que votre difftool et mergetool, différents programmes peuvent être définis pour les deux.

128
demandé sur Community 2015-12-06 19:35:03

6 réponses

Comment puis-je configurer et utiliser Meld comme mon git difftool?

git difftool affiche la diff à l'aide d'un programme GUI diff (i.e. Meld) au lieu d'afficher la sortie diff dans votre terminal.

bien que vous puissiez configurer le programme GUI sur la ligne de commande en utilisant -t <tool> / --tool=<tool> , il est plus logique de le configurer dans votre fichier .gitconfig . [Note: voir les sections sur les guillemets échappant et les chemins de fenêtres en bas.]

# Add the following to your .gitconfig file.
[diff]
    tool = meld
[difftool]
    prompt = false
[difftool "meld"]
    cmd = meld "$LOCAL" "$REMOTE"

[Note: ces réglages ne modifient pas le comportement de git diff qui continuera à fonctionner comme d'habitude.]

Vous utilisez git difftool exactement de la même façon que vous utilisez git diff . par exemple

git difftool <COMMIT_HASH> file_name
git difftool <BRANCH_NAME> file_name
git difftool <COMMIT_HASH_1> <COMMIT_HASH_2> file_name

si elle est correctement configurée, une fenêtre de fusion s'ouvrira en affichant la diff à l'aide d'une interface GUI.

l'ordre des vitres Gui de la soudure peut être commandé par l'ordre de $LOCAL et $REMOTE dans cmd , c'est-à-dire quel fichier est représenté dans le volet de gauche et lequel dans le volet de droite. Si vous les voulez de l'autre côté, il suffit de les échanger comme ceci:

    cmd = meld "$REMOTE" "$LOCAL"

enfin la ligne prompt = false empêche simplement git de vous demander si vous voulez lancer Meld ou non, par défaut git émettra un prompt.


comment installer et utiliser la soudure comme mon git mergetool?

git mergetool vous permet d'utiliser un programme de fusion GUI (i.e. Meld) pour résoudre les conflits de fusion qui se sont produits lors d'une fusion.

comme difftool, vous pouvez définir le programme GUI sur la ligne de commande en utilisant -t <tool> / --tool=<tool> mais, comme avant, il est plus logique de le configurer dans votre fichier .gitconfig . [Note: voir les sections sur les guillemets échappant et les chemins de fenêtres en bas.]

# Add the following to your .gitconfig file.
[merge]
    tool = meld
[mergetool "meld"]
    # Choose one of these 2 lines (not both!) explained below.
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"

Vous n'utilisez PAS git mergetool pour effectuer une fusion réelle. Avant d'utiliser git mergetool vous effectuez une fusion de la manière habituelle avec git. par exemple

git checkout master
git merge branch_name

S'il y a une fusion de conflit git affichera quelque chose comme ceci:

$ git merge branch_name
Auto-merging file_name
CONFLICT (content): Merge conflict in file_name
Automatic merge failed; fix conflicts and then commit the result.

à ce point file_name contiendra le fichier partiellement fusionné avec les informations de conflit de fusion (c'est le fichier avec toutes les entrées >>>>>>> et <<<<<<< dedans.)

Mergetool peut maintenant être utilisé pour résoudre les conflits de fusion. Vous commencez très facilement avec:

git mergetool

si correctement configuré une fenêtre de fusion s'ouvrira en affichant 3 fichiers. Chaque fichier sera contenu dans un volet distinct de son interface graphique.

dans l'exemple ci-dessus .gitconfig , deux lignes sont suggérées comme ligne [mergetool "meld"] cmd . En fait, il existe toutes sortes de façons pour les utilisateurs avancés configurer la ligne cmd , mais cela dépasse la portée de cette réponse.

cette réponse a 2 lignes alternatives cmd qui, ensemble, s'adressera à la plupart des utilisateurs, et sera un bon point de départ pour les utilisateurs avancés qui souhaitent prendre l'outil au prochain niveau de complexité.

tout D'abord voici ce que les paramètres signifient:

  • $LOCAL est le fichier de la branche courante (par ex. maître.)
  • $REMOTE est le fichier de la branche fusionnée (par exemple branch_name).
  • $MERGED est le fichier partiellement fusionné contenant les informations de conflit de fusion.
  • $BASE est l'ancêtre partagé de $LOCAL et $REMOTE , c'est-à-dire le fichier tel qu'il était lorsque la branche contenant $REMOTE a été créée à l'origine.

je suggère vous utilisez:

[mergetool "meld"]
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"

ou:

[mergetool "meld"]
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"

le choix est d'utiliser $MERGED ou $BASE entre $LOCAL et $REMOTE .

dans les deux sens, Meld affichera 3 vitres avec $LOCAL et $REMOTE dans les vitres gauche et droite et $MERGED ou $BASE dans la vitre du milieu.

dans les deux cas le volet central est le fichier que vous doit modifier pour résoudre les conflits de fusion. La différence est juste dans la position d'édition de départ que vous préférez; $MERGED pour le fichier qui contient le fichier partiellement fusionné avec les informations de conflit de fusion ou $BASE pour l'ancêtre de commit partagé de $LOCAL et $REMOTE . [Puisque les deux lignes cmd peuvent être utiles, je les garde toutes les deux dans mon fichier .gitconfig . La plupart du temps, j'utilise la ligne $MERGED et la ligne $BASE est commenté, mais le les commentaires peuvent être échangés si je veux utiliser la ligne $BASE à la place.]

après avoir édité le volet du milieu pour résoudre les conflits de fusion, il suffit de sauvegarder le fichier et de fermer la fenêtre de fusion. Git fera la mise à jour automatiquement et le fichier de la branche courante (par exemple master) contiendra maintenant tout ce que vous avez fini avec dans le volet du milieu.

git aura fait une sauvegarde du fichier partiellement fusionné avec les informations de conflit de fusion dans il en ajoutant .orig au nom de fichier original. par exemple file_name.orig . Après avoir vérifié que vous êtes satisfait de la fusion et avoir effectué les tests que vous souhaiteriez, le fichier .orig peut être supprimé.

à ce stade, vous pouvez maintenant vous engager à effectuer les changements.

NOTE: ne vous inquiétez pas que --output "$MERGED" est utilisé dans cmd indépendamment du fait que $MERGED ou $BASE a été utilisé plus tôt dans la ligne cmd . Le L'option --output indique simplement à Meld dans quel fichier GIT veut que le fichier de résolution de conflits soit sauvegardé. Que vous utilisiez $MERGED ou $BASE comme point de départ d'édition, Meld veillera à ce que vos éditions de conflit soient sauvegardées dans ce fichier.

si, pendant que vous éditez les conflits de fusion dans Meld, vous souhaitez abandonner L'utilisation de Meld, alors quittez Meld sans enregistrer le fichier de résolution de fusion dans le volet du milieu. git répondra avec le message file_name seems unchanged et ensuite demander Was the merge successful? [y/n] , si vous répondez n alors la résolution de conflit de fusion sera annulée et le fichier restera inchangé. Notez que si vous avez sauvegardé le fichier dans Meld à n'importe quel moment, vous ne recevrez pas l'avertissement et l'invite de git. [Bien sûr, vous pouvez simplement supprimer le fichier et le remplacer par le fichier de sauvegarde .orig que git a fait pour vous.]

si vous avez plus d'un fichier avec des conflits de fusion alors git ouvrira un nouveau Souder les fenêtres les unes après les autres jusqu'à ce qu'elles soient toutes faites. Ils ne seront pas tous ouverts en même temps, mais quand vous aurez fini d'éditer les conflits d'un côté, et de fermer Meld, git ouvrira le prochain, et ainsi de suite jusqu'à ce que tous les conflits de fusion aient été résolus.

il serait judicieux de créer un projet fictif pour tester l'utilisation de git mergetool avant de l'utiliser sur un projet live . Assurez-vous d'utiliser un nom de fichier contenant un espace dans votre test, dans le cas où votre système D'exploitation vous demande d'échapper aux guillemets de la ligne cmd , voir ci-dessous.


échapper aux caractères de citation

Certains systèmes d'exploitation peuvent avoir besoin d'avoir des guillemets dans cmd échappé. Les utilisateurs moins expérimentés devraient se rappeler que les lignes de commande de configuration doivent être testées avec des noms de fichiers qui incluent des espaces, et si les lignes cmd ne fonctionnent pas avec les noms de fichiers qui incluent des espaces, alors essayez échapper les guillemets. par exemple

cmd = meld \"$LOCAL\" \"$REMOTE\"

dans certains cas, des échappatoires plus complexes peuvent être nécessaires. Le premier des liens de chemin de fenêtres ci-dessous contient un exemple de triple-échapper chaque citation. C'est un alésage, mais parfois nécessaire. par exemple

cmd = meld \\"$LOCAL\\" \\"$REMOTE\\"

Windows chemins

Les utilisateurs de Windows

auront probablement besoin d'une configuration supplémentaire ajoutée aux lignes de fusion cmd . Ils peuvent avoir besoin d'utiliser le chemin complet meldc , qui est conçu pour être appelé sur Windows à partir de la ligne de commande, ou ils peuvent avoir besoin ou veulent utiliser un wrapper. Ils doivent lire les StackOverflow pages liées ci-dessous qui sont sur le réglage de la ligne de soudure cmd correcte pour Windows. Puisque je suis un utilisateur de Linux, Je ne suis pas en mesure de tester les différentes lignes de Windows cmd et n'ai pas d'autres informations sur le sujet autre que de recommander l'utilisation de mes exemples avec l'ajout d'un chemin complet de fusion ou meldc , ou en ajoutant le dossier du programme de fusion à votre path .

Ignorant de fuite espaces avec Meld

qui peut être configuré dans l'interface graphique.

dans l'onglet Préférences Text Filters il y a plusieurs filtres utiles pour ignorer des choses comme les commentaires lors de l'exécution d'une diff. Bien qu'il y ait des filtres pour ignorer All whitespace et Leading whitespace , il n'y a pas de filtre Trailing whitespace (ceci a été suggéré comme ajout dans la liste de diffusion de Meld mais n'est pas disponible dans ma version).

ignorer whitespace arrière est souvent très utile, en particulier lors de la collaboration, et peut être ajouté manuellement facilement avec une simple expression régulière dans l'onglet Préférences de fusion Text Filters .

# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$

j'espère que cela aidera tout le monde.

247
répondu mattst 2018-03-02 11:24:43

alors que l'autre réponse est correcte, voici le moyen le plus rapide pour simplement aller de l'avant et configurer Meld comme votre outil de diff visuel. Il suffit de copier / coller ceci:

git config --global diff.tool meld
git config --global difftool.prompt false

exécute maintenant git difftool dans un répertoire et Meld sera lancé pour chaque fichier différent.

Side note: la fusion est étonnamment lente à comparer les fichiers CSV, et aucun outil de diff Linux que j'ai trouvé est plus rapide que cet outil Windows 2009-ère appelé CompareIt!.

48
répondu Dan Dascalescu 2017-07-06 07:10:44

Pour Windows . Exécutez ces commandes dans Git Bash:

git config --global diff.tool meld
git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global mergetool.prompt false

(mettre à Jour le chemin d'accès au fichier pour Fondre.exe si le vôtre est différent.)

Pour Linux . Exécutez ces commandes dans Git Bash:

git config --global diff.tool meld
git config --global difftool.meld.path "/usr/bin/meld"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "/usr/bin/meld"
git config --global mergetool.prompt false

vous pouvez vérifier le chemin de la soudure en utilisant cette commande:

which meld
33
répondu MarredCheese 2018-09-06 15:02:39

je préfère configurer meld comme une commande séparée, comme ceci:

git config --global alias.meld '!git difftool -t meld --dir-diff'

ce qui le rend similaire à la git-meld.pl script ici: https://github.com/wmanley/git-meld

vous pouvez alors juste exécuter

git meld
13
répondu Ulf Adams 2017-02-19 11:08:19

il peut être compliqué de calculer une différence dans votre tête à partir des différentes sections de $fusionné et appliquer cela. Dans ma configuration, meld vous aide en vous montrant ces diffs visuellement, en utilisant:

[merge]
    tool = mymeld
    conflictstyle = diff3

[mergetool "mymeld"]
    cmd = meld --diff $BASE $REMOTE --diff $REMOTE $LOCAL --diff $LOCAL $MERGED

il semble étrange mais offre un work-flow très pratique, en utilisant trois onglets:

  1. à l'onglet 1, vous voyez (de gauche à droite) le changement que vous devriez faire à l'onglet 2 pour résoudre le conflit de fusion.

  2. du côté droit de l'onglet 2, vous appliquez la "modification que vous devez faire" et copiez le contenu du fichier dans son intégralité dans le presse-papiers (en utilisant ctrl-A et ctrl-c).

  3. à l'onglet 3, Remplacer le côté droit par le contenu du bloc-notes. Si tout est correct, vous verrez maintenant - de gauche à droite - le même changement que dans l'onglet 1 (mais avec des contextes différents). Enregistrer les modifications effectuées dans cet onglet.

Notes:

  • ne pas modifier quoi que ce soit dans l'onglet 1
  • ne pas sauvegarder quoi que ce soit dans l'onglet 2 parce que cela produira des popups ennuyeux dans l'onglet 3
0
répondu mnieber 2016-12-12 22:05:45

il s'agit d'une réponse ciblant principalement les développeurs utilisant Windows, comme le la syntaxe du chemin de l'outil diff diffère des autres plateformes.

j'utilise Kdiff3 comme git mergetool, mais pour mettre en place le git difftool comme Meld, je d'abord installé la dernière version de la soudure de Meldmerge.org ensuite ajouté ce qui suit à mon global .gitconfig utilisant:

git config --global -e

Note, Si vous voulez plutôt texte Sublime 3 au lieu de la par défaut Vim en tant que noyau ditor, vous pouvez ajoutez à cela l' .gitconfig fichier:

[core]
editor = 'c:/Program Files/Sublime Text 3/sublime_text.exe'

puis vous ajoutez inn Meld comme le difftool

[diff]
tool = meld
guitool = meld 

[difftool "meld"]
cmd = \"C:/Program Files (x86)/Meld/Meld.exe\" \"$LOCAL\" \"$REMOTE\" --label \"DIFF 
(ORIGINAL MY)\"
prompt = false
path = C:\Program Files (x86)\Meld\Meld.exe

noter la barre oblique dans le cmd ci-dessus, sur les fenêtres il est nécessaire.

il est également possible de configurer un alias pour afficher la diff de git actuelle avec un -- dir-diff option. Ceci listera les fichiers modifiés à L'intérieur de Meld, ce qui est pratique lorsque vous avez modifié plusieurs fichiers (un scénario très commun en effet).

le pseudonyme ressemble à ceci à l'intérieur du .gitconfig fichier, sous [alias] "1519170920 de la section":

showchanges = difftool --dir-diff

pour afficher les modifications que j'ai apportées au code, j'entre la commande suivante:

git showchanges

l'image suivante montre comment cette option --dir-diff peut afficher une liste des fichiers modifiés (exemple): Meld showing list of files with changes between the $LOCAL and $REMOTE

ensuite, il est possible de cliquer sur chaque fichier et d'afficher les changements à L'intérieur de la fusion.

0
répondu Tore Aurstad 2018-09-24 15:14:08