考虑下面的原始源代码段
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=.
,它会以一种不那么严重的形式再次发生 - 只有一半差异不正确。
答案 0 :(得分:1)
技术上:如果您将{+..+}
和[-..-]
块列出的操作应用于起始文本,则会显示结束文字。
diff算法可能认为将" = "
序列保持在[-format(part: linePart)-]
之前会缩短编辑距离。