简单来说,这就是我们发生的事情:
从
master
上的此文件开始:class SomeClass { ... }
在`master 上创建分支
featureA
。在
featureA
上,将文件更改为:class SomeClass { ... } extension SomeClass { // implement feature A }
- 从“master”创建分支
featureB
。 在
featureB
上,将文件更改为:class SomeClass { ... } class OtherClass { // implement feature B }
- 将
featureB
merge 到master
中。 - 将
featureA
merge 到master
中。
我们期望是:
class SomeClass {
...
}
extension SomeClass {
// implement feature A
}
class OtherClass {
// implement feature B
}
或者以相反的顺序添加两个内容,这是公平的。
实际上,Git 可能应该报告冲突:它不了解语义,并且两个“同时”的更改无法协调。
我们得到的是:
class SomeClass {
...
}
class OtherClass {
// implement feature B
}
没有冲突。也就是说,后来的提交(在另一个提交之前 merge )默默地获胜。
这可以预防吗?怎么办?
注意:如果我在干净的存储库中按照上述步骤尝试此操作,我会在最后一步中遇到 merge 冲突。因此,这个问题要么源于我们在 repo 协议(protocol)上所做的其他事情;要么源于我们在 repo 协议(protocol)上所做的其他事情。感谢提示,我不知道什么会影响事情。或者问题是 diff 算法被更复杂的代码绊倒了;在生产 Swift 代码中,我们一侧有两个扩展,另一侧有一个带有嵌套类型的枚举。
最佳答案
在错误 merge 的情况下,您可以证明不是人为错误,要考虑的主要事情是 Git 的 merge 使用 Git 的差异作为输入。如果差异在琐碎的项目上同步,例如恰好有正确缩进的右大括号线,Git 可以将 merge 结果放在缩进良好的位置,从而编译,但在语义上是错误的 -适合,因此不起作用。
如果您说服 Git 不要同步琐事,它更有可能检测到实际的冲突。您可以通过更改 merge 时使用的 diff 算法来做到这一点。您可以尝试使用-X Patience
或-X histogram
选择patience
或histogram
算法。有关详细信息的(简短)讨论,请参阅我的周末没有取得太大进展的第 3 章(第 65 页)的当前结尾内容 book .
关于Git 在更新时默默地 merge 应该发生冲突的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46771107/