2009-09-22 125 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中沒有幫助。