在Windows上使用Git: 如何设置合并工具?

375

我曾经试用过msysGit和Cygwin上的Git。它们本身都工作得很好,而且都能完美运行gitk和git-gui。

现在问题来了,如何配置合并工具呢?(Vimdiff在Cygwin上可以工作,但最好有一些更加用户友好的选择,以满足我们班里喜爱Windows的同事。)


请参见https://dev59.com/m3NA5IYBdhLWcg3wrf83#867165。 - VonC
4
Git Extensions有一个Git用户界面,其中包含一个相当不错的并且适用于Windows用户的合并工具。 - KallDrexx
看起来你需要TortoiseGit? - Sergei Krivonos
19个回答

338

在Charles Bailey的答案基础上,这是我的git设置,我使用免费的跨平台3方合并工具p4merge进行测试,该工具可以在msys Git(Windows)安装中使用:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'

或者,在 Windows 的 cmd.exe shell 中,第二行变成:

git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""

相对于Charles Bailey的更改:

  • 添加到全局git配置中,即适用于所有git项目而不仅仅是当前项目
  • 自定义工具配置值驻留在“mergetool.[tool].cmd”中,而不是“merge.[tool].cmd”(傻我了,花了一个小时排查为什么git一直抱怨不存在的工具)
  • 对所有文件名添加双引号,以便合并工具仍然可以找到带有空格的文件(我在PowerShell的msys Git中测试过这一点)
  • 请注意,默认情况下,Perforce会将其安装目录添加到PATH中,因此无需在命令中指定完整路径以使用p4merge

下载:http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


编辑(2014年2月)

@Gregory Pakosz所指出的那样,最新版的msys git现在“本地”支持p4merge(在1.8.5.2.msysgit.0上进行了测试)。

您可以通过运行以下命令来显示支持的工具列表:

git mergetool --tool-help

您应该在 available 或者 valid 列表中看到 p4merge。如果没有,请更新您的 git。

如果 p4merge 被列为 available,那么它已经在您的 PATH 中了,您只需要设置 merge.tool

git config --global merge.tool p4merge
如果它被标记为valid,那么除了定义merge.tool以外,您还需要定义mergetool.p4merge.path
git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • 以上是在当前用户下安装p4merge的示例路径,而不是系统范围内安装(无需管理员权限或UAC提升)
  • 尽管~应该展开为当前用户的主目录(因此理论上路径应该是~/AppData/Local/Perforce/p4merge.exe),但这对我来说没有起作用
  • 更好的方法是利用环境变量(例如$LOCALAPPDATA/Perforce/p4merge.exe),但似乎git不会展开路径中的环境变量(如果您知道如何使其生效,请告诉我或更新此答案)

1
明白了 - 我觉得那些单引号看起来可疑。把它们加倍,就可以正常工作了。 - Danny Staple
13
由于Git已经开始尝试支持p4merge,所以设置"mergetool.p4merge.cmd"将不再起作用。现在需要直接使用"mergetool.p4merge.path"。请参考"libexec/git-core/git-mergetool--lib"。 - Gregory Pakosz
5
需要输入完整路径并转义双引号:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED" - Ludovic Kuty
22
这条命令 git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED' 在 Windows 7 上的机器上使用,可以帮助我完成操作。 - Dan P.
请注意,Windows上的Git并不真正有效,但是通过Cygwin安装的Git(例如通过apt-cyg安装)是有效的。 - Albert
显示剩余15条评论

89

由于Git已经开始支持p4merge,因此设置mergetool.p4merge.cmd将不再起作用,请参见libexec/git-core/git-mergetool--lib.so。我们只需要为git指定合并工具的路径,例如p4merge:

git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge

那么它就会工作。


1
也适用于Beyond Compare 3。只需使用BComp.exe的路径即可。谢谢! - Richard Anthony Freeman-Hein
4
我知道这是一个旧的帖子,但我无法让那个路径起作用。我有点困惑于如何转义路径,因为需要cmd/msys之间的互动... 编辑 切换到双引号解决了问题! - Rustavore
1
谢谢Gitninja!请注意,您可以在Git Bash中键入此内容,但如果您使用命令提示符,则必须将单引号更改为双引号。 - Hải Phong

63
我在WinXP上使用便携式Git(非常好用!)并需要解决分支冲突。我查看了所有的GUI,发现KDiff3 是最易于使用且透明的。
但我在这篇博客文章中找到了我需要让其在Windows下工作的指引,这些指引与此处列出的其他方法略有不同。基本上就是将以下内容添加到我的.gitconfig文件中:
[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false

现在工作得很好!


14
在我的Win7电脑上,我不得不使用 path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(注意双反斜杠) 。 - Someone Somewhere
我遇到了这样的错误:“diff工具meld不可用,路径为'D:\software\melddiff\Meld.exe'”。 - Allen Vork
你知道每个部分添加的顺序是否有区别吗?我的意思是,如果[merge]在[mergetool]之后会有什么不同吗? - Samuel

20

在Cygwin下,唯一有效的方法是执行以下操作:

git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'

此外,我想关闭difftool的提示消息:

git config --global difftool.prompt false

19

git mergetool 是完全可配置的,因此您几乎可以选择自己喜欢的工具。

完整的文档在此处:http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

简要地说,您可以通过设置用户配置变量 merge.tool 来设置默认合并工具。

如果合并工具是本地支持的工具之一,您只需要将 mergetool.<tool>.path 设置为工具的完整路径(将 <tool> 替换为您已配置的 merge.tool)。

否则,您可以将 mergetool.<tool>.cmd 设置为在运行时使用 shell 变量 $BASE,$LOCAL,$REMOTE,$MERGED 设置为适当的文件进行 eval 的一点 shell 代码。无论您是直接编辑配置文件还是使用 git config 命令设置变量,都必须小心转义。

像这样的内容可以给出您可以做什么的想法('mymerge' 是虚构的工具)。

git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'

一旦您设置了喜欢的合并工具,只需在需要解决冲突时运行git mergetool即可。

Perforce的p4merge工具是一个相当不错的独立合并工具。


11

适用于Windows 7的无与伦比

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"

3
我使用了这些命令,但我现在使用的是WinMerge而不是Beyond Compare。 - Brent Keller

6

我发现在Github Windows中有两种配置“SourceGear DiffMerge”作为diff和merge工具的方法。

在命令提示符窗口中执行以下命令将更新您的.gitconfig文件以配置GIT使用DiffMerge:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  \"$LOCAL\" \"$REMOTE\"'

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd  'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  -merge  -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'

[或者]

将以下内容添加到您的 .gitconfig 文件中。该文件应位于 C:\Users\UserName 的主目录中:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"

[merge]
    tool = diffmerge
[mergetool "diffmerge"]
    trustExitCode = true
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"

6

看起来新的 git 版本直接支持 p4merge,因此

git config --global merge.tool p4merge

如果p4merge.exe在您的路径中,

这应该是您需要的全部内容。无需设置cmd或路径。


这很关键。安装了p4merge并设置了mergetool.p4merge.path到确切的位置后,它仍然无法工作。将安装文件夹添加到路径中确实有效。 - RichardM

5

如已在这里(以及这里这里)回答,mergetool是用于配置此项的命令。对于一个漂亮的图形化界面,我推荐kdiff3(GPL)。


4

我在Windows 7上使用msysGit时,不得不去掉额外的引用,不确定原因。

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接