Bien que la plupart des informations contenues dans cette question et réponse soient disponibles sur StackOverflow , elles sont réparties sur de nombreuses pages et parmi d'autres réponses qui sont soit fausses, soit trompeuses. Il m'a fallu un certain temps pour rassembler tout ce que je voulais savoir.
Il existe de nombreux programmes différents qui peuvent être utilisés comme git difftool et mergetool, et il n'y a certainement pas de consensus sur le meilleur (les opinions, les exigences et les systèmes d'exploitation différeront clairement).
Meld est un choix populaire gratuit, open source et multiplateforme (UNIX / Linux, OSX, Windows) comme indiqué dans la question StackOverflow , Quel est le meilleur outil de fusion visuelle pour Git? , dans lequel la réponse proposant Meld a plus de 3 fois plus de voix que tout autre outil.
Les 2 questions suivantes recevront une réponse dans ma réponse ci-dessous:
- Comment configurer et utiliser Meld comme outil de diff git?
- Comment configurer et utiliser Meld comme mon outil de fusion git?
Remarque: Il n'est pas nécessaire d'utiliser le même programme que votre outil difftool et mergetool, différents programmes peuvent être définis pour les deux.
Réponses:
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.][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 utilisezgit diff
. par exempleSi 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
danscmd
, à 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: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.]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 exempleS'il y a un conflit de fusion, git affichera quelque chose comme ceci:
À 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:
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 lacmd
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:
ou:
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 deuxcmd
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 lacmd
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 exemplefile_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 ensuiteWas the merge successful? [y/n]
, si vous répondezn
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 lacmd
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 lescmd
lignes ne fonctionnent pas avec les noms de fichiers qui incluent des espaces, essayez d'échapper les guillemets. par exempleDans 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
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 lacmd
ligne de fusion correcte pour Windows. Étant donné que je suis un utilisateur Linux, je ne peux pas tester les différentescmd
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 oumeldc
, ou l'ajout du dossier du programme Meld à votrepath
.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 à ignorerAll whitespace
etLeading whitespace
, il n'y a pas deTrailing 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 .J'espère que cela aide tout le monde.
la source
[mergetool "meld"]
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
dans~/.gitconfig
, puis juste résoudre les conflits en rouge dans la casserole moyenne et économisez! Ce devrait être le paramètre par défaut.$LOCAL $MERGED $REMOTE
est le paramètre que j'utilise la plupart du temps, lorsqu'il n'y a que quelques conflits pour résoudre, c'est excellent et c'est aussi ma valeur par défaut.$LOCAL $BASE $REMOTE
prend tout son sens lorsqu'il y a beaucoup à faire et que vous savez exactement quelles sections de code proviennent de quel fichier; l'ancêtre de commit partagé peut être un excellent point de départ sans encombrement, parfois la mise en évidence du conflit se met en travers du chemin et une base plus propre est une bénédiction.=
comme ceci:cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output="$MERGED"
Alors que l'autre réponse est correcte, voici le moyen le plus rapide de continuer et de configurer Meld en tant qu'outil de comparaison visuelle. Copiez / collez simplement ceci:
Maintenant exécuté
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 appelé Compare It! (dernière mise à jour en 2010).
la source
git config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'
ligne là-dedans. Il s'agit de la "valeur par défaut", mais dès que vous configurez unmergetool
, ledifftool
commencera à utiliser la configuration de mergetool comme valeur par défaut si la configuration diff n'est pas trouvée. Étant donné que la fusion est généralement configurée pour passer trois fichiers pour une fusion à 3 voies, cela signifie que votre fenêtre demeld
diff aura soudainement trois volets, ce qui n'a aucun sens.Pour Windows . Exécutez ces commandes dans Git Bash:
(Mettez à jour le chemin d'accès au fichier pour Meld.exe si le vôtre est différent.)
Pour Linux . Exécutez ces commandes dans Git Bash:
Vous pouvez vérifier le chemin de Meld en utilisant cette commande:
la source
git config --global --get-regex diff*
?git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
:?Je préfère configurer meld en tant que commande distincte, comme ceci:
Cela le rend similaire au script git-meld.pl ici: https://github.com/wmanley/git-meld
Vous pouvez alors simplement exécuter
la source
--dir-diff
partie comme préférence personnelle.)Pour Windows 10, je devais mettre cela dans mon .gitconfig:
Tout ce que vous devez savoir est écrit dans cette super réponse de mattst plus haut.
PS: Pour une raison quelconque, cela ne fonctionnait qu'avec Meld 3.18.x, Meld 3.20.x me donne une erreur.
la source
Il s'agit d'une réponse ciblant principalement les développeurs utilisant Windows, car la syntaxe du chemin d'accès de l'outil diff diffère des autres plates-formes.
J'utilise Kdiff3 comme gerg mergetool, mais pour configurer git difftool en tant que Meld, j'ai d'abord installé la dernière version de Meld de Meldmerge.org, puis ajouté ce qui suit à mon .gitconfig global en utilisant:
Remarque, si vous souhaitez plutôt Sublime Text 3 au lieu du Vim par défaut comme core ditor, vous pouvez l'ajouter au fichier .gitconfig:
Ensuite, vous ajoutez Inn Meld comme l'outil de difftool
Notez la barre oblique dans le cmd ci-dessus, sous Windows, il est nécessaire.
Il est également possible de configurer un alias pour afficher le diff git actuel avec un --dir-diff option . Cela répertoriera les fichiers modifiés dans Meld, ce qui est pratique lorsque vous avez modifié plusieurs fichiers (un scénario très courant en effet).
L'alias ressemble à ceci dans le fichier .gitconfig, sous la section [alias] :
Pour afficher les modifications que j'ai apportées au code, je saisis simplement la commande suivante:
L'image suivante montre comment cette option --dir-diff peut afficher une liste des fichiers modifiés (exemple):
Ensuite, il est possible de cliquer sur chaque fichier et d'afficher les modifications à l'intérieur de Meld.
la source
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:
Cela semble étrange mais offre un flux de travail très pratique, utilisant trois onglets:
dans l'onglet 1, vous voyez (de gauche à droite) la modification que vous devez apporter dans l'onglet 2 pour résoudre le conflit de fusion.
dans le côté droit de l'onglet 2, vous appliquez la «modification que vous devez apporter» et copiez le contenu complet du fichier dans le presse-papiers (en utilisant ctrl-a et ctrl-c).
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 apportées dans cet onglet.
Remarques:
la source
$BASE
au lieu de$MERGED
pour commencer l'opération de fusion