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

Ada*_*sen 112 git vim diff patch

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

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

更新时间:2010年12月12日星期五22:36:23

diffpatch对您使用单个文件的情况很有帮助.

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

在git 2.9中查看diff-highlight.这个脚本正是我最初寻求的.

yin*_*ted 161

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

git diff --word-diff-regex=.
Run Code Online (Sandbox Code Playgroud)

注意等号后面的点.

  • 更好:`git diff --color-words = .`. (126认同)
  • @ ntc2您应该将评论作为答案. (4认同)
  • 赞成票的人请注意,我最初的用例假设你*只有一个补丁文件*,没有 git 存储库,甚至没有基础/修改版本。这就是为什么我接受@legoscia 的答案......它准确地描述了所要求的内容。 (3认同)
  • @ntc2 `git diff --color-words=.` 和 `git diff --color-words .` 的工作方式不同。更好的是`git diff --color-words .`。 (2认同)
  • @abhisekp:谢谢你的照片。我想我明白了:`git diff --color-words .` 与 `git diff --color-words -- .` 真的一样!即,`.` 被解释为路径。您可以使用`mkdir xy 进行验证;回声 foo > x/test; git add x/test; git commit -m 测试;echo boo > x/test; cd y; git diff --color-words=.; git diff --color-words .; git diff --color-words -- .`. (2认同)

ntc*_*tc2 128

这里有一些版本的输出噪音比git diff --word-diff-regex=<re>输入噪音少,而且输入要少,但相当于git diff --color-words --word-diff-regex=<re>.

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

git diff --color-words
Run Code Online (Sandbox Code Playgroud)

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

git diff --color-words=.
Run Code Online (Sandbox Code Playgroud)

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

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
Run Code Online (Sandbox Code Playgroud)

一般来说:

git diff --color-words=<re>
Run Code Online (Sandbox Code Playgroud)

<re>为了识别变化,定义"单词"的正则表达式在哪里.

它们的噪音较少,因为它们会改变变化的"单词",而使用仅仅--word-diff-regex=<re>围绕匹配的"单词"和彩色-/+标记.

  • 我自己喜欢`--color-words`,没有`= .`部分. (8认同)
  • 不幸的是,您更复杂的版本似乎没有突出显示例如缩进更改,我已经打开了 [a question](/sf/ask/2404513121/) 对此 (2认同)
  • 这个答案很棒!但是,有没有办法将这些更改的背景实际更改为绿色/红色? (2认同)

Jus*_*yes 44

git diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+"
Run Code Online (Sandbox Code Playgroud)

上面的正则表达式(来自Thomas Rast)在标点符号/字符级别上分离差异片段(虽然没有像噪声一样--word-diff-regex=.).

我在这里发布了结果输出的屏幕截图.


更新:

这篇文章有一些很好的建议.具体来说,contrib/git repo 的树有一个diff-highlightperl脚本,显示细粒度的高光.

快速入门使用它:

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 你可以将它缩短为`--color-words = [^ [:space:]] |([[:alnum:]] | UTF_8_GUARD)+'` (5认同)
  • 更简单:`git diff --color-words ='[^ [:space:]] |([[:alnum:]] | UTF_8_GUARD)+'`. (5认同)
  • @gcb文本内容很重要.如果您的更改由空格分隔,则没有区别.但如果你改变,如果你改变像`foo.bar`这样的东西到`foo.qux`,你会看到差异. (3认同)
  • 我已经用 Homebrew 安装了 git,并且已经在 `/usr/local/share/git-core/contrib/diff-highlight/diff-highlight` 处有了该脚本。[此](https://github.com/Homebrew/homebrew-core/pull/2132#issuecomment-227000623)似乎表明Homebrew的git确实将整个contrib安装在`/usr/local/share/git-core/中贡献/`。所以最后,以下内容对我有用`git diff --color=always | /usr/local/share/git-core/contrib/diff-highlight/diff-highlight` (2认同)

leg*_*cia 12

鉴于你在问题中引用了Vim,我不确定这是否是你想要的答案:)但是Emacs可以做到这一点.打开包含DIFF文件,确保您在是diff-mode(如果该文件名为foo.difffoo.patch自动发生这种情况,否则型M-x diff-mode RET),请你有兴趣,并击中了大块C-c C-brefine-hunk.或者一次一个地翻阅文件M-n; 这将自动完成精炼.


小智 6

如果您不反对安装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
Run Code Online (Sandbox Code Playgroud)

编辑:刚刚发现它实际上是官方diff-highlight的包装...至少像我这样的疏水体安装起来更容易,并且GitHub页面有很好的记录:)