2013-11-21 3 views
6

Я использую git в течение нескольких лет, и каждый раз, когда вы делаете слияние, git сообщает о некоторых странных конфликтах. Вот пример файла .htaccess, с момента, когда я слился в новой версии ядра Drupal 7.24: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 

Если мерзавец обнаруживает, что оба a и b изменения со стороны 0, это вызывает проблему слияния, предотвращающий его от автоматического создания объединенного файла M.

Вы посмотрели на него в надлежащем трехстороннем инструменте слияния, например p4merge? Это может показать вам, что думает гит, является общим предком и тем, что он воспринимает как противоречивые изменения.

+1

Вы также можете включить «git config --global merge.conflictstyle diff3», чтобы увидеть общего предка в конфликтах слияния. –

0

Там приличная объяснение того, что, вероятнее всего, происходит с фиктивными конфликтов здесь: The criss-cross merge case (2005-04-28)

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

[...]

Проблема заключается в том, что нет ни одного предка для трехходового слияния который делает правильно.

Кстати, этот пост был написан Брэмом Коэном - одним из авторов BitTorrent. Позже он попытался развить his own alternative to Git, что, как он надеялся, обойдет эти проблемы. Его анализ проблемы происходит, но я не думаю, что он когда-либо мог ее решить. Есть интересные причины, почему это, вероятно, неразрешимо, но столбец StackOverflow не подходит для этой кроличьей дыры.

Смежные вопросы