对于下一个最终代码:
我想看看有什么变化: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行?
答案 0 :(得分:2)
git diff
从不保证向您展示您实际完成的工作,也没有承诺向您提供实现结果的某些特殊方法。它只承诺显示将实现相同结果的一组添加和删除的行(或在单词差异模式下为单词)。
此外,使用各种ignore-white-space-changes选项,Git选择显示“删除一些行,然后放回一些行”的序列似乎很奇怪。请注意,它还说要删除原始的### Change NAS Config
,然后重新添加一个新的### Change NAS Config
,这样看起来(即忽略任何空白更改,例如tabs-vs-spaces)在外观上都是相同的。
进行调试和/或诊断的方法是提供实际的前后文件,或者提供其中的一些子集,这些文件在运行git diff
时继续显示相同的git diff --no-index options old-file new-file
行为,给那些有时间和兴趣来弄清楚git diff
为何提出的差异至少是视觉次优的人。
实际的算法涉及尝试查找具有尽可能少的指令的更改,该更改倾向于保留现有行,但是如果它可以在删除和删除时保留多个现有(但与视觉无关)行,然后重新添加其他一些现有的(与视觉相关的)行,则它可能会选择对人类来说看起来更糟的行,但在变更次数方面,其行之有效或同等或更有效。
用于忽略空格的 options
旨在使结果在视觉上更加相关,但在这种情况下似乎失败了。拥有触发这种情况的实际输入文件对于弄清原因至关重要。我对这个领域有些兴趣,但是没有足够的时间进行研究。无论如何,我们在StackOverflow上只能说这是很正常:diffs不能保证对您有用,
答案 1 :(得分:1)
请参阅git diff
(git help diff
或https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---ignore-blank-lines)的文档:
-ignore-blank-lines
忽略所有行均为空白的更改。
因此,该选项会忽略仅包含空白行但仍显示空白行的差异更改。
查看我的测试
我创建了一个新文件,其中包含Hello
,2个空格和World
。
然后,我执行了git init
和git add .
在我删除一个空白行并分别命名为git diff
和git diff --ignore-blank-lines
之后。
git diff
:
Hello
-
World
git diff --ignore-blank-lines
: