Git:假的合并冲突?

7

我已经使用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部分根本就是的。

为什么git会报错呢?我可能对一些基础知识有所误解...

3个回答

1
你仅凭两方面难以确定冲突。当双方从共同祖先中进行不同的更改时,才会出现冲突。
一方面“没有任何东西”并不重要 - 在祖先中确实存在某些东西,而双方都进行了更改。
通过在冲突文件中显示祖先,可以获取有关冲突的更多数据;你可以设置:
git config merge.conflictstyle diff3

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


0

这里有一个很好的解释,可以帮助你理解你的虚假冲突:交叉合并案例(2005-04-28)

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

[…]

The problem is that there's no single ancestor for the three-way merge which does the right thing.

顺便提一下,那篇文章是由Bram Cohen撰写的 - BitTorrent的作者之一。他后来试图开发自己的Git替代品,希望能解决这些问题。他对问题的分析非常准确,但我认为他从未真正解决过它。这背后有一些有趣的原因,但StackOverflow不是探究这个问题的正确场所。


0

Git 选择共同祖先进行合并:

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

如果git检测到ab都是从0更改的,这会导致合并问题,阻止它自动生成合并文件M
你是否尝试过在像p4merge这样的适当的三方合并工具中查看它?它可能有助于显示git认为的共享祖先以及它所感知的冲突变化。

2
你也可以启用 "git config --global merge.conflictstyle diff3" 来查看合并冲突中的共同祖先。 - Ash Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接