git diff - 显示行结尾变化?

114

我的编辑器改变了源文件的行尾。当我执行git diff时,我看到同一行两次--一次带有-,一次带有+--但没有可见的区别。

我该如何让git diff显示这个实际的更改是什么?


1
与此问题(也在下面提到)非常相似:我最喜欢的是 git config diff.wsErrorHighlight all - Joshua Goldberg
@JoshuaGoldberg - 确实!那个回答是你需要的唯一全面答案。不要理会其他人告诉你的内容。 - cueedee
5个回答

76

首先,确保你正在使用带有颜色输出的Git(例如git diff --color),并启用了空格高亮显示(例如)

git config color.diff.whitespace "red reverse"

然而,在某些情况下这可能不起作用,因为git似乎不会突出显示被删除行的末尾空格。要查看已删除的空格,只需使用

git diff -R

将空格放在比较的“添加”侧,这样它就会被突出显示。

更多详细信息,请参阅此SO问题的答案。


我的 Git 版本是 2.1.4,并且我已经按照 git config 命令建议的操作进行了操作。但是 git diff 仍然没有显示任何差异。如果我将 git diff 管道传输到 hexdump -C,那里就什么也没有显示: 000000f0 2d 2d 7d 0a 2b 2b 7d 0a |--}.++}.| 其中的 7d 是 '}' 大括号。 - cardiff space man

55

你可以使用以下命令查看行尾差异。

git diff | cat -v

对于CRLF(DOS)结尾,输出"^M",对于LF(Unix)结尾,则不输出。

显然,git diff做得很对,对于CRLF结尾,打印CR和LF字符。但由于控制台消耗了CR,我们看不到它。通过使用cat -v,我们可以使其可见。


另一种类似的方法是 git diff > somediff && vi somediff,vim 也会把 CRLF 显示为 ^M。不过,使用 cat -v 看起来更整洁。 - Nick X

39

通过逐个字符的“单词差异”来查看空格变化的一种方法是使用

git diff --color --word-diff-regex=.

这将突出显示所有行中 的空格更改。删除的空格用[--]包裹,添加的空格用{++}包裹。

或者,如Alex所建议的那样(参见此处)

git diff --color --ws-error-highlight=new,old

突出显示所有在行末尾的空格更改。


20
git diff --ws-error-highlight=new,old

强调改变行中的空格差异。


你使用的是哪个版本的git?我的系统上安装的git 2.1.4提示--ws-error-highlight=new,old是无效选项。 - cardiff space man
这个选项是在2015年的git 2.5.0中添加的。 - MiniGod
1
我的git版本是2.8.2.windows.1,它在+行上显示^M但不在-行上显示,这让我一直以为我的IDE(PhpStorm)正在将我的行尾符更改为DOS风格,但实际上并不是这样。它只是保留了由糟糕的编辑器创建的旧文件的现有行尾符。您的修复程序显示了-+的行尾符,这正是git应该做的。 - Buttle Butkus

5

一个图形化的差异比较工具会更好地展示您的更改 - 尝试使用 git difftool

使用 meld,并设置首选项以显示空格。(编辑 -> 首选项 -> 显示空格。)

其他图形化工具可能有类似的选项 - @Cotton的回答+评论告诉您如何在vimdiff中执行此操作。


可能没有可用的图形化差异工具。@paul-whittaker的答案将在问题暗示的上下文中起作用(一些终端)。 - beOn
现在很奇怪,但是 git difftool --tool=meld 连启动 Meld 都不行。我不知道这是因为正在进行变基还是其他原因。 - cardiff space man
如果换行符是LF或CRLF,Meld将不会显示。 - daniol

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