Windows上的Git:如何设置mergetool?


346

我已经在Cygwin上尝试了msysGit和Git。两者都可以正常工作,并且可以完美运行gitk和git-gui。

现在我该如何配置mergetool?(Vimdiff在Cygwin上工作,但最好是我希望一些喜欢Windows的同事对用户更友好。)



4
Git Extensions具有一个git UI,它具有非常好的功能,并且Windows用户友好的合并工具。
2011年

看起来您需要TortoiseGit吗?
Sergei

Answers:


304

为了跟踪Charles Bailey的答案,这是我的git设置,它使用p4merge(免费的跨平台3way合并工具);在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 config,即对所有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

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

如果p4merge被列为可用,则它在您的PATH中,您只需设置merge.tool即可

git config --global merge.tool p4merge

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

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似乎没有为路径扩展环境变量(如果您知道如何使之工作,请让我知道或更新此答案)

嗯-试试看-第一个配置工作正常,下一个仅显示git config的帮助文本。不知道为什么。
Danny Staple 2010年

1
知道了-这些单引号在我看来很可疑。只需将其加倍即可使用。
Danny Staple 2010年

13
mergetool.p4merge.cmd自Git开始尝试支持p4merge以来,该设置将不再起作用,请参见libexec/git-core/git-mergetool--lib。相反,它直接使用mergetool.p4merge.path
Gregory Pakosz 2010年

5
必须全力以赴并避免双引号:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
Ludovic Kuty 2012年

21
这对我git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'
Dan P.

88

自从Git开始尝试支持p4merge以来,设置mergetool.p4merge.cmd不再起作用,请参见libexec / git-core / git-mergetool--lib.so我们只需要为git指定mergetool路径,例如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的路径即可。谢谢!
理查德·安东尼·海因

4
我意识到这是一个旧线程,但是我无法走这条路。我有点困惑的路径应该如何进行转义给出的相互作用CMD / MSYS ... 编辑切换到双引号定了!
Rustavore

谢谢Gitninja!请注意,您可以键入这个混帐到猛砸,但是如果你使用的命令提示符必须更改单引号双引号
海防

61

我在WinXP上使用Portable Git(请款待!),需要解决分支中出现的冲突。在我检查过的所有GUI中,KDiff3被证明是使用最透明的。

但是我在此博客文章中找到了使它在Windows中运行所需的说明,这些说明与此处列出的其他方法稍有不同。从根本上说,这相当于将这些行添加到我的.gitconfig文件中:

[merge]
    tool = kdiff3

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

现在工作很好!


13
在Win7 PC上,我不得不使用path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(注意双反斜杠)
某处某人2013年

我收到了这样的错误“差异工具融合不可用'D:\ software \ melddiff \ Meld.exe'”
艾伦·沃克

您知道每个部分的添加顺序是否有差异。我的意思是,如果[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

16

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

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

简而言之,您可以通过设置用户config变量来设置默认的mergetool merge.tool

如果合并工具是它本机支持的工具之一,则只需将其设置mergetool.<tool>.path为该工具的完整路径(替换<tool>为您配置的内容)merge.tool

否则,您可以设置一些mergetool.<tool>.cmd要在运行时评估的shell,并将shell变量$BASE, $LOCAL, $REMOTE, $MERGED设置为适当的文件。转义是直接编辑配置文件还是使用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工具是一个非常好的独立合并工具。


8

在Windows 7上无法比拟

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

2
我使用了这些命令,但我使用的是WinMerge而不是Beyond Compare。
布伦特·凯勒2014年

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'

3

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

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`'

3

ah,这终于对我有用(Windows 7 + Cygwin + TortoiseMerge):

在.git / config中:

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

感谢以前的海报来使用cygpath的技巧!


3

我从他们的手册(http://manual.winmerge.org/CommandLine.html)使用名为WinMerge(http://winmerge.org/)信息的应用程序

这是我mergetool通过指令使用的bash脚本.gitconfig

#!/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" == '\\.\nul' ] || [ ! -e "$file1" ]
    then 
       file1="/tmp/gitnull"
       `echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -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的结果,并在正确的位置创建一个新的临时文件。


3

我发现了两种在github Windows中将“ SourceGear DiffMerge ” 配置为difftool和mergetool的方法。

“命令提示符”窗口中的以下命令将更新您的.gitconfig,以使用DiffMerge配置GIT:

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

1

您可能也想添加以下选项:

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

另外,我不知道为什么,但是米兰·加迪安(Milan Gardian)的答案中的引号和斜线为我搞砸了。


1

如果有人想将gvim用作TortoiseGit上的差异工具,则需要在文本输入中输入外部差异工具的路径:

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

1

对于Windows环境中的IntelliJ IDEA(社区版)3路git mergetool配置(~/.gitconfig

西格温

[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

微系统

[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路径转换问题

#! /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 "$@" 

0

要设置在Windows上使用Chocolatey进行合并和比较安装的p4merge,请在此处查看:https ://gist.github.com/CamW/88e95ea8d9f0786d746a


0

如果在从SourceTree打开p4merge时遇到问题,请在MyRepo.git下查找名为config的本地配置文件,然后删除所有合并配置。就我而言,它试图打开我刚刚卸载的Meld

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.