我一直在使用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抱怨这个?我可能误解了一些基本的东西......
答案 0 :(得分:1)
你不能仅仅从两个方面来看待冲突。当双方对共同祖先做出不同的改变时,就会发生冲突。
一方面“没有”的事实并不重要 - 在祖先中有的东西,双方都改变了它。
您可以通过在冲突文件中显示祖先来获取有关冲突的更多数据;你可以设置:
= IIF(Globals!PageName = 1, Code.setPageNumber(), 0)
这将向你展示冲突的三个方面。
答案 1 :(得分:0)
Git为其合并选择一个共享祖先:
0
|_________
| |
a b
|_____|_
|
M
如果git检测到a
和b
都是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帖子不适合那个兔子洞。