Git 在更新时默默地 merge 应该发生冲突的内容

标签 git merge git-merge git-merge-conflict

简单来说,这就是我们发生的事情:

  • 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 选择patiencehistogram 算法。有关详细信息的(简短)讨论,请参阅我的周末没有取得太大进展的第 3 章(第 65 页)的当前结尾内容 book .

关于Git 在更新时默默地 merge 应该发生冲突的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46771107/

相关文章:

git - 使用单个命令(git push)而不是 FTP 拖放更新网站

arrays - 将两个数组与一个数组中的索引和另一个 perl 中的值合并

macos - 在 OSX 上,git merge 删除重命名大写的文件

git - 在 git merge commit 中列出所有修改过的文件——即使是快进的

Github 连接到主机 github.com 端口 22 : Operation timed out

git - Bitbucket 全局钩子(Hook)或默认配置

sql - 在 SQL Server 中更新插入 5000 多行而不合并的最有效/最佳实践是什么?

postgresql - 如何创建一个表,插入两个具有相同主键且不重复的表,并且我需要所有数据

Git merge 忽略空格

git - 从另一个 GIT 项目的特定提交创建一个 GIT 项目