为什么 git-diff 默认在其空行上产生尾随空格?

Why does git-diff produce trailing whitespaces by default on its own empty lines?

我意识到这一点是因为预提交配置开始检查尾随空白条件(生成的有问题的差异本身就是回购的一部分,所以 git commit 捕获了空白的条件) .

我基本上指的是默认 git diff 输出中的所有空行,它们不是修补本身的一部分;例如diff --git a ... 行之前的所有空行;它们总是在 2 个换行符之间包含 1 个空格。


为了可读性,我相信它们是在显示周围相关代码时生成的,这些代码不是补丁的一部分,但是文件中的那些行本身没有空格!


例如更改包含以下内容的文件后:

hello = "Hellow Stack Overflow"

print(hello)

quit()

git diff 输出:

diff --git a/1.py b/1.py
index da132e0..4fdf846 100644
--- a/1.py
+++ b/1.py
@@ -1,4 +1,4 @@
-hello = "Hellow Stack Overflow"
+hello = "Hello Stack Overflow"
 
 print(hello)
 

(补丁中 print(hello) 之前的行和 print(hello) 之后的行各有一个空格(删除空格:补丁仍然有效))

这是一个很好的例子。这又是原始差异,除了我在每行的末尾添加了 $ 以提高可见性:1

diff --git a/1.py b/1.py$
index da132e0..4fdf846 100644$
--- a/1.py$
+++ b/1.py$
@@ -1,4 +1,4 @@$
-hello = "Hellow Stack Overflow"$
+hello = "Hello Stack Overflow"$
 $
 print(hello)$
 $

git diff 使用一种 统一差异与上下文 的形式,默认情况下,设置了 -U3:它应该使用“三行上下文” diff hunk 更改的上方和下方。在这里,更改的是第 1 行,因此首先没有上面的三行要包含,但是下面 三行(实际上有四行,所以 git diff 可以用 -U3).

砍掉一个

在 diff 输出中,修改后的行以 +- 为前缀,以指示添加或删除的行,未更改的上下文行以单个空格为前缀。如果缺少上下文行之前的空白,统一差异的一些天真消费者可能会感到不安,因此 Git 生成标准形式。

如果你愿意,可以使用-U0到selectno-lines-of-context。 git apply 本身(和其他 Git-suite 程序)通常不介意上下文行是否丢失其前导 space,因此您可以去掉这些 spaces 如果你想要上下文,但不喜欢死板的格式——但是知道上下文何时结束有点棘手(你必须使用 @@ 行来保持计数,所以不要将它们与 --recount).


1BSD vis 程序使用 -l 选项执行此操作。