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 .gitconfig
fichier. [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 diff
qui continuera de fonctionner comme d'habitude.]
Vous utilisez git difftool
exactement 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 $LOCAL
et $REMOTE
dans 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 = false
ligne 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 .gitconfig
fichier. [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 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 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 .gitconfig
ci-dessus, 2 lignes sont suggérées comme [mergetool "meld"]
cmd
ligne. En fait, il existe toutes sortes de façons pour les utilisateurs avancés de configurer la cmd
ligne, mais cela dépasse le cadre de cette réponse.
Cette réponse a 2 cmd
lignes 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:
$LOCAL
est le fichier dans la branche courante (par exemple maître).
$REMOTE
est le fichier dans la branche en cours de fusion (par exemple nom_branche).
$MERGED
est le fichier partiellement fusionné contenant les informations de conflit de fusion.
$BASE
est l'ancêtre de commit partagé $LOCAL
et $REMOTE
, c'est-à-dire le fichier tel qu'il était lorsque la branche 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"
# See 'Note On Output File' which explains --output "$MERGED".
Le choix est d'utiliser $MERGED
ou $BASE
entre $LOCAL
et entre $REMOTE
.
Dans tous les cas, Meld affichera 3 volets avec $LOCAL
et $REMOTE
dans les volets gauche et droit et soit $MERGED
ou $BASE
dans 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; $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ée de $LOCAL
et $REMOTE
. [Puisque les deux cmd
lignes peuvent être utiles, je les garde toutes les deux dans mon .gitconfig
dossier. La plupart du temps, j'utilise la $MERGED
ligne et la $BASE
ligne est mise en commentaire, mais la mise en commentaire peut être permutée si je veux utiliser la $BASE
ligne à la place.]
Remarque sur le fichier de sortie: ne vous inquiétez pas de ce qui --output "$MERGED"
est utilisé dans, cmd
qu'il ait été utilisé $MERGED
ou non $BASE
plus tôt dans la cmd
ligne. L' --output
option 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 $MERGED
ou $BASE
comme 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 .orig
le nom de fichier d'origine. par exemple file_name.orig
. Après avoir vérifié que la fusion vous .orig
convient 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 unchanged
et demandera ensuite Was the merge successful? [y/n]
, si vous répondez n
alors 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 .orig
fichier 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 mergetool
avant 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 cmd
ligne, 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 cmd
lignes 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 cmd
lignes 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 cmd
ligne de fusion correcte pour Windows. Étant donné que je suis un utilisateur Linux, je ne peux pas tester les différentes cmd
lignes 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 Filters
onglet 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 whitespace
et Leading whitespace
, il n'y a pas de Trailing whitespace
filtre 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 Filters
onglet 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.