Windows上的Git:你如何设置合并工具?

Git on Windows: How do you set up a mergetool?

我在Cygwin上试过msysgit和git。这两个系统本身都可以正常工作,并且都可以完美地运行GitK和GitGUI。

现在我该如何配置合并工具呢?(VimDiff在Cygwin上工作,但最好是我想要一些对我们那些喜欢Windows的同事更友好的东西。)


为了跟进Charles Bailey的答案,下面是我的Git设置,它使用p4merge(免费跨平台3路合并工具);在MSys Git(Windows)安装上测试:

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

或者,从windows cmd.exe shell中,第二行变为:

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

变化(相对于查尔斯·贝利):

  • 添加到全局Git配置中,即对所有Git项目有效,而不仅仅是当前项目。
  • 自定义工具配置值位于"merge tool.[tool].cmd"中,而不是"merge.[tool].cmd"(我很傻,花了一个小时的时间来解决为什么git总是抱怨不存在的工具)
  • 为所有文件名添加了双引号,以便合并工具仍然可以找到带有空格的文件(我在PowerShell的msys-git中对此进行了测试)
  • 注意,默认情况下,perfice会将其安装目录添加到path,因此不需要在命令中指定p4merge的完整路径。

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

编辑(2014年2月)

正如@gregory pakosz指出的,最新的msys-git现在"本机"支持p4merge(在1.8.5.2.msysgit.0上测试)。

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

1
git mergetool --tool-help

您应该在可用或有效的列表中看到p4merge。如果没有,请更新您的Git。

如果p4merge列为可用,则它在您的路径中,您只需设置merge.tool:

1
git config --global merge.tool p4merge

如果它被列为有效,除了merge.tool之外,还必须定义mergetool.p4merge.path:

1
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似乎没有为路径扩展环境变量(如果你知道如何实现这一点,请告诉我或更新这个答案)。


设置mergetool.p4merge.cmd将不再有效,因为git已开始尝试支持p4merge,请参阅libexec/git core/git-mergetool--lib。因此我们只需要为git指定mergetool路径,例如p4merge:

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

然后它就可以工作了。


我在WinXP上使用便携式Git(真是太好了!)需要解决分支中出现的冲突。在我检查的所有GUI中,kdiff3被证明是最透明的。

但是我在这篇博文中找到了让它在Windows中工作所需的说明,这些说明与这里列出的其他方法稍有不同。基本上等于将这些行添加到我的.gitconfig文件中:

1
2
3
4
5
6
7
[merge]
    tool = kdiff3

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

现在工作得很好!


在塞格温的统治下,唯一对我有用的就是:

1
2
3
4
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的提示消息:

1
git config --global difftool.prompt false

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

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

简而言之,您可以通过设置用户配置变量merge.tool来设置默认的合并工具。

如果合并工具是它本身支持的工具之一,您只需将mergetool..path设置为该工具的完整路径(用您配置的merge.tool替换

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

像这样的东西应该能给你带来你所能做的(mymerge是一个虚构的工具)。

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

一旦你设置了你最喜欢的合并工具,只要你有冲突需要解决,运行git mergetool就可以了。

Perforce的P4Merge工具是一个非常好的独立合并工具。


用于Windows 7上的超越比较

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


新的Git版本似乎直接支持p4merge,所以

1
git config --global merge.tool p4merge

如果p4merge.exe在您的路径上,则应该是您所需要的全部。不需要设置命令或路径。


正如这里(这里和这里)已经回答的,mergetool是配置这个的命令。对于一个不错的图形前端,我推荐kdiff3(gpl)。


我不得不放弃在Windows7上使用msysgit的额外报价,不知道为什么。

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


啊,这最终对我有效(Windows7+Cygwin+TortoiseMerge):

在.git/config中:

1
cmd = TortoiseMerge.exe /base:$(cygpath -d "$BASE") /theirs:$(cygpath -d "$REMOTE") /mine:$(cygpath -d "$LOCAL") /merged:$(cygpath -d "$MERGED")

感谢以前的海报提示使用cygpath!


如果您通过cygwin执行此操作,则可能需要使用cygpath:

1
2
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'


我使用一个名为winmerge的应用程序(http://winmerge.org/)手册中的信息(http://manual.winmerge.org/commandline.html)

这是我通过.gitconfigmergetool指令使用的bash脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file

file1=$1
if ["$file1" == '/dev/null' ] || ["$file1" == '\\.
ul' ] || [ ! -e"$file1" ]
    then
       file1="/tmp/gitnull"
       `echo"">$file1`
fi
file2=$2
if ["$file2" == '/dev/null' ] || ["$file2" == '\\.
ul' ] || [ ! -e"$file2" ]
    then
       file2="/tmp/gitnull"
       `echo"">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl"Base" -dr"Mine""$file1""$file2"

基本上,bash负责空文件中diff的结果,并在正确的位置创建新的temp文件。


我发现了两种在GitHub窗口中将"sourceGear diffmerge"配置为difftool和mergetool的方法。

命令提示窗口中的以下命令将更新.gitconfig以配置git使用diffmerge:

1
2
3
4
5
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:usersusername:

1
2
3
4
5
6
7
8
9
10
[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"


如果有人想在TortoisGit上使用gvim作为其diff工具,则需要在文本输入中输入外部diff工具的路径:

1
path\to\gvim.exe -f -d -c"wincmd R" -c"wincmd R" -c"wincmd h" -c"wincmd J"


您也可以添加这些选项:

1
2
3
4
git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false

另外,我也不知道为什么,米兰加德安的回答中的引用和删减让我搞砸了。


对于Intellij IDEA(社区版)Windows环境中的3路Git Mergetool配置(~/.gitconfig)

赛文

1
2
3
4
[mergetool"ideamerge"]
     cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
     tool = ideamerge

米斯

1
2
3
4
[mergetool"ideamerge"]
cmd ="/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
 tool = ideamerge

~/winpath.sh用于在msys上将路径转换为windows,取自stackoverflow上的msys路径转换问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#! /bin/sh                                                              

function wpath {                                                        
    if [ -z"$1" ]; then                                                
        echo"$@"                                                        
    else                                                                
        if [ -f"$1" ]; then                                            
            local dir=$(dirname"$1")                                    
            local fn=$(basename"$1")                                    
            echo"$(cd"$dir"; echo"$(pwd -W)/$fn")" | sed 's|/|\\|g';  
        else                                                            
            if [ -d"$1" ]; then                                        
                echo"$(cd"$1"; pwd -W)" | sed 's|/|\\|g';              
            else                                                        
                echo"$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';          
            fi                                                          
        fi                                                              
    fi                                                                  
}                                                                        

wpath"$@"


要设置p4merge,在Windows上使用巧克力安装合并和差异,请查看以下内容:https://gist.github.com/camw/88e95ea8d9f0786d746a


如果从sourcetree打开p4merge时遇到问题,请在myrepo.git下查找名为config的本地配置文件,然后删除任何合并配置。在我的例子中,它试图打开我刚刚卸载的meld