Comment configurer et utiliser Meld comme outil de diff git?
git difftool affiche le diff à l'aide d'un programme diff GUI (c'est-à-dire Meld) au lieu d'afficher la sortie diff dans votre terminal.
Bien que vous puissiez définir le programme GUI sur la ligne de commande à l'aide, -t <tool> / --tool=<tool>il est plus logique de le configurer dans votre .gitconfigfichier. [Remarque: voir les sections sur les citations d'échappement et les chemins Windows en bas.]
# Add the following to your .gitconfig file.
[diff]
    tool = meld
[difftool]
    prompt = false
[difftool "meld"]
    cmd = meld "$LOCAL" "$REMOTE"
[Remarque: Ces paramètres ne modifieront pas le comportement git diffqui continuera de fonctionner comme d'habitude.]
Vous utilisez git difftoolexactement de la même manière 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 affichant le diff à l'aide d'une interface graphique.
L'ordre des vitres de fenêtre GUI Meld peut être commandé par l'ordre de $LOCALet $REMOTEdans cmd, à savoir le fichier qui est représenté dans le volet gauche et qui , dans le panneau de droite. Si vous les voulez dans l'autre sens, échangez-les simplement comme ceci:
    cmd = meld "$REMOTE" "$LOCAL"
Enfin, la prompt = falseligne empêche simplement git de vous demander si vous souhaitez lancer Meld ou non, par défaut, git émettra une invite.
Comment configurer et utiliser Meld comme mon outil de fusion git?
git mergetool vous permet d'utiliser un programme de fusion GUI (c'est-à-dire Meld) pour résoudre les conflits de fusion qui se sont produits pendant une fusion.
Comme difftool, vous pouvez définir le programme GUI sur la ligne de commande en utilisant -t <tool> / --tool=<tool>mais, comme précédemment, il est plus logique de le configurer dans votre .gitconfigfichier. [Remarque: voir les sections sur les citations d'échappement et les chemins 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 mergetoolpour effectuer une fusion réelle. Avant d'utiliser, git mergetoolvous 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 de conflit de fusion (c'est le fichier avec toutes les entrées >>>>>>>et <<<<<<<en lui).
Mergetool peut désormais être utilisé pour résoudre les conflits de fusion. Vous démarrez très facilement avec:
git mergetool
Si elle est correctement configurée, une fenêtre de fusion s'ouvrira affichant 3 fichiers. Chaque fichier sera contenu dans un volet séparé de son interface graphique.
Dans l'exemple .gitconfigci-dessus, 2 lignes sont suggérées comme [mergetool "meld"] cmdligne. En fait, il existe toutes sortes de façons pour les utilisateurs avancés de configurer la cmdligne, mais cela dépasse le cadre de cette réponse.
Cette réponse a 2 cmdlignes alternatives qui, entre elles, répondront à la plupart des utilisateurs et seront un bon point de départ pour les utilisateurs avancés qui souhaitent faire passer l'outil au niveau de complexité suivant.
Voici d'abord ce que signifient les paramètres:
- $LOCALest le fichier dans la branche courante (par exemple maître).
- $REMOTEest le fichier dans la branche en cours de fusion (par exemple nom_branche).
- $MERGEDest le fichier partiellement fusionné contenant les informations de conflit de fusion.
- $BASEest l'ancêtre de commit partagé- $LOCALet- $REMOTE, c'est-à-dire le fichier tel qu'il était lorsque la branche contenant- $REMOTEa é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"
    # See 'Note On Output File' which explains --output "$MERGED".
Le choix est d'utiliser $MERGEDou $BASEentre $LOCALet entre $REMOTE.
Dans tous les cas, Meld affichera 3 volets avec $LOCALet $REMOTEdans les volets gauche et droit et soit $MERGEDou $BASEdans le volet central.
Dans les DEUX cas, le volet central est le fichier que vous devez modifier pour résoudre les conflits de fusion. La différence est juste la position de montage que vous préférez; $MERGEDpour le fichier qui contient le fichier partiellement fusionné avec les informations de conflit de fusion ou $BASEpour l'ancêtre de validation partagée de $LOCALet $REMOTE. [Puisque les deux cmdlignes peuvent être utiles, je les garde toutes les deux dans mon .gitconfigdossier. La plupart du temps, j'utilise la $MERGEDligne et la $BASEligne est mise en commentaire, mais la mise en commentaire peut être permutée si je veux utiliser la $BASEligne à la place.]
Remarque sur le fichier de sortie: ne vous inquiétez pas de ce qui --output "$MERGED"est utilisé dans, cmdqu'il ait été utilisé $MERGEDou non $BASEplus tôt dans la cmdligne. L' --outputoption indique simplement à Meld dans quel nom de fichier git souhaite que le fichier de résolution des conflits soit enregistré. Meld enregistrera vos modifications de conflit dans ce fichier, que vous l'utilisiez $MERGEDou $BASEcomme point de départ.
Après avoir modifié le volet central pour résoudre les conflits de fusion, enregistrez simplement le fichier et fermez la fenêtre Fusionner. Git effectuera la mise à jour automatiquement et le fichier dans la branche actuelle (par exemple master) contiendra désormais tout ce que vous avez fini dans le volet central.
git aura effectué une sauvegarde du fichier partiellement fusionné avec les informations de conflit de fusion en y ajoutant .origle nom de fichier d'origine. par exemple file_name.orig. Après avoir vérifié que la fusion vous .origconvient et exécuté les tests que vous souhaitez effectuer, le fichier peut être supprimé.
À ce stade, vous pouvez maintenant faire un commit pour valider les modifications.
Si, pendant que vous modifiez les conflits de fusion dans Meld, vous souhaitez abandonner l'utilisation de Meld, puis quittez Meld sans enregistrer le fichier de résolution de fusion dans le volet central. git répondra avec le message file_name seems unchangedet demandera ensuite Was the merge successful? [y/n], si vous répondez nalors la résolution du conflit de fusion sera abandonnée et le fichier restera 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 .origfichier de sauvegarde que git a fait pour vous.]
Si vous avez plus d'un fichier avec des conflits de fusion, git ouvrira une nouvelle fenêtre de fusion 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 terminé de modifier les conflits en un seul et que vous fermerez Meld, git ouvrira le suivant, et ainsi de suite jusqu'à ce que tous les conflits de fusion soient résolus.
Il serait judicieux de créer un projet factice pour tester l'utilisation de git mergetoolavant de l'utiliser sur un projet en direct . Assurez-vous d'utiliser un nom de fichier contenant un espace dans votre test, au cas où votre système d'exploitation vous obligerait à échapper les guillemets dans la cmdligne, voir ci-dessous.
Échapper les caractères de citation
Certains systèmes d'exploitation peuvent nécessiter que les guillemets soient cmdéchappés. 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 qui incluent des espaces, et si les cmdlignes ne fonctionnent pas avec les noms de fichiers qui incluent des espaces, essayez d'échapper les guillemets. par exemple
cmd = meld \"$LOCAL\" \"$REMOTE\"
Dans certains cas, un échappement de citation plus complexe peut être nécessaire. Le premier des liens de chemin Windows ci-dessous contient un exemple de triple échappement de chaque citation. C'est ennuyeux mais parfois nécessaire. par exemple
cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"
Chemins Windows
Les utilisateurs de Windows auront probablement besoin d'une configuration supplémentaire ajoutée aux cmdlignes de fusion . Ils peuvent avoir besoin d'utiliser le chemin d'accès complet à meldc, qui est conçu pour être appelé sous Windows à partir de la ligne de commande, ou ils peuvent avoir besoin ou vouloir utiliser un wrapper. Ils devraient lire les pages StackOverflow liées ci-dessous qui concernent la définition de la cmdligne de fusion correcte pour Windows. Étant donné que je suis un utilisateur Linux, je ne peux pas tester les différentes cmdlignes de Windows et je n'ai pas d'autres informations sur le sujet que de recommander d'utiliser mes exemples avec l'ajout d'un chemin complet vers Meld ou meldc, ou l'ajout du dossier du programme Meld à votre path.
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' Text Filtersonglet 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 y ait des filtres à ignorer All whitespaceet Leading whitespace, il n'y a pas de Trailing whitespacefiltre d' ignorance (cela a été suggéré comme 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 ajouté manuellement facilement avec une simple expression régulière dans l' Text Filtersonglet 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.