Git字差异不正确

时间:2017-09-14 13:09:29

标签: git

考虑下面的原始源代码段

for linePart in line {
    if let part = format(part: linePart) {
        s.append(part)
    }
}

现在已经做了一些变化看起来像这样(周围的上下文,显然不是整个文件)

for linePart in line {
    switch linePart {
    case .added: hasAdded = true
    case .removed: hasRemoved = true
    default: break
    }
}

func appendStrings(_ strings: [NSAttributedString]) {
    for v in strings {
        sout.append(v)
    }
}

对此运行--word-diff=plain(或porcelain)会导致差异

            for linePart in line {
                [-if let part-]{+switch linePart {+}
{+                case .added: hasAdded = true+}
{+                case .removed: hasRemoved+} = [-format(part: linePart)-]{+true+}
{+                default: break+}
{+                }+}
{+            }+}
{+            +}
{+            func appendStrings(_ strings: [NSAttributedString]) {+}
{+                for v in strings+} {
                    [-s.append(part)-]{+sout.append(v)+}
                }
            }

我不明白出了什么问题,但只看[- ... -]部分。 [-if let part-][-format(part: linePart)-]现在显示在差异中的不同行上。显然他们应该在同一条线上。

为什么会这样?

PS:有趣的是,如果下面的函数appendString被删除或注释掉,差异显示正确行上的更改

更新:如果我将差异算法更改为--patience,则不会发生这种情况。如果你再打开--word-diff-regex=.,它会以一种不那么严重的形式再次发生 - 只有一半差异不正确。

1 个答案:

答案 0 :(得分:1)

技术上:如果您将{+..+}[-..-]块列出的操作应用于起始文本,则会显示结束文字。

diff算法可能认为将" = "序列保持在[-format(part: linePart)-]之前会缩短编辑距离。