当前位置:  开发笔记 > 编程语言 > 正文

设置并使用Meld作为你的git difftool和mergetool

如何解决《设置并使用Meld作为你的gitdifftool和mergetool》经验,为你挑选了4个好方法。

虽然这个问题和答案中的大部分信息都可以在StackOverflow上获得,但它分布在许多页面以及其他错误或误导性的答案中.我花了一段时间拼凑出我想知道的一切.

有很多不同的程序可以用作你的git difftool和mergetool,对于哪个是最好的(意见,要求和操作系统明显不同)肯定没有共识.

Meld是一个流行的跨平台(UNIX/Linux,OSX,Windows)选择,如StackOverflow问题所示,什么是Git最好的可视化合并工具?其中提出梅尔德的答案的答案是其他任何工具的3倍以上.

我的答案将在下面回答以下两个问题:

如何设置和使用Meld作为我的git difftool?

如何设置和使用Meld作为我的git mergetool?

注意:没有必要使用与difftool和mergetool相同的程序,可以为两者设置不同的程序.



1> mattst..:

如何设置和使用Meld作为我的git difftool?

git difftool使用GUI diff程序(即Meld)显示diff,而不是在终端中显示diff输出.

虽然您可以使用命令行在命令行上设置GUI程序,-t / --tool=但在.gitconfig文件中配置它更有意义.[注意:请参阅底部有关转义引号和Windows路径的部分.

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

[注意:这些设置不会改变其行为git diff将继续照常运行.]

您使用git difftool的方式与您使用的方式完全相同git diff.例如

git difftool  file_name
git difftool  file_name
git difftool   file_name

如果配置正确,将打开Meld窗口,使用GUI界面显示diff.

Meld GUI窗口窗格的顺序可以按照$LOCAL$REMOTE中的顺序控制cmd,也就是说左窗格中显示哪个文件以及右窗格中显示哪个文件.如果你想要他们反过来只需像这样交换它们:

    cmd = meld "$REMOTE" "$LOCAL"

最后,该prompt = false行只是阻止git提示你是否要启动Meld,默认情况下git会发出提示.


如何设置和使用Meld作为我的git mergetool?

git mergetool允许您使用GUI合并程序(即Meld)来解决合并期间发生的合并冲突.

与difftool一样,您可以使用命令行设置GUI程序,-t / --tool=但是,和以前一样,在.gitconfig文件中配置它更有意义.[注意:请参阅底部有关转义引号和Windows路径的部分.

# 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"

您不用于git mergetool执行实际合并.在使用之前,git mergetool您可以使用git以通常的方式执行合并.例如

git checkout master
git merge branch_name

如果存在合并冲突,git将显示如下内容:

$ 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.

此时file_name将包含具有合并冲突信息的部分合并文件(即包含其中所有>>>>>>><<<<<<<条目的文件).

现在可以使用Mergetool来解决合并冲突.您可以通过以下方式轻松启动它

git mergetool

如果配置正确,Meld窗口将打开,显示3个文件.每个文件都将包含在其GUI界面的单独窗格中.

.gitconfig上面的示例条目中,建议使用2行作为[mergetool "meld"] cmd行.实际上,高级用户可以通过各种方式配置cmd线路,但这超出了本答案的范围.

这个答案有两条备用cmd线路,它们之间可以满足大多数用户的需求,对于希望将工具提升到更高级别的高级用户来说,这将是一个很好的起点.

首先,参数意味着什么:

$LOCAL 是当前分支中的文件(例如master).

$REMOTE 是要合并的分支中的文件(例如branch_name).

$MERGED 是部分合并的文件,其中包含合并冲突信息.

$BASE在共享提交的祖先$LOCAL$REMOTE,这是说文件,因为它是包含该分支时,$REMOTE最初创建.

我建议你使用:

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

要么:

[mergetool "meld"]
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
    # See 'Note On Output File' which explains --output "$MERGED".

选择是使用$MERGED还是$BASE$LOCAL和之间使用$REMOTE.

无论哪种方式合并将显示3个面板与$LOCAL$REMOTE在左,右窗格,要么$MERGED$BASE在中间窗格中.

在两种情况下,中间窗格是您应编辑以解决合并冲突的文件.区别在于你喜欢的起始编辑位置; $MERGED对于其中包含与合并冲突信息或部分地合并的文件的文件$BASE为的共享提交祖先$LOCAL$REMOTE.[由于这两cmd行都很有用,我将它们保存在我的.gitconfig文件中.大多数时候我使用该$MERGED行并且该$BASE行已被注释掉,但如果我想使用该$BASE行,则可以交换注释.]

注意在输出文件:别担心,--output "$MERGED"在使用cmd无论$MERGED$BASE先前在使用的cmd线.该--output选项只是告诉Meld git想要保存冲突解决文件的文件名.Meld将保存您在该文件中的冲突编辑,无论您是使用$MERGED还是$BASE作为起始编辑点.

编辑中间窗格以解决合并冲突后,只需保存文件并关闭Meld窗口.Git将自动执行更新,当前分支(例如master)中的文件现在将包含您在中间窗格中最终得到的内容.

git将通过附加.orig到原始文件名来备份部分合并的文件,并在其中包含合并冲突信息.例如file_name.orig.在检查您对合并并运行您可能希望执行的任何测试感到满意后,.orig可以删除该文件.

此时,您现在可以执行提交以提交更改.

如果,当您在Meld中编辑合并冲突时,您希望放弃使用Meld,然后退出Meld而不保存中间窗格中的合并解析文件.git将响应该消息file_name seems unchanged,然后询问Was the merge successful? [y/n],如果您回答,n则合并冲突解决方案将被中止,文件将保持不变.请注意,如果您在任何时候将文件保存在Meld中,那么您将不会从git收到警告和提示.[当然你可以删除文件并将其替换为.origgit为你制作的备份文件.]

如果您有多个包含合并冲突的文件,那么git将逐个打开一个新的Meld窗口,直到它们全部完成.它们不会同时打开,但是当你完成一个冲突的编辑,然后关闭Meld时,git将打开下一个,依此类推,直到所有的合并冲突都解决了.

git mergetool实际项目中使用它之前,创建一个虚拟项目以测试其使用是明智的.请确保在测试中使用包含空格的文件名,以防操作系统要求您跳过cmd行中的引号,请参阅下文.


转义引号字符

某些操作系统可能需要在cmd转义中使用引号.经验不足的用户应该记住,配置命令行应该使用包含空格的文件名进行测试,如果这些cmd行不能与包含空格的文件名一起使用,那么请尝试转义引号.例如

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

在某些情况下,可能需要更复杂的报价转义.下面的Windows路径链接的第一个包含三个转义每个引用的示例.这是一个镗孔,但有时是必要的.例如

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

Windows路径

Windows用户可能需要在Meld cmd行中添加额外的配置.他们可能需要使用完整路径meldc,该路径旨在从命令行在Windows上调用,或者他们可能需要或想要使用包装器.他们应该阅读下面链接的StackOverflow页面,这些页面是关于cmd为Windows 设置正确的Meld 行.由于我是一名Linux用户,我无法测试各种Windows cmd系列,除了建议使用我的示例meldc添加Meld 的完整路径或者将Meld程序文件夹添加到您的主题之外,没有关于该主题的更多信息path.

Windows上的Git Diff和Meld

如何将Meld设置为git mergetool

Git与Windows上的Meld合并工具

使用Meld忽略尾随空格

Meld有许多可以在GUI中配置的首选项.

在首Text Filters选项选项卡中,有几个有用的过滤器可以在执行差异时忽略注释等内容.虽然有过滤器忽略All whitespaceLeading whitespace,也没有忽略Trailing whitespace过滤器(这已被提议作为MELD邮件列表的附加,但不提供我的版本).

忽略尾随空格通常非常有用,尤其是在协作时,可以使用Meld首Text Filters选项选项卡中的简单正则表达式轻松手动添加.

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

我希望这有助于每个人.


这比[Git Configuration - git mergetool](https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration)的解释要好得多.非常感谢您解释$ MERGED和$ BASE之间的区别.救我脱离疯狂!
**注意:**如果您使用OSX并通过自制软件安装meld,则输出参数将需要`=`,如下所示:`cmd = meld"$ LOCAL""$ MERGED""$ REMOTE"--output =" $合并的"`
谢谢,使用起来非常容易。解决中间锅中红色突出显示的冲突并保存!它应该是默认设置。

2> Dan Dascales..:

虽然另一个答案是正确的,但这是继续将Meld配置为视觉差异工具的最快方法.只需复制/粘贴这个:

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

现在git difftool在目录中运行,将为每个不同的文件启动Meld.

旁注:Meld在比较CSV文件时出奇的慢,而且我发现没有Linux差异工具比2009年称为CompareIt!的Windows工具更快.


你可能想要一个`git config --global difftool.meld.cmd'meld"$ LOCAL""$ REMOTE"'`行.这是"默认",但是一旦配置`mergetool`,如果找不到diff配置,`difftool`将开始使用mergetool配置作为默认配置.由于merge通常被配置为传递三个文件以进行3向合并,这意味着你的`meld` _diff_窗口将突然有三个窗格,这没有任何意义.

3> MarredCheese..:

对于Windows.在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

(如果您的Meld.exe不同,请更新Meld.exe的文件路径.)

对于Linux.在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

您可以使用以下命令验证Meld的路径:

which meld


这是正确的答案,而且最简单.

4> Ulf Adams..:

我更喜欢将meld设置为单独的命令,如下所示:

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

这使得它类似于git-meld.pl脚本:https: //github.com/wmanley/git-meld

然后你就可以跑了

git meld

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有