2010-09-14 22 views
163

我将git diff设置为包装到vimdiff中,使用“Git Diff with Vimdiff”作为指南,并且它的工作方式与预期一致,除非有许多文件发生更改。使用vimdiff查看所有`git diffs'

当有变化在于多个文件和我跑git diff,它打开第一个文件,并退出方面Vimdiff的第一个实例后,我出现以下消息:

external diff died, stopping at filename 

这是一个完全不同于我习惯的行为。我在过去与SVN有类似的设置,并且在针对多个文件进行比较时,我会查看第一个文件,然后使用:wq进行写入和退出,然后打开具有差异的下一个文件。

这不是Git的情况。我尝试了:n[ext],但是这样做并不会将原始文件填充到左侧窗口,以便可以根据修改后的版本进行区分。

回答

260
git config --global diff.tool vimdiff 
git config --global difftool.prompt false 
git config --global alias.d difftool 

键入git d产生预期的行为,在VIM周期打字:wq在变更下一个文件。

+16

只是我的两分钱:我有'df'别名'diff'和'dt'别名为'difftool'。此外,在Vim中键入':qa'将循环到下一个变更集而不保存任何内容。 – jonyamo 2012-11-26 21:56:22

+2

这个解决方案非常好,除了保存更改时,您必须键入“:w!”而不是:w – Asenar 2013-09-26 09:30:50

+1

@jonyamo设置别名应始终基于我们使用某些命令的频率。我经常使用'git diff'而不是'git difftool'。所以我把'd'改为'diff'和''dt'改为'difftool'。可用性比用模式创建别名更重要。 – 2014-01-08 05:14:05

86

你可以试试git difftool,它被设计来做这个东西。

首先,你需要配置比较工具方面Vimdiff

git config diff.tool vimdiff 

然后,当你想Diff时,只需使用git difftool代替git diff。它会像你期望的那样工作。

+1

几乎在那里!修改了一下,这正是我正在寻找的。 +1虽然! – chuckg 2010-09-15 00:27:57

+1

最近更新了vimdiff mergetool:http://git.kernel.org/?p=git​​/git.git;a=commit;h=829ef383a2b03a614d7d23e575270f2b10a805c1(还有一些其他提交,但这是最大的提交)。不知道下一次维护版本的时间,但如果你愿意从git.git构建,升级应该是你的! – Cascabel 2010-10-29 05:59:52

15
Git accepts kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, 
and opendiff as valid diff tools. You can also set up a custom tool. 

git config --global diff.tool vimdiff 
git config --global diff.tool kdiff3 
git config --global diff.tool meld 
git config --global diff.tool xxdiff 
git config --global diff.tool emerge 
git config --global diff.tool gvimdiff 
git config --global diff.tool ecmerge 
+0

我知道我的回答中有什么问题 – 2013-08-16 23:58:05

+3

您为mergetool回答,而不是difftool。但它仍然是一个有用的答案。 +1。 – dotancohen 2013-08-21 12:41:33

+0

@dotancohen真的谢谢我从来没有注意到,愚蠢的错误现在我可以编辑我的答案。 – 2013-08-21 20:17:18