Я не знаю подробностей, но насколько я понимаю процесс слияния и разрешения конфликтов, он выглядит следующим образом (предположим, что в репозитории имеется только один файл, модифицированный в двух ветвях):
- Пользователь выдает команду
git merge
. - Git применяет некоторый git -специфический алгоритм, чтобы автоматически объединить два измененных файла. Для этой цели он создает BASE, LOCAL, OTHER и BACKUP версию файла.
- Затем он записывает результат слияния в исходный отслеживаемый файл (назовите его MERGED).
- Предположим, что существуют конфликты. Git использует некоторый формат для обозначения конфликтов (
<<<<<<<
,|||||||
,=======
,>>>>>>>
). Затем он устанавливает свой статус "слияние" или аналогичный. - Если пользователь затем выдает
git mergetool ...
, открывается настроенный инструмент внешнего слияния с аргументами, указывающими на BASE, LOCAL, OTHER и, конечно, MERGED.
Есть несколько моментов, о которых я смущен:
- Будет ли инструмент всегда понимать формат конфликта Git? Это стандартизировано? Как насчет опции
diff3
? Это также обычно понимается внешними инструментами? - Будет ли инструмент применять собственный (и, возможно, другой) алгоритм слияния и полностью удалить вывод Git?
- Когда Git необходимо выполнить рекурсивное слияние (из-за нескольких оснований слияния), а промежуточное слияние создает конфликты - будет ли он рассматривать внутренние маркеры конфликта как обычный текст так же, как любой другой неконфликтный текст? Или рекурсивный формат конфликта?
Я не мог найти никакого объяснения, которое действительно расскажет историю целое.