2009-09-22 2 views
18

«человек gitglossary» содержит такое определение в зла слияния:Зло сливается в git?

Злая слияние является слиянием, которая вносит изменения, которые не появляются в любого родителя.

Я не уверен, что понимаю, к чему стремятся авторы. Почему это зло?

+2

Я пришел сюда с [этой страницы] (http: // stackoverflow.com/questions/2910044/did-git-have-evil-twin-issues/2910388 # 2910388), и мне было очень полезно осознать, что это не «слияние зла git»: злое слияние - это не какой-то естественный явление **, которое иногда случается; Скорее, это то, что люди иногда делают в git (так же, как люди иногда вызывают другие несчастные случаи, такие как толкание - принудительные изменения в публичное репо). Вынос здесь: не делайте этого! (или, по крайней мере, сохранить слияние semantics_) – sehe

+0

sehe is right, это слова самого Линуса Торвальдса: «злое слияние» - это то, что вносит изменения, которые произошли ни с одной из сторон , и на самом деле не разрешают конфликт. –

ответ

16

Потому что это помещает вещи в код, который никто никогда не просил быть там. Как если бы вы этот код:

$foo = bar; 
$baz = qxx; 

и это изменение:

$foo = bar; 
$foo++; 
$baz = qxx; 

получил слиты с этим изменением:

$foo = bar; 
$foo--; 
$baz = qxx; 

в моде, что каким-то образом произведенной продукции:

$foo = bar; 
$foo++; 
$foo--; 
--$baz; 
$baz = qxx; 

Ясно, что это зло.

Я бы предположил, что достаточно беспокоиться о том, чтобы быть в man gitglossary, потому что чем больше задействованы ваши алгоритмы слияния, тем больше вероятность того, что они произведут такую ​​вещь.

+2

To создайте это, просто вызовите git-merge с опцией -no-commit, добавьте еще несколько изменений, проверьте их и зафиксируйте. Будет автоматически использоваться сообщение с предварительным сообщением о слиянии. – Cascabel

+1

@Jefromi По этому определению любое слияние с конфликтом, которое должно быть разрешено вручную, - это злое слияние? Существует сильная смысловая разница в том, что говорит @chaos; вы можете получить его результаты, не получив конфликта в процессе слияния. Это действительно зло. – krosenvold

+9

Где именно - $ baz; родом из. Я не думал, что GIT выпускает код наугад. Для меня достаточно злой, что приращение и декремент слились без каких-либо разъяснений, который является правильным кодом. Результатом является то, что эти два изменения нарушают код. Линия, пришедшая из ниоткуда, должна была бы быть внесена кем-то вручную, «исправляя» слияние. В этот момент это не ошибка GIT?!?!? –

8

Я думаю, что это может быть названо «злое слияние», потому что это сложный угловой случай для «git-вины», который нужно решить при аннотации файла (генерации линейных аннотаций истории).


Зло слияния migh быть необходимо, когда вы разработали функцию «A» на главной ветви, а функция «B» на боковой ветви, и те особенности конфликта в семантическом (нетекстовом) способе. Пример будет использовать одно и то же имя для глобальной переменной с разными значениями - для этого требуется переименование переменной для одной из функций.

Для зла слияния «git show --cc» имеет непустой компактный комбинированный диф (но я не уверен, если это отношение эквивалентности, импликация может быть только в одном направлении, то есть «зло слияния», то не пусто «»).

+1

Интуитивно, ответ @chaos чувствует себя более корректно, но я знаю, что вы хорошо справляетесь с этими вещами;) Похоже, вы описываете хороший старый конфликт слияния, где 2 человека решили совпадающие части одной и той же проблемы - или, возможно, даже та же проблема. Как только слияние закончится, почему вы хотите его воссоздать? Разве это не слишком поэтично назвать этот «довольно регулярный» инцидент «злом»? – krosenvold

+2

Устранение конфликта * обычно * включает в себя выбор одной из версий по сравнению с другой, иногда выбор одной строки версии над строками из другой версии. У злого слияния есть линии, которые не принадлежат ни одному из его родителей, поэтому его нельзя автоматически воссоздать даже по самой сложной (общей) стратегии слияния. –

+0

* (Удалена строка о слиянии «зла» и автоматическом процессе) * –

9

По словам самого Линуса Торвальдса (взят из git mailing list):

«злое слияние» является то, что вносит изменения, которые пришли из ни стороны, и на самом деле не разрешающие конфликта

0

Следует упомянуть, что «злое изменение» из «злого слияния» может быть потеряно беззвучно, в то время как перезагрузка «злого слияния», содержащая «злое изменение», которое не конфликтует с другими коммитами. Использование --preserve-merges не помогает в such a case.

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