2013-11-21 122 views
6

我一直在使用git几年,每当偶尔做一次合并时,git会报告一些奇怪的冲突。下面是一个.htaccess文件的一个例子,从我在新版本7.24 Drupal核心的合并:Git:错误的合并冲突?

# Protect files and directories from prying eyes. 
<FilesMatch "\.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig\.save)$"> 
<<<<<<< HEAD 
    Order allow,deny 
</FilesMatch> 

# Hide important scripts from malicious users. 
<FilesMatch "^(autoinstall\.php|install\.php|update\.php)$"> 
======= 
>>>>>>> 7.24 
    Order allow,deny 
</FilesMatch> 

如何有冲突吗?这甚至不是空白/端线差异的潜在情况:在冲突的7.24部分中仅有没有

为什么git会抱怨呢?我可能误解的东西根本...

回答

1

你不能仅从双方来确定冲突。当双方对共同的祖先作出不同的改变时就会发生冲突。

事实上,“一无所有”的一方并不重要 - 有东西在祖先,双方都改变它。

通过在冲突文件中显示祖先,可以获得有关冲突的更多数据;你可以设置:

git config merge.conflictstyle diff3 

这将告诉你冲突的所有三方。

0

的Git选择其合并一个共同的祖先:

0 
|_________ 
    |  | 
    a  b 
    |_____|_ 
      | 
      M 

如果git的检测,无论ab来自0的变化,这将导致合并问题,防止它从自动生成合并文件M

你有没有在p4merge这样的合适的3-way合并工具中看过它?它可能有助于向你展示git认为共享的祖先以及它认为是相互冲突的变化。

+1

您也可以启用“git config --global merge.conflictstyle diff3”来查看合并冲突中的共同祖先。 –

0

有一个什么样的可能与你的假冲突会在这里一个体面的解释:The criss-cross merge case (2005-04-28)

A 
|\ 
| \ 
| \ 
| \ 
| \ 
|  \ 
|  \ 
B8  C3 
|\  /| 
| \ /| 
| \/| 
| X | 
|/\ | 
|/ \ | 
|/  \| 
D8  E3 
\  | 
    \  | 
    \ | 
    \ | 
    \ | 
     \ | 
     \| 
     ? 

[...]

的问题是,有一个为三路合并没有单一的祖先 这是正确的事情。

顺便说一下,该文章由Bram Cohen(BitTorrent的作者之一)撰写。他后来试图开发his own alternative to Git,他希望能解决这些问题。他对这个问题的分析很有用,但我认为他从未能真正解决这个问题。背后有一些有趣的原因可能无法解决,但StackOverflow帖子并不适合那个兔子洞。