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

我在Cygwin上尝试了msysGit和Git。两者本身都工作得很好,并且都能完美地运行gitk和git-gui。

现在我该如何配置合并工具呢?(Vimdiff在Cygwin上工作,但我更希望能有一个对我们一些喜欢windows的同事更友好的东西。)

282286 次浏览

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位,并将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工具是一个非常好的独立合并工具。

正如在这里已经回答的(以及在这里在这里), mergetool是配置这个的命令。对于一个漂亮的图形前端,我推荐kdiff3 (GPL)。

为了跟进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\""

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

  • 添加到全局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

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

如果p4merge被列出为可用,它在你的路径中,你只需要设置merge.tool:

git config --global merge.tool p4merge

如果它被列出为有效的,你必须在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似乎没有展开路径的环境变量(如果你知道如何让这个工作,请告诉我或更新这个答案)

我不得不在windows 7上使用msysGit删除额外的引用,不知道为什么。

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

如果你通过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`'

在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

呸,这个最后为我工作(Windows 7 + Cygwin + TortoiseMerge):

在. /配置:

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

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

我在WinXP上使用Portable Git(工作很好!),需要解决分支中出现的冲突。在我检查的所有gui中,KDiff3被证明是使用起来最透明的。

但是我在这篇博文中找到了我需要在Windows中工作的指令,这些指令与这里列出的其他方法略有不同。它基本上相当于将这些行添加到我的.gitconfig文件中:

[merge]
tool = kdiff3


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

现在工作得很好!

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

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

那么它就会起作用。

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

. info

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

#!/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的结果,并在正确的位置创建一个新的临时文件。

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

git config --global merge.tool p4merge

如果p4merge.exe在你的路径上,这应该是你所需要的。不需要设置cmd或路径。

在Windows 7上无以伦比

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

你可能也想添加这些选项:

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

另外,我也不知道为什么,但是米兰·加迪安的回答把我搞砸了。

如果有人想在TortoiseGit上使用gvim作为他们的差异工具,那么你需要在文本输入中输入外部差异工具的路径:

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
要设置p4merge,使用chocoley在窗口上安装merge和diff,请看这里: https://gist.github.com/CamW/88e95ea8d9f0786d746a < / p >

IntelliJ IDEA (Community Edition) 3-way git合并工具配置在Windows环境(~/.gitconfig)

Cygwin

[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

Msys

[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 "$@"
如果你从SourceTree打开p4merge有问题,请在MyRepo下查找名为配置的本地配置文件。Git并删除任何合并配置。 在我的情况下,它试图打开我刚刚卸载的Meld

我找到了两种方法来配置“SourceGear DiffMerge”作为difftool和mergetool在github Windows。

命令提示符窗口中的以下命令将更新你的.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\"

对于kdiff3,您可以使用:

git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global mergetool.kdiff3.trustExitCode false


git config --global diff.guitool kdiff3
git config --global difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global difftool.kdiff3.trustExitCode false