Что представляет собой конфликт слияния в Git? - PullRequest
40 голосов
/ 07 февраля 2011

Как git определяет, что в конкретном слиянии есть конфликт и что это за конфликт?

Я думаю, что это будет примерно так: если два коммитируемых слияния имеют общий родительский коммит, и если они имеютобе изменили строку X по сравнению с тем, что было у родителя, это конфликт.

Что усложняет мое понимание:

  • «Изменение строки X» может означать замену ее несколькими новыми строками, иэто по-прежнему отображается как один конфликт (версия A имеет эту одну строку, а версия B имеет эти 5 строк или что-то еще)
  • Если вы вставили строки в один из коммитов, алгоритм тупее будет думать, что все последующие строки изменились: строка 30 теперь имеет прежнее содержимое строки 25, 31 имеет прежнее содержимое 26 и т. д. Но git может сказать, что это то же самое, и я не знаю как.

Кто-нибудь может объяснить, как это работает, или указать мне ссылку, которая работает?

Ответы [ 3 ]

22 голосов
/ 07 февраля 2011

По сути, при git каждое объединение является конфликтом, который оставляет вас с индексом, который содержит три версии каждого файла, версии из каждой ветви и базы. Для этого индекса запускаются различные средства распознавания, которые могут решать для каждого отдельного файла, как решить проблему.

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

Впоследствии это плагины, которые смотрят на остальные случаи. Существует плагин, который обрабатывает текстовые файлы, идентифицируя отдельные изменения (например, diff) в одной ветви и пытаясь применить их к другой ветви, прибегая к размещению маркеров конфликта, если это не работает. Вы можете легко подключить свой собственный инструмент слияния на этом этапе, например, вы можете написать инструмент, который знает, как объединять XML-файлы без нарушения правильной формы, или который предоставляет графический интерфейс пользователя, который позволяет интерактивное редактирование и параллельную работу. вид сбоку (например, это делает kdiff3).

Таким образом, представление конфликтов действительно зависит от используемого плагина; плагин по умолчанию для текстовых файлов будет использовать тот же стиль, что и CVS, потому что к нему привыкли люди и инструменты, а маркеры конфликтов являются известной синтаксической ошибкой практически во всех языках программирования.

7 голосов
/ 07 февраля 2011

Я не думаю, что в алгоритме слияния есть что-то особенное с Git: это классический трехсторонний алгоритм слияния (, а не кодвильский ), который можно использовать с несколькими стратегиями (по умолчанию: рекурсивный, или решающий, или осьминог).В результате получается довольно простой процесс слияния , который описан здесь .
Затем любая необходимость визуализации делегируется сторонним инструментам слияния / сравнения.

3 голосов
/ 07 февраля 2011

Перейдите к абзацу HOW CONFLICTS ARE PRESENTED на этой странице .

LE: Нет реальной документации для случаев конфликта, ни файловых маркеров конфликта, и, так как я замешан в комментариях здесь, вот указатели в исходном коде, которые ведут где-то близко к тому, какие стратегии использует git для достижения конфликтное состояние. Файл merge-recursive.c , найдите строку "CONFLICT. Делая это, мы можем легко обнаружить, что на самом деле есть несколько случаев конфликта, таких как:

  • CONFLICT (переименовать / переименовать)
  • КОНФЛИКТ (содержание)
  • КОНФЛИКТ (переименовать / каталог)
  • КОНФЛИКТ (переименовать / удалить)
  • КОНФЛИКТ (переименовать / добавить)
  • КОНФЛИКТ (удалить / изменить)
  • ... и так далее

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

@ Вим Коенен: Да, это также зависит от стратегий слияния, но то, как представлены конфликты, дает гораздо больше понимания. Тогда вы также можете прочитать стратегии слияния, если спросите меня, но все еще сомневаетесь.

...