git diff,显示删除和添加的同一行

时间:2012-07-12 13:15:57

标签: git git-diff

我意外地在主人身上工作,我不得不开辟一个新的分支。

我几乎完全将它恢复到原来的状态。在一个课程中,我得到了以下差异,我无法理解。

index 4a9abb8..7c55879 100755
--- a/includes/site.inc.php
+++ b/includes/site.inc.php
@@ -142,11 +142,11 @@ class site{

        public $tplEngine = 'smarty';

-
+       
     private $_productsByType = array();
     private $logger;
-    protected $locale = 'tr_TR';
-
+    protected $locale = 'tr_TR';  
+    

它说我已删除并添加了相同的内容,原则上与原始索引没有区别,我不希望将此文件视为已修改。

我该怎么办? THX。

8 个答案:

答案 0 :(得分:35)

这可能是空白的变化。您可以运行git diff -w,这将忽略任何空格更改。

答案 1 :(得分:8)

检查空格。被替换的“空”外观线条中有空格。您可能还意外地用空格替换了标签,反之亦然。

答案 2 :(得分:1)

检查空格或行结尾差异。

答案 3 :(得分:1)

非空行的第二个版本在分号后面有一个空格,空行也有不同的空格数。

应该有一个选项让git突出显示这样的隐藏空间,这样差异就会提供更多信息,但是我没有手动方便。

答案 4 :(得分:1)

除了空格/制表符,从不同的编辑器(甚至在Windows上)和/或不同的操作系统输入的行结尾可能会导致显示重复的差异线; LF(linux / Unix)vs CRLF(Windows)。

答案 5 :(得分:1)

使用

有时在命令行输出中不显示尾随空格
git difftool

在通过git config --global diff.tool vimdiff指定例如vimdiff作为您的difftool之后可能会有所帮助。

答案 6 :(得分:0)

请注意,如果您使用新的-B选项,git 1.8.4 (July 2013)将不再显示只有空行的更改。

  

git diff”学会了一种模式,它忽略了那些变化只包含空行的添加和删除的模式,这与GNU diff的“diff -B”(忽略空白行)相同。 / p>

请参阅commit 36617af7ed594d1928554356d809bd611c642dd2

  

补丁的目标是尽可能地引入GNU差异-B/--ignore-blank-lines。短选项不可用,因为它已用于“break-rewrites”。

     

使用此选项时,git diff不会创建简单地添加或删除空行的数据,但如果它们足够接近“有价值”的更改,仍会显示空行添加/抑制。

     

这里是对该选项的更全面的描述:

     
      
  • 真正的变化很有意思
  •   
  • 足够接近(小于上下文大小)的空白行   有趣的变化被认为是有趣的(递归定义)
  •   
  • “context”行用于每一段有趣的变化
  •   
  • 如果两个帅哥之间的差距小于“大块间环境”,那么他们就是这样   将合并为一个。
  •   

答案 7 :(得分:0)

之所以有时会发生这种情况,是因为git使用的默认diff算法使用启发式方法来消除昂贵的边缘情况,这可能会导致结果不理想。

由于空白,行尾等原因,我遇到了一个无法解释的问题。git diff显示的是删除并重新添加的特定行,作为大块的一部分显示为删除3行并添加2行,但实际上删除了2行并添加1行。其他diff程序显示预期删除了2行,增加了1行。

发生这种情况的文件为4736行(114 KB),差异总计为640个插入和1340个删除,相关的块位于文件的中间。我无法将它简化为出现相同问题的较小测试用例:在任何地方进行最小的扰动都会使问题消失。我唯一的结论是,我陷入了diff算法启发式算法的这些极端情况之一。

除默认设置外,Git还支持multiple other diff algorithms。通过将算法切换为minimalpatiencehistogram中的任何一个,在这种情况下,我的问题就解决了。

另请参见git源代码中的this comment,来自嵌入式LibXDiff库。