如何在统一的差异文件中可视化每个字符的差异?

时间:2010-07-12 19:52:13

标签: git vim diff patch

说我得到了使用git format-patch创建的补丁。该文件基本上是一个带有一些元数据的统一差异。如果我在Vim中打开文件,我可以看到哪些行已被修改,但我看不到更改行中的哪些字符不同。有没有人知道(在Vim或其他一些在Ubuntu上运行的免费软件)可视化每个角色的差异?

可视化每个字符差异的计数器示例是执行vimdiff a b时。

更新星期五12月12日22:36:23 UTC 2010

diffpatch is helpful表示您使用单个文件的情况。

2016年6月16日星期六17:56:10更新

结帐diff-highlight in git 2.9。这个脚本完全我最初寻找的东西。

7 个答案:

答案 0 :(得分:156)

在git中,您可以在不提交的情况下进行合并。首先合并您的补丁,然后执行:

git diff --word-diff-regex=.

注意等号后的点。

答案 1 :(得分:123)

以下某些版本的输出噪音低于git diff --word-diff-regex=<re>,并且输入的次数少于git diff --color-words --word-diff-regex=<re>,但相当于git diff --color-words

简单(突出显示空间变化):

git diff --color-words=.

简单(突出显示单个字符更改;不突出显示空格更改):

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'

更复杂(突出显示空间变化):

git diff --color-words=<re>

一般来说:

<re>

其中--word-diff-regex=<re>是正则表达式,定义&#34;单词&#34;为了识别变化。

它们的噪音较小,因为它们会改变变化的&#34;单词&#34;,而只使用-/+围绕匹配的&#34;单词&#34;带有彩色{{1}}标记。

答案 2 :(得分:44)

git diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+"

上面的正则表达式(from Thomas Rast)在标点符号/字符级别上分离差异片段(但不像--word-diff-regex=.那样嘈杂)。

我发布了结果输出here的屏幕截图。


更新:

This article有一些很棒的建议。具体来说,git仓库的contrib/树有一个diff-highlight perl脚本,可以显示细粒度的高光。

快速开始使用它:

$ curl https://git.kernel.org/cgit/git/git.git/plain/contrib/diff-highlight/diff-highlight > diff-highlight
$ chmod u+x diff-highlight
$ git diff --color=always HEAD~10 | diff-highlight | less -R

答案 3 :(得分:13)

鉴于你在问题中引用了Vim,我不确定这是否是你想要的答案:)但是Emacs可以做到这一点。打开包含差异的文件,确保您在diff-mode(如果文件名为foo.difffoo.patch这会自动发生;否则键入 Mx diff-mode RET ),转到你感兴趣的大块头,然后点击 Cc Cb 获取refine-hunk。或者使用 M-n 逐步浏览文件一个块;这将自动完成精炼。

答案 4 :(得分:4)

如果您对安装NodeJS没有任何反对意见,那么就会有一个名为“diff-so-fancy”(https://github.com/so-fancy/diff-so-fancy)的软件包,它非常易于安装并且运行良好:

npm install -g diff-so-fancy
git diff --color | diff-so-fancy | less -R

编辑:刚刚发现它实际上是官方差异突出显示的包装器...至少对像我这样的perlophobes安装更容易,并且GitHub页面已经很好地记录了:)

答案 5 :(得分:2)

我不知道每个字符差异工具,但有一个单词差异工具:wdiff。

参考示例Top 4 File Difference Tools on UNIX / Linux – Diff, Colordiff, Wdiff, Vimdiff

答案 6 :(得分:1)

经过一番研究后,我发现这个问题最近在Vim的主要邮件列表中出现了两次。提到NrrwRgn plugin both times(制作两个较窄的区域并将它们区分开来)。使用Christian Brabandt所描述的NrrwRgn更像是一种解决方法,而不是解决方案,但也许这已经足够了。

我尝试了NrrwRgn,它与:diffthis一起,对于说明单个文件的部分内容中的每个字符差异确实很有用。但它花了很多次击键。我的Vimscript非常生疏,但可能会编写脚本。也许可以增强NrrwRgn以提供所需的功能。

思想?