邪恶合并在git中 - 它们来自哪里?

时间:2010-06-18 13:00:19

标签: git merge

read这个问题和答案,但我不清楚的是,世界卫生组织创造了“任何父母都没有出现的变化”。

git merge算法搞砸了吗?

或者是因为用户必须手动调整冲突以获取构建的东西,引入不在父级中的新代码?

3 个答案:

答案 0 :(得分:4)

在正确answer的第一条评论中对此进行了解释。您不进行提交(通过冲突或--no-commit)进行合并,然后在提交之前向合并添加其他更改。

注意,解决合并冲突并不邪恶,您只需选择存在于冲突的一侧或两侧的代码。如果你添加一些在任何一方都不存在的代码,你现在已经把合并变成了恶。

答案 1 :(得分:2)

That comment是一个关于如何发生“邪恶”合并的有趣例证:

  

有时最小的手动分辨率导致不存在的线条。
  例如。

     
      
  • 'ours'更改了某个功能的名称,
  •   
  • 'theirs'更改返回值
  •   
  • 我们需要一个带有新名称和新返回值的方法。
  •   
     

这是一个邪恶的吗? IOW:有时是必要的邪恶合并

请注意this article在另一个上下文中提到“邪恶合并”(无意合并),并提倡总是进行变基,而不是合并......但是would ignore the danger of a git pull --rebase


Junio C Hamano,git的主要维护者,精确地在April 2013 blog post

  

在现实生活中发生“邪恶合并”(并且是一件好事)的典型例子是调整语义冲突。它几乎从未与文本冲突有任何关系。

(通常是API更改,例如:您添加参数,而另一位开发人员添加对该函数的调用...但没有任何额外参数)

这意味着你必须在合并时修复语义冲突(就像现在需要一个函数的缺失参数一样),这意味着要创建一行:

    您的代码中没有
  • (您正确地进行了API更改)
  • 您现在正在合并的远程分支中不存在
  • (其他开发人员不知道API更改)
  

这使得合并成为“邪恶合并”

     

使用“ git log -c/--cc ”,此路线将在多路补丁输出中以双加显示,以显示“此父母任何一方都不存在“。

来自git log man page

差异格式

-c::
  

使用此选项,合并提交的diff输出会同时显示每个父项与合并结果的差异,而不是一次显示父项与结果之间的成对差异。
  此外,它仅列出了从所有父母修改过的文件。

答案 2 :(得分:0)

当开发人员有必须手动修复的合并冲突时,就会发生这种情况,并且这样做时,他会更改与合并冲突本身无关的代码。 Git的合并算法本身不会插入无关的“邪恶”代码变化。