最近由于需要修改一份文档提交到Git服务器上,又不想为了一份文档去安装TortoiseGit客户端,所以就尝试着在Windows上使用Git命令行来操作。
虽然是只需要修改一份文档,但是文档的修改内容还是不少的,这样就导致提交之前查看改动内容(git diff "filename"
)的时候,很难通过命令行有个明确的对比。
由于之前在使用其他代码管理服务器的时候,都可以配合Beyond Compare(下文简称BC)来使用,于是便想着是不是git-diff也可以指定用BC来查看呢?
本着“内事不决问百度”的想法,先上百度搜索一下。果然很快就找到了一篇文章:Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具 。而且看起来很简单,直接执行git difftool
命令就可以了。果断照着执行以下试试:
F:\GitHub\markdown [master ≡≡ +0 ~1 -0 !]> git difftool
/mingw32/libexec/git-core/git-mergetool--lib: line 124: c:/program files (x86)/microsoft visual studio 12.0/common7/ide/devenv.exe: No such file or directory
fatal: external diff died, stopping at filename.txt
奇怪了,为什么我的不行呢?而且好像从错误信息看起来,根本就没有用到BC啊。
有错继续问度娘吧!在大概看了一些查询结果之后发现,有一种修改配置文件的方法好像很靠谱。(git difftool 第三方工具配置)
然后照着里面的内容,在配置文件(~/.git/config)中添加了下述内容:
[difftool “bc3”]
cmd = \”C:/Program Files (x86)/Beyond Compare 3/BComp.exe\” \”$LOCAL\” \”$REMOTE\”
当然,添加配置文件的过程也不是那么的简单,这都要归功于万恶的windows、目录名中的空格以及引号需要转义等。在无数次的修改和无数次看到下面的错误信息之后,配置文件中添加的内容总算没错了。
F:\GitHub\markdown [master ≡≡ +0 ~1 -0 !]> git difftool
fatal: bad config line 15 in file .git/config
fatal: bad config line 15 in file .git/config
config --bool --get difftool.trustExitCode: command returned error: 128
但是,这时候有一个更尴尬的问题出现了——执行git difftool
命令的时候再次提示最开始的错误。
不是已经在配置文件里面配置过了difftool吗?为什么还是没有调用BC呢?无奈之下,找到了git difftool的官方文档。其中有一段内容引起了我的注意。
Use the diff tool specified by . Valid values include emerge, kompare, meld, and vimdiff. Run git difftool –tool-help for the list of valid settings.
If a diff tool is not specified, git difftool will use the configuration variable diff.tool. If the configuration variable diff.tool is not set, git difftool will pick a suitable default.
果断在本地执行git config --list
查看所有的配置。
# 以下列出来的只是list的部分内容
diff.tool=vs2013
difftool.prompt=false
difftool.bc4.cmd="c:/program files (x86)/beyond compare 3/bcomp.exe" "$LOCAL" "$REMOTE"
difftool.vs2012.cmd="c:/program files (x86)/microsoft visual studio 11.0/common7/ide/devenv.exe" '//diff' "$LOCAL" "$REMOTE"
difftool.vs2013.cmd="c:/program files (x86)/microsoft visual studio 12.0/common7/ide/devenv.exe" '//diff' "$LOCAL" "$REMOTE"
merge.tool=bc3
mergetool.prompt=false
mergetool.keepbackup=false
mergetool.bc3.cmd="c:/program files (x86)/beyond compare 3/bcomp.exe" "$LOCAL" "$REMOTE" "$BASE" "$MERGED"
mergetool.bc3.trustexitcode=true
difftool.bc3.cmd="C:/Program Files (x86)/Beyond Compare 3/BComp.exe" "$LOCAL" "$REMOTE"
第一眼很明显就可以看到 difftool.bc3.cmd="C:/Program Files (x86)/Beyond Compare 3/BComp.exe" "$LOCAL" "$REMOTE"
(毕竟是命令行里面的最后一行)。这不正说明了刚刚的配置没问题吗?但是在仔细看看,就可以发现 diff.tool=vs2013
,再加上 difftool.vs2013.cmd
的配置,也就不难理解为什么最开始执行difftool时候返回的错误信息回合VS有关系了!
既然看到了问题,那么就好解决了!由于默认的配置里面已经指定了 difftool.bc4.cmd
,上面在配置文件中新增的 [difftool "bc3"]
也就可以去掉了,直接加上下面的内容:
[diff]
tool = bc4
最后,再执行一次 git difftool
,终于圆满成功!