Зло сливается с мерзавцем - откуда они берутся? - PullRequest
4 голосов
/ 18 июня 2010

Я прочитал этот вопрос и ответы, но мне не ясно, что ВОЗ создает "изменения, которые не появляются ни у одного из родителей".

Это сбой в алгоритме git merge?

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

Ответы [ 3 ]

4 голосов
/ 18 июня 2010

Это объясняется в первом комментарии правильного ответа .Вы выполняете слияние без выполнения коммита (либо посредством конфликта, либо --no-commit), а затем добавляете дополнительные изменения к слиянию перед фиксацией.

Обратите внимание, что разрешение конфликта слияния не является злом, вы просто выбираете код, который существуетв одной или обеих сторонах конфликта.Если вы добавите какой-либо код, которого нет ни в одной из сторон, вы теперь превратили слияние в зло.

2 голосов
/ 27 сентября 2012

Этот комментарий был интересной иллюстрацией того, как может произойти "злое" слияние:

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

  • 'ours' изменяет имя функции,
  • 'theirs' изменяет возвращаемое значение,
  • нам нужен метод с новым именем и новым возвращаемым значением).

Это злой? IOW: иногда необходимы злые слияния

Обратите внимание, что эта статья упоминает "злые слияния" в другом контексте (непреднамеренные слияния) и выступает за постоянный отказ, а не слияние ... но что игнорирует опасность git pull --rebase.


Junio ​​C Hamano, главный сопровождающий git, точнее в своем апрельском блоге 2013 :

Каноническим примером того, как «злое слияние» происходит в реальной жизни (и это хорошо), является приспособление к семантическим конфликтам. Это почти никогда не имеет ничего общего с текстовыми конфликтами.

(обычно это изменение API, например: вы добавляете параметр, в то время как другой разработчик добавляет вызов этой функции ... но без никаких дополнительных параметров)

Это означает, что вы должны исправить семантический конфликт (например, отсутствующий аргумент для функции, которая теперь его принимает) во время слияния, что означает создание строки, которая:

  • не существует в вашем коде (где вы правильно сделали изменения API)
  • не существует в удаленной ветви, которую вы сейчас объединяете (где другой разработчик не знал об изменении API)

Это делает слияние "злым слиянием" .

При "git log -c/--cc", такая строка будет отображаться с двойным плюсом в выводе многоканального патча, чтобы показать, что " этого не было в любой родитель".

Из git log справочная страница :

Различное форматирование

-c::

С помощью этой опции вывод diff для фиксации слияния показывает различия между каждым из родителей к результату слияния одновременно, вместо того, чтобы показывать попарно diff между родителем и результатом по одному.
Кроме того, в нем перечислены только файлы, которые были изменены от всех родителей.

0 голосов
/ 18 июня 2010

Это происходит, когда у разработчика возникает конфликт слияния, который он должен исправить вручную, и при этом он изменяет код, который не связан с самим конфликтом слияния.Алгоритмы слияния Git не будут вставлять несвязанные, «злые» изменения кода сами по себе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...