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

假设我用 git format-patch创建了一个补丁。该文件基本上是带有一些元数据的统一差异。如果我在 Vim 中打开文件,我可以看到哪些行被修改了,但是我看不到哪些 角色在修改后的行中有所不同。是否有人知道一种方法(在 Vim 或其他运行在 Ubuntu 上的自由软件)来可视化每个字符的差异?

执行 vimdiff a b时是每个字符差异可视化的一个反例。

更新世界协调时2010年11月12日星期五22:36:23

在处理单个文件的场景中,defpatch 对于 很有帮助。

更新世界协调时2016年6月16日星期四17:56:10

看看 在 git 2.9中的 diff-highin。这个脚本做的是我最初寻找的 没错

36096 次浏览

经过一些研究,我注意到这个问题最近在 Vim 主邮件列表中出现了两次。提到了 NrrwRgn 插件 都有 时间(制作两个狭窄的区域并区分它们)。使用 Christian Brabandt 所描述的 NrrwRgn 感觉更像是一种变通方法,而不是一种解决方案,但也许这已经足够好了。

我尝试了 NrrwRgn,它和: distthis 一起,对于说明单个文件的各个部分中每个字符的差异确实很有用。但是需要敲击很多次键盘。我的 Vimscript 很生疏,但很可能是脚本。也许 NrrwRgn 可以得到增强,以提供所需的功能。

有什么想法吗?

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

参考例子 UNIX/Linux 上的4大文件差异工具-迪夫,Colordiff,Wdiff,维姆迪夫

鉴于您在问题中提到了 Vim,我不确定这是否是您想要的答案:)但 Emacs 可以做到这一点。打开包含 diff 的文件,确保你在 diff-mode中(如果文件名为 foo.difffoo.patch,这会自动发生; 否则键入 M-x diff-mode RET) ,找到你感兴趣的大块,为 refine-hunk点击 C-c C-b。或者使用 M-n一次一块地遍历文件; 这将自动进行细化。

在 git 中,你不需要提交就可以合并。先合并你的补丁,然后做:

git diff --word-diff-regex=.

注意等号后面的点。

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

上面的正则表达式(来自托马斯 · 拉斯特)在标点/字符级别上分离差异片段的工作做得很好(同时不像 --word-diff-regex=.那样嘈杂)。

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


更新:

这篇文章 有一些很好的建议。具体来说,git repo 的 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

下面是一些比 git diff --word-diff-regex=<re>输出噪声更小的版本,它们需要的输入量比 git diff --color-words --word-diff-regex=<re>少,但相当于 git diff --color-words --word-diff-regex=<re>

Simple (突出显示空格变化) :

git diff --color-words

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

git diff --color-words=.

更复杂(确实突出了空间变化) :

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

一般来说:

git diff --color-words=<re>

其中 <re>是一个 regexp,定义“单词”,用于识别更改。

这些是较少的噪音,因为他们的颜色改变了“单词”,而只使用 --word-diff-regex=<re>周围匹配“单词”与彩色 -/+标记。

如果你不反对安装 NodeJS,有一个叫做“ diff-so-ancy”(https://github.com/so-fancy/diff-so-fancy)的软件包,它非常容易安装,而且工作完美:

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

编辑: 刚刚发现它实际上是一个官方 diff 高亮显示的包装器... ... 至少对于像我这样的疏忽大意者来说,它更容易安装,GitHub 页面也有很好的文档记录:)