使用vimdiff查看所有的git差异

254

我根据Git Diff with Vimdiff的指导,将git diff设置为使用vimdiff来包装。它的效果很好,除非有多个有更改的文件。

当有多个更改的文件时,运行git diff后,它会打开第一个文件,退出第一次vimdiff后,会出现以下消息:

external diff died, stopping at filename

这是我不习惯的完全不同的行为。过去我用SVN设置了类似的环境,当我需要对比多个文件时,我会查看第一个文件,然后使用:wq 写入并退出,接着下一个有差异的文件就会打开。

但是 Git 不是这样的。我尝试了 :n[ext],但这样做并没有在左侧窗口中显示原始文件,以便与修改后的版本进行对比。

5个回答

400
git config --global diff.tool vimdiff
git config --global difftool.prompt false

键入git difftool会产生预期的行为。

导航命令,

  • :qa在vim中循环到更改集中的下一个文件而不保存任何内容。

别名(示例)

git config --global alias.d difftool

.. 可以让你输入 git d 调用 vimdiff。

高级用法,

  • 默认情况下,git 使用 -R 选项调用 vimdiff。您可以使用 git config --global difftool.vimdiff.cmd 'vimdiff "$LOCAL" "$REMOTE"' 来覆盖它。这将在可写模式下打开 vimdiff,允许在比较时进行编辑。
  • :wq 在 vim 中保存更改并循环到变更集中的下一个文件。

24
这是需要翻译的内容:Just my two cents: I have df aliased to diff and dt aliased to difftool. Also, typing :qa in Vim will cycle to the next changeset without saving anything。我的建议是:我将 df 别名设置为 diff,将 dt 别名设置为 difftool。此外,在 Vim 中键入 :qa 将不保存任何内容并循环到下一个变更集。 - J.C. Yamokoski
2
这个解决方案很棒,除了在保存更改时需要键入":w!"而不是:w。 - Asenar
2
@jonyamo 设置别名应该基于我们使用某些命令的频率。我经常使用 git diff 而不是 git difftool。因此,我将 d 别名设置为 'diff',将 'dt' 别名设置为 difftool。可用性比按模式创建别名更重要。 - Mohammed H
9
除了保存更改时需要键入 :w! 而不是 :w 之外,这个解决方案非常棒。这是因为 git 使用 -R 选项调用了 vimdiff。您可以使用 git config --global difftool.vimdiff.cmd 'vimdiff "$LOCAL" "$REMOTE"' 来覆盖它。这将在可写模式下打开 vimdiff。 - wisbucky
2
将一些被点赞的评论移动到答案中。谢谢。 - Shyam Habarakada
显示剩余4条评论

111
你可以尝试使用git difftool,它是专门设计用来做这些事情的。
首先,你需要将diff工具配置为vimdiff。
git config diff.tool vimdiff

接下来,当你想要进行差异比较时,只需使用git difftool而不是git diff。它会按照你的期望工作。


1
快了!稍微修改一下它就是我要找的了。不过还是给个“+1”吧! - chuckg
1
vimdiff合并工具最近已更新:http://git.kernel.org/?p=git/git.git;a=commit;h=829ef383a2b03a614d7d23e575270f2b10a805c1(还有其他几个提交,但这是最大的一个)。不确定下一个维护版本将何时发布,但如果您愿意从git.git构建,升级就属于您! - Cascabel

24
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

3
你回答了合并工具而不是差异比较工具,但这仍然是一个有帮助的回答。+1。 - dotancohen
@dotancohen 非常感谢,我从来没有注意到这个愚蠢的错误,现在我可以编辑我的回答了。 - Nanhe Kumar
1
@NanheKumar,@dotancohen,在上面的答案中将“merge”替换为“diff”即可解决问题,即git config --global diff.tool vimdiff - Will

13
如果您想永久使用 vimdiff 来进行 git diff ,可以设置~/.gitconfig 文件:
git config --global diff.tool vimdiff

然后你可以使用 git difftool 进行文件比较。

如果你只是想临时使用 vimdiff,你可以每次运行该命令:

git difftool --tool=vimdiff

我确实在寻找一个临时解决方案。谢谢你最后的补充。 - Marja

6

对于想要使用 git 中未列出的其他 diff 工具(比如 nvim)的人们,以下是我最终使用的方法:

git config --global alias.d difftool -x <tool name>

在我的情况下,我将 `` 设置为 `nvim -d` 并使用以下命令调用 diff 命令。
git d <file>

3
现在支持nvimdiff作为工具,因此您可以执行git config --global diff.tool nvimdiff - Nader Ghanbari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接