为什么 git 不忽略空行?

Why does git not ignore blank lines?

下一个最终代码:

我想看看有什么变化:git diff -b -w --ignore-blank-lines

代码行$data = [ map{ { id => $_-> id, ip => $_->ip } } $firewall->all ];显示为已移动,但并未移动。

使用 --ignore-blank-lines 选项我期望下一个结果:

$ git --version
git version 2.24.0

只有在源代码中手动删除 688、689 行,我才能得到预期的结果。

为什么git不忽略688、689行?

请参阅 git diffgit help diffhttps://git-scm.com/docs/git-diff#Documentation/git-diff.txt---ignore-blank-lines)的文档:

--ignore-blank-lines

Ignore changes whose lines are all blank.

因此,该选项会忽略 差异更改,这些更改仅包含空行但仍会显示它们。

查看我的测试:

我创建了一个包含 Hello、2 个空格和 World 的新文件。 然后,我执行了 git initgit add . 在我删除一个空行并调用 git diffgit diff --ignore-blank-lines.

之后

git diff:

 Hello

-
 World

git diff --ignore-blank-lines:

git diff 从未承诺向您展示您实际 所做的事情,也不承诺以某种特定方式 实现您所取得的成果.它承诺只显示一组添加和删除的行(或在单词差异模式下,单词)将获得相同的结果。

除此之外,通过各种 ignore-white-space-changes 选项,Git 选择显示 "delete some lines, then put some of them back" 的序列似乎很奇怪。请注意,它还说要删除原始的 ### Change NAS Config 然后添加一个新的 ### Change NAS Config 视觉上(即忽略任何白色 space 更改,例如 tabs-vs-space s) 看起来相同。

调试 and/or 诊断的方法是提供实际的前后文件,或者当 [=51] 时继续显示相同 git diff 行为的部分子集=] git diff --no-index <em>options</em> old-file new-file, 给有时间和兴趣的人弄清楚为什么 git diff 呈现出至少 视觉上 次优的差异。

所涉及的实际算法试图找到具有尽可能少的指令的更改,这往往会保留现有的行,但如果它可以保留多个现有的(但视觉上不相关的) ) 行,同时删除并重新添加一些其他现有的(视觉相关的)行,它可能会选择对人类来说看起来更糟糕的行,但在更改次数方面同样或更有效。

忽略白色的options space 是为了使结果在视觉上更相关,但在这种情况下似乎失败了。拥有触发这种情况的实际输入文件对于找出原因至关重要。我对这个领域有些兴趣,但没有足够的时间来研究它。在任何情况下,我们在 Whosebug 上只能说这 正常的:差异并不保证对您有用。