虽然这个问题和答案中的大部分信息都可以在StackOverflow上获得,但它分布在许多页面以及其他错误或误导性的答案中.我花了一段时间拼凑出我想知道的一切.
有很多不同的程序可以用作你的git difftool和mergetool,对于哪个是最好的(意见,要求和操作系统明显不同)肯定没有共识.
Meld是一个流行的跨平台(UNIX/Linux,OSX,Windows)选择,如StackOverflow问题所示,什么是Git最好的可视化合并工具?其中提出梅尔德的答案的答案是其他任何工具的3倍以上.
我的答案将在下面回答以下两个问题:
如何设置和使用Meld作为我的git difftool?
如何设置和使用Meld作为我的git mergetool?
注意:没有必要使用与difftool和mergetool相同的程序,可以为两者设置不同的程序.
git difftool使用GUI diff程序(即Meld)显示diff,而不是在终端中显示diff输出.
虽然您可以使用命令行在命令行上设置GUI程序,-t
但在.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 difftoolfile_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会发出提示.
git mergetool允许您使用GUI合并程序(即Meld)来解决合并期间发生的合并冲突.
与difftool一样,您可以使用命令行设置GUI程序,-t
但是,和以前一样,在.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收到警告和提示.[当然你可以删除文件并将其替换为.orig
git为你制作的备份文件.]
如果您有多个包含合并冲突的文件,那么git将逐个打开一个新的Meld窗口,直到它们全部完成.它们不会同时打开,但是当你完成一个冲突的编辑,然后关闭Meld时,git将打开下一个,依此类推,直到所有的合并冲突都解决了.
git mergetool
在实际项目中使用它之前,创建一个虚拟项目以测试其使用是明智的.请确保在测试中使用包含空格的文件名,以防操作系统要求您跳过cmd
行中的引号,请参阅下文.
某些操作系统可能需要在cmd
转义中使用引号.经验不足的用户应该记住,配置命令行应该使用包含空格的文件名进行测试,如果这些cmd
行不能与包含空格的文件名一起使用,那么请尝试转义引号.例如
cmd = meld \"$LOCAL\" \"$REMOTE\"
在某些情况下,可能需要更复杂的报价转义.下面的Windows路径链接的第一个包含三个转义每个引用的示例.这是一个镗孔,但有时是必要的.例如
cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"
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有许多可以在GUI中配置的首选项.
在首Text Filters
选项选项卡中,有几个有用的过滤器可以在执行差异时忽略注释等内容.虽然有过滤器忽略All whitespace
和Leading 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]*$
我希望这有助于每个人.
虽然另一个答案是正确的,但这是继续将Meld配置为视觉差异工具的最快方法.只需复制/粘贴这个:
git config --global diff.tool meld git config --global difftool.prompt false
现在git difftool
在目录中运行,将为每个不同的文件启动Meld.
旁注:Meld在比较CSV文件时出奇的慢,而且我发现没有Linux差异工具比2009年称为CompareIt!的Windows工具更快.
对于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
我更喜欢将meld设置为单独的命令,如下所示:
git config --global alias.meld '!git difftool -t meld --dir-diff'
这使得它类似于git-meld.pl脚本:https: //github.com/wmanley/git-meld
然后你就可以跑了
git meld