我怎么能相信Git合并?

Mar*_*ton 6 git merge

我不确定我是否可以信任Git自动合并.这是一个场景.

在master中创建一个程序:

    MOVE 0 TO I.
A.
    PERFORM X-PROC.
    IF I IS EQUAL TO 25 THEN GO TO A.
Run Code Online (Sandbox Code Playgroud)

开发人员1创建了一个分支,并注意到存在一个错误:无限循环.他解决了这个问题:

    MOVE 0 TO I.
A.
    ADD 1 TO I.
    PERFORM X-PROC.
    IF I IS EQUAL TO 25 THEN GO TO A.
Run Code Online (Sandbox Code Playgroud)

与此同时,Developer 2创建了一个分支并以自己的方式修复了错误:

    MOVE 0 TO I.
A.
    PERFORM X-PROC.
    ADD 1 TO I.
    IF I IS EQUAL TO 25 THEN GO TO A.
Run Code Online (Sandbox Code Playgroud)

两位开发人员都会测试他们的代码并发现它 两者合并到主人:

    MOVE 0 TO I.
A.
    ADD 1 TO I.
    PERFORM X-PROC.
    ADD 1 TO I.
    IF I IS EQUAL TO 25 THEN GO TO A.
Run Code Online (Sandbox Code Playgroud)

无限循环回来了.

在我看来,这个问题必定经常发生在任何类型的分布式开发环境中.当我测试这个时,Git没有报告合并冲突.有时这个问题很长时间都不会被发现.回归测试应该找到它,但回归测试也在Git中合并,所以我们也不能相信它们.

我该怎么办?每次合并后我是否需要进行代码读取?

Edw*_*son 9

每次合并后我是否需要进行代码读取?

当然是.

Automerge算法很有用,但它们并不神奇; 它们只包含对文件两面所做的更改,如果它们不冲突的话.不能保证由此产生的变化可以编译甚至不是胡言乱语.无法保证逻辑不是完整的火车残骸.(有人推测Heartbleed bug是automerge巧妙改变逻辑的结果,并没有被审查.)

对于任何执行automerge的版本控制工具都是如此(假设您使用的是过去15年左右写的东西,几乎可以肯定.)虽然这不是为了弹出automerge,它解决了两个更改相同的文件,通常做得很好; 一般情况下合并也是如此.如果您修改某个文件A并修改了某个文件B,则无法保证合并有意义.

最佳实践:在提交或推送它们之前,您应该始终检查合并,即使它们成功自动注册也是如此.

  • 测试套件/单元测试是一个很好的工具,可以减少工作量,如果你有庞大的合并(你通常不应该有) - 但不要陷入虚假的安全感并忽视理智 - 检查你的合并,只是因为你的测试全部通过! (4认同)
  • 不幸的是,许多网站和学习材料在谈论 git 分支/合并时都暗示,如果物理文本合并正常,那么代码的底层逻辑就正常,当然事实并非如此。这也被永久保留为默认行为,并赋予版本控制神圣的地位。 (2认同)