Git:虚假合并冲突?

时间:2013-11-21 19:19:47

标签: git git-merge

我一直在使用git几年,并且每次偶尔进行合并时,git会报告一些奇怪的冲突。这是一个.htaccess文件的例子,从我合并到Drupal核心的新7.24版本开始:

# 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部分中只有 nothing

为什么git抱怨这个?我可能误解了一些基本的东西......

3 个答案:

答案 0 :(得分:1)

你不能仅仅从两个方面来看待冲突。当双方对共同祖先做出不同的改变时,就会发生冲突。

一方面“没有”的事实并不重要 - 在祖先中有的东西,双方都改变了它。

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

= IIF(Globals!PageName = 1, Code.setPageNumber(), 0)

这将向你展示冲突的三个方面。

答案 1 :(得分:0)

Git为其合并选择一个共享祖先:

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

如果git检测到ab都是0的更改,则会导致合并问题,导致其无法自动生成合并文件M

您是否在p4merge这样的合适的3向合并工具中查看了它?它可能有助于向您展示git认为共享的祖先以及它所认为的冲突变化。

答案 2 :(得分:0)

对于您的虚假冲突可能发生的事情有一个很好的解释:The criss-cross merge case (2005-04-28)

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

[...]

     

问题在于三向合并没有单一的祖先   这是正确的。

顺便说一下,这篇文章是由Bram Cohen写的--BitTorrent的作者之一。他后来试图发展his own alternative to Git,他希望能解决这些问题。他对这个问题的分析很明显,但我认为他无法真正解决这个问题。有一些有趣的原因背后为什么这可能无法解决,但StackOverflow帖子不适合那个兔子洞。