2009-09-22 309 views
18

“人gitglossary”包含邪恶合并的定义是:邪恶融入git?

邪恶的合并是引入了不以任何父出现 变化的合并。

我不知道我是否理解了作者试图获得的观点。为什么它是邪恶的?

+2

我来自[此页](http:// stackoverflow。com/questions/2910044/does-git-have-evil-twin-issues/2910388#2910388),我发现它非常有帮助意识到,它不是'git的邪恶合并':邪恶的合并是不是一些自然的有时发生的现象**;相反,这是人们有时会在git中做的事情(就像人们有时会导致其他事故,如推动公共回购的变化一样)。这里的外卖是:不要这样做! (_or至少保留合并语义__) – sehe

+0

sehe是正确的,这些是Linus Torvalds本人的话: “邪恶的合并”是使得既不是来自 方,也不是实际上解决冲突的变化 –

回答

16

因为它将代码放在没有人问过的代码中。因为如果你有这样的代码:

$foo = bar; 
$baz = qxx; 

而且这种变化:

$foo = bar; 
$foo++; 
$baz = qxx; 

得到了合并,这一变化:

$foo = bar; 
$foo--; 
$baz = qxx; 

的方式,不知怎的,生产:

$foo = bar; 
$foo++; 
$foo--; 
--$baz; 
$baz = qxx; 

显然,这是邪恶的。

我猜想它是在man gitglossary足够的关注,因为您的合并算法越多涉及,他们就越有可能产生这样的事情。

+2

产生这个,只需使用--no-commit选项调用git-merge,添加一些更改,检入并提交。预生成的合并提交消息将被自动使用。 – Cascabel

+1

@Jefromi通过这个定义,任何需要手动解决的冲突合并是一个邪恶的合并? @chaos说什么有很强的语义差异;您可能可以得到他的结果,而不会在合并过程中发生任何冲突。这真是邪恶。 – krosenvold

+9

何处 - $ baz;来自。我不认为GIT随机产生代码。对我来说,这是非常邪恶的增量和减量合并,没有任何人澄清哪一个是正确的代码。结果是两个更改破坏了代码。来自任何地方的线将不得不由某人手动“纠正”合并。那时,这不是GIT的错!?!?!? –

8

我认为它可能被命名为'邪恶合并',因为它是解决注释文件(生成行式历史注释)时解决“git blame”的难题。当你在主分支上开发的功能“A”,并在侧部的分支功能“B”,以及这些功能冲突语义(非文本)的方式migh需要


邪恶合并。一个例子是对全局变量使用相同的名称,具有不同的含义 - 这需要将变量重命名为其中一个功能。

对于邪恶合并“git show --cc”有非空的紧凑组合diff(但我不确定它是否是等价关系;含义可能只在一个方向上,即“邪恶合并”,则非空“” )。

+1

直观上,@ chaos的回应感觉更为正确,但我知道你对这些事情很好;)感觉就像你在描述一个很好的旧合并冲突,其中有两个人解决了同一问题的重叠部分 - 或者甚至可能是同样的问题。合并完成后,为什么要重新创建它?把这个“相当规则”的事件称为“邪恶”不是太过诗意吗? – krosenvold

+2

解决冲突*通常包括选择其中一个版本,有时从其他版本的行中选择一个版本行。邪恶的合并有不在其父母中的行,所以即使通过最复杂的(通用)合并策略也不能自动重新创建。 –

+0

*(删除关于“邪恶”合并和自动化过程的行)* –

9

在Linus Torvalds的自己的话(从git mailing list拍摄):

一个“邪恶合并”的东西,让从没有 身边走过,并没有真正解决冲突

变化
0

值得一提的是,一个来自“邪恶合并”的“邪恶变化”可能在无声中丢失,同时重新绑定包含与其他提交不冲突的“邪恶变化”的“邪恶合并”。 使用--preserve-mergessuch a case中没有帮助。