Обнаружить, что коммит является коммитом слияния, легко: у него более одного родителя.
Обнаружить, что коммит является результатом слияния код , вообще невозможно, так кактакие коммиты никак не отмечены.Cherry-выбранные и отмененные коммиты являются выходами кода слияния, и они иногда помечаются как таковые в своих сообщениях коммитов;но это только особые случаи.Используя git merge --squash
, любой может вызвать процесс слияния как глагол, но сделать обычный коммит без слияния.Можно создать правило политики, согласно которому коммиттеры должны отмечать свои конфликты, но их нелегко применять.Git раньше записывал их как часть своего сообщения о фиксации по умолчанию, и до сих пор делает это в некоторой степени, но они обычно закомментированы.
В любом случае, если вы удовлетворены обнаружением фиксации слиянияс помощью метода «более одного родителя» (т.е. игнорируя сквош-слияние и другие особые случаи) все еще сложно перейти от «это слияние» к «это слияние, которое имело некоторые конфликты». можно механически выяснить, что были конфликты: просто повторно выполнить слияние, используя отсоединенную головку, для каждого коммита, который был коммитом слияния.На этом этапе также возможно сравнить результат слияния, если Git может слить его самостоятельно, с результатом слияния: просто используйте git diff-tree
, чтобы сравнить деревья двух коммитов.Следовательно:
if (commit $H is a merge):
get list of all of $H parents
git checkout $list[0] # assuming a zero subscript means first
git merge --quiet $list[1:N-1]
if (last command succeeded):
difference=$(git diff-tree -r HEAD $H)
if (no difference):
commit was entirely mechanical
else:
commit is suspicious
else:
commit has conflicts
git reset --hard HEAD # discard work-tree
(Этот процесс должен быть запущен в хранилище с рабочим деревом или с использованием временного рабочего дерева через git --work-tree=<path>
.)
Если слияние имеетконфликты, обнаружение конфликтующих строк и обнаружение автора будут хитрыми.