Git не записывает конфликты слияния, если вы не включили rerere, но записывает большую часть информации, необходимой для их воссоздания. Вы можете написать скрипт для воссоздания конфликтов слияния, с некоторыми оговорками ... Git не записывает стратегию слияния, которую вы использовали для разрешения слияния, поэтому вам придется надеяться, что стратегии по умолчанию являются разумным выбором, или внести некоторые изменения чтобы заставить это работать на вашем репо.
Как это работает
Вы можете перечислить слияния с rev-list
:
git rev-list --parents --min-parents=2 --all
Это предпочтительнее, чем git log
, потому что вывод подходит для синтаксического анализа скриптом. Это создаст список коммитов слияния, по одному на строку. Детальный коммит - это первый хеш, а остальные хэши являются родителями. Например,
28171e725cc93e8cb85194931e7138c31f980a43 20af81cf6388026ecf0de4eec8783e7a38905ccd 2d77896f5fcc1a9b09f4f099aa6e945e8da86410
Здесь объединение между 20af и 2d77.
Проверьте первого родителя в оторванной голове:
git checkout -q --detach 20af81cf6388026ecf0de4eec8783e7a38905ccd
Затем объедините оставшихся родителей:
git merge -q --no-commit --no-ff 2d77896f5fcc1a9b09f4f099aa6e945e8da86410
Код состояния merge
будет равен 1, если есть конфликты, которые вы можете изучить. В случае конфликта слияния вы увидите файлы с UU
в статусе фарфора:
git status --porcelain
Затем вы можете прервать слияние, чтобы вернуться в состояние, в котором вы можете работать с репо:
git merge --abort
Сценарий
Я превратил это в сценарий в качестве демонстрации. Сценарий должен быть запущен в нетронутом хранилище, так как он будет запускать несколько команд git checkout
и git merge
.
https://gist.github.com/depp/f1838cf4559f9cde74b9d3052b8abbb0
Сценарий будет повторять каждое слияние в истории, используя стратегию по умолчанию, и сообщать о конфликтующих файлах.
Если вы хотите, вы можете легко расширить скрипт для копирования конфликтующих файлов, чтобы вы могли посмотреть на конфликты.