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