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

ne5o7dgx  于 2023-10-14  发布在  Git
关注(0)|答案(8)|浏览(93)

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

更新Fri Nov 12 22:36:23 UTC 2010

diffpatch对于处理单个文件的情况很有帮助。

update Thu Jun 16 17:56:10 UTC 2016

查看diff-highlight in git 2.9。这个脚本做了 * 正是 * 我最初所寻求的。

lx0bsm1f

lx0bsm1f1#

在git中,你可以不提交而合并。先合并你的补丁,然后执行:

git diff --word-diff-regex=.

注意等号后面的点。

pxiryf3j

pxiryf3j2#

这里有一些版本的输出噪声比git diff --word-diff-regex=<re>小,需要的输入比git diff --color-words --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>将匹配的“单词”与着色的-/+标记包围起来。

lnxxn5zx

lnxxn5zx3#

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

上面的正则表达式(from Thomas Rast)在标点符号/字符级别上分离diff片段方面做得很好(同时不像--word-diff-regex=.那样嘈杂)。
我发布了结果输出here的屏幕截图。

更新:

This article有一些很好的建议。具体来说,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
t1rydlwq

t1rydlwq4#

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

jv2fixgn

jv2fixgn5#

如果你不反对安装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

编辑:刚刚发现它实际上是一个 Package 的官方差异突出显示.至少对于像我这样的perlophobes来说,它更容易安装,GitHub页面也有很好的文档记录:)

iibxawm4

iibxawm46#

我不知道每个字符的差异工具,但有一个每个字的差异工具:wdiff。
参考示例Top 4 File Difference Tools on UNIX / Linux – Diff, Colordiff, Wdiff, Vimdiff

vddsk6oq

vddsk6oq7#

经过一番研究,我注意到这个问题最近在Vim邮件列表中出现了两次。NrrwRgn plugin被提到bothtimes(制作两个狭窄的区域并区分它们)。使用Christian Brabandt描述的NrrwRgn感觉更像是一种变通方法,而不是解决方案,但也许这已经足够好了。
我试用了NrrwRgn,它与:diffthis一起,对于说明单个文件中每个字符的差异确实很有用。但这花了很多时间。我的Vimscript是相当生 rust ,但它可能是脚本。也许可以增强NrrwRgn以提供所需的功能。
想法呢?

pxyaymoc

pxyaymoc8#

diffr是我现在选择的工具。

在Windows上安装:

  1. winget install -e --id Rustlang.Rustup
  2. cargo install diffr
  3. git config --global core.pager "diffr | less -R"
  4. git config --global interactive.difffilter diffr
    如果less有问题:winget install jftuga.less

相关问题