Mise en place et utilisation de Meld comme gt difftool et mergetool

Bien que la plupart des informations de cette question et de cette réponse soient disponibles sur StackOverflow , elles sont réparties sur un grand nombre de pages et parmi d’autres réponses qui sont erronées ou trompeuses. Il m’a fallu du temps pour reconstituer tout ce que je voulais savoir.

Il y a beaucoup de programmes différents qui peuvent être utilisés en tant que git difftool et mergetool, et il n’y a certainement pas de consensus sur ce qui est le meilleur (les opinions, les exigences et les systèmes d’exploitation seront clairement différents).

Meld est un choix populaire entre plates-formes (UNIX / Linux, OSX, Windows), comme indiqué dans la question StackOverflow . Quel est le meilleur outil de fusion visuelle pour Git? , dans laquelle la réponse proposant Meld a plus de 3 fois les votes comme tout autre outil.

Les réponses aux deux questions suivantes seront données dans ma réponse ci-dessous:

  • Comment puis-je configurer et utiliser Meld comme mon outil Git Difftool?
  • Comment puis-je configurer et utiliser Meld en tant que git mergetool?

Remarque: 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.

    Comment puis-je configurer et utiliser Meld comme mon outil Git Difftool?

    git difftool affiche le diff en utilisant un programme de diff GUI (ie Meld) au lieu d’afficher la sortie diff dans votre terminal.

    Bien que vous puissiez définir le programme graphique sur la ligne de commande en utilisant -t / --tool= il est plus logique de le configurer dans votre fichier .gitconfig . [Remarque: voir les sections sur les guillemets et les chemins d’access Windows en bas.]

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

    [Remarque: ces parameters ne modifieront pas le comportement de git diff qui continuera à fonctionner normalement.]

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

     git difftool  file_name git difftool  file_name git difftool   file_name 

    Si elle est correctement configurée, une fenêtre Meld s’ouvrira affichant le diff en utilisant une interface graphique.

    L’ordre des fenêtres de la fenêtre de l’interface graphique Meld peut être contrôlé par l’ordre de $LOCAL et $REMOTE en cmd , c’est-à-dire quel fichier est affiché dans le volet gauche et dans le volet droit. Si vous les voulez, inversez-les simplement comme suit:

      cmd = meld "$REMOTE" "$LOCAL" 

    Enfin, la ligne prompt = false arrête simplement git de vous demander si vous voulez lancer Meld ou non, par défaut git lancera une invite.


    Comment puis-je configurer et utiliser Meld en tant que git mergetool?

    git mergetool vous permet d’utiliser un programme de fusion GUI (ie Meld) pour résoudre les conflits de fusion survenus lors d’une fusion.

    Comme difftool, vous pouvez définir le programme graphique sur la ligne de commande en utilisant -t / --tool= mais, comme précédemment, il est plus logique de le configurer dans votre fichier .gitconfig . [Remarque: voir les sections sur les guillemets et les chemins d’access Windows 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 un conflit de fusion, 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 stade, file_name contiendra le fichier partiellement fusionné avec les informations sur le conflit de fusion (c’est-à-dire le fichier contenant toutes les entrées < <<<<<< et < <<<<<< ).

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

     git mergetool 

    Si elle est correctement configurée, une fenêtre Meld s'ouvrira affichant 3 fichiers. Chaque fichier sera contenu dans un volet distinct de son interface graphique.

    Dans l'exemple de l'entrée .gitconfig ci-dessus, 2 lignes sont suggérées comme ligne cmd [mergetool "meld"] . En fait, les utilisateurs avancés disposent de toutes sortes de moyens pour configurer la ligne de commande, mais cela dépasse le cadre de cette réponse.

    Cette réponse comporte 2 lignes de commandes alternatives qui, entre elles, s'adresseront à la plupart des utilisateurs et constitueront un bon sharepoint départ pour les utilisateurs expérimentés qui souhaitent passer à un niveau de complexité supérieur.

    Tout d'abord, voici ce que les parameters signifient:

    • $LOCAL est le fichier dans la twig en cours (par exemple master).
    • $REMOTE est le fichier dans la twig en cours de fusion (par exemple nom_twig).
    • $MERGED est le fichier partiellement fusionné contenant les informations sur le conflit de fusion.
    • $BASE est l'ancêtre de validation partagé de $LOCAL et $REMOTE , c'est-à-dire le fichier tel qu'il était lorsque la twig contenant $REMOTE a été créée à l'origine.

    Je vous suggère d'utiliser soit:

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

    ou:

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

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

    De toute façon, Meld affichera 3 volets avec $LOCAL et $REMOTE dans les volets gauche et droit et $MERGED ou $BASE dans le volet central.

    Dans les deux cas, le volet central est le fichier à modifier pour résoudre les conflits de fusion. La différence est juste dans quelle position d'édition de départ 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 validation partagé de $LOCAL et $REMOTE . [Puisque les deux lignes de 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ée, mais le commentaire peut être échangé si je veux utiliser la ligne $BASE à la place.]

    Après avoir modifié le volet central pour résoudre les conflits de fusion, enregistrez simplement le fichier et fermez la fenêtre Meld. Git effectuera la mise à jour automatiquement et le fichier dans la twig actuelle (par exemple master) contiendra désormais tout ce que vous avez trouvé dans le volet central.

    git aura sauvegardé le fichier partiellement fusionné avec les informations de conflit de fusion en ajoutant .orig au nom de fichier d'origine. par exemple file_name.orig . Après avoir vérifié que vous êtes satisfait de la fusion et que vous exécutez les tests que vous souhaitez, le fichier .orig peut être supprimé.

    À ce stade, vous pouvez maintenant vous engager à valider les modifications.

    REMARQUE: Ne vous inquiétez pas du fait que --output "$MERGED" est utilisé dans cmd que $MERGED ou $BASE aient été utilisés plus tôt dans la ligne de commande. L'option --output indique simplement à Meld le nom du fichier dans lequel le fichier de résolution de conflit doit être enregistré. Meld s'assurera que vos modifications de conflit sont enregistrées dans ce fichier, que vous $MERGED ou $BASE comme sharepoint départ.

    Si, pendant que vous modifiez les conflits de fusion dans Meld, vous souhaitez abandonner l’utilisation de Meld, quittez Meld sans enregistrer le fichier de résolution de fusion dans le volet central. git répondra avec le message file_name seems unchanged et ensuite demander Was the merge successful? [y/n] Was the merge successful? [y/n] , si vous répondez n la résolution du conflit de fusion sera abandonnée et le fichier restra inchangé. Notez que si vous avez enregistré le fichier dans Meld à tout 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 créé pour vous.]

    Si vous avez plus d'un fichier avec des conflits de fusion, alors git ouvrira une nouvelle fenêtre Meld pour chacun, l'un après l'autre, jusqu'à ce qu'ils soient tous terminés. Ils ne seront pas tous ouverts en même temps, mais lorsque vous aurez fini d’éditer les conflits en un et fermer Meld, git ouvrira le suivant, et ainsi de suite jusqu’à ce que tous les conflits de fusion aient été résolus.

    Il serait judicieux de créer un projet factice pour tester l’utilisation de git mergetool avant de l’utiliser sur un projet en direct . Veillez à utiliser un nom de fichier contenant un espace dans votre test, au cas où votre système d'exploitation vous demanderait d'échapper aux guillemets dans la ligne de commande, voir ci-dessous.


    Caractères de citation échappés

    Certains systèmes d’exploitation peuvent devoir échapper les guillemets dans cmd . Les utilisateurs moins expérimentés doivent se rappeler que les lignes de commande de configuration doivent être testées avec des noms de fichiers contenant des espaces, et si les lignes de commande ne fonctionnent pas avec les noms de fichiers contenant des espaces, essayez d’échapper aux guillemets. par exemple

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

    Dans certains cas, des échappements de devis plus complexes peuvent être nécessaires. Le premier des liens de chemin Windows ci-dessous contient un exemple de sortingple-échappement de chaque devis. C'est un ennui mais parfois nécessaire. par exemple

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

    Chemins Windows

    Les utilisateurs de Windows auront probablement besoin d’une configuration supplémentaire pour les lignes de commande Meld. Ils peuvent avoir besoin d'utiliser le chemin d'access complet à meldc , qui est conçu pour être appelé sur Windows à partir de la ligne de commande, ou ils peuvent avoir besoin ou souhaiter utiliser un wrapper. Ils doivent lire les pages StackOverflow liées ci-dessous qui concernent la définition de la ligne Meld cmd correcte pour Windows. Étant donné que je suis un utilisateur Linux, je ne parviens pas à tester les différentes lignes Windows cmd et je n’ai pas d’autre information sur le sujet que de recommander l’utilisation d’un chemin complet vers Meld ou meldc ou d’append le dossier du programme Meld à votre path

    • Git Diff et Meld sous Windows
    • Comment définir Meld comme git mergetool
    • Git mergetool avec Meld sous Windows

    Ignorer les espaces de fin avec Meld

    Meld a un certain nombre de préférences qui peuvent être configurées dans l'interface graphique.

    Dans l'onglet Text Filters préférences, il existe plusieurs filtres utiles pour ignorer des éléments tels que les commentaires lors de l'exécution d'un diff. Bien qu'il existe des filtres à ignorer All whitespace et Leading whitespace , il n'y a pas d'ignorer Trailing whitespace (cela a été suggéré comme un ajout dans la liste de diffusion Meld mais n'est pas disponible dans ma version).

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

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

    J'espère que cela aide tout le monde.

    Tandis que l’autre réponse est correcte, voici le moyen le plus rapide de procéder et de configurer Meld comme outil de comparaison visuelle. Il suffit de copier / coller ceci:

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

    Maintenant, lancez git difftool dans un répertoire et Meld sera lancé pour chaque fichier différent.

    Note latérale: Meld est étonnamment lent à comparer les fichiers CSV, et aucun outil de diff Linux que j’ai trouvé n’est plus rapide que cet outil Windows de 2009 appelé CompareIt !.

    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 

    (Mettez à jour le chemin du fichier pour Meld.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 Meld en utilisant cette commande:

     which meld 

    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' 

    Cela le rend similaire au script git-meld.pl ici: https://github.com/wmanley/git-meld

    Vous pouvez alors simplement courir

     git meld 

    Il peut être compliqué de calculer un diff dans votre tête à partir des différentes sections de $ MERGED et de l’appliquer. Dans ma configuration, meld aide en vous montrant ces différences visuellement, en utilisant:

     [merge] tool = mymeld conflictstyle = diff3 [mergetool "mymeld"] cmd = meld --diff $BASE $REMOTE --diff $REMOTE $LOCAL --diff $LOCAL $MERGED 

    Cela semble étrange mais offre un stream de travail très pratique, en utilisant trois tabs:

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

    2. Dans la partie droite de l’onglet 2, vous appliquez le “changement que vous devez effectuer” et copiez l’intégralité du contenu du fichier dans le Presse-papiers (en utilisant Ctrl-a et Ctrl-C).

    3. dans l’onglet 3, remplacez le côté droit par le contenu du presse-papiers. Si tout est correct, vous verrez maintenant – de gauche à droite – le même changement que celui indiqué dans l’onglet 1 (mais avec des contextes différents). Enregistrez les modifications apscopes dans cet onglet.

    Remarques:

    • ne modifiez rien dans l’onglet 1
    • ne rien enregistrer dans l’onglet 2 car cela produira des popups gênants dans l’onglet 3