Я создал простой репозиторий git, чтобы проиллюстрировать мой вопрос, доступный на GitHub здесь: https://github.com/smileyborg/EvilMerge
Здесь показана история репо:
master A---B---D---E-----G-----I
\ / \ /
another_branch ----C \ /
\ /
another_branch2 F---H
(В реальном репо на GitHub D
есть 4a48c9
, а I
- 48349d
.)
D
- это "простое" объединение зла, где слияние "правильно" разрешает конфликт слияния, но также делает несвязанное "зло" изменение, которого не было ни в одном из родителей. Можно обнаружить "злую" часть этого слияния, используя git show -c
для этого фиксации, поскольку на выходе есть ++
и --
(в отличие от одиночных +
и -
), чтобы указать изменения которые не существовали ни в одном из родителей (см. этот ответ для контекста).
I
- это другой вид слияния зла, где слияние "правильно" разрешает конфликт слияния (вызванный изменениями от F
до file.txt
, которые конфликтуют с изменениями из G
), но также "злобно" отбрасывает изменения, внесенные в совершенно другой файл file2.txt
(эффективно отменяя изменения от H
).
Как вы знаете, что I
- это злое слияние? Другими словами, какие команды вы можете использовать для обнаружения того, что I
не только вручную разрешает конфликт, но также не может слить изменения, которые он должен иметь?
Изменить/обновить: что такое слияние зла?
Как указано René Link ниже, трудно (возможно, невозможно) определить общий набор критериев для определения "злого слияния". Однако, как Судья Верховного суда Стюарт сказал о порнографии, дурные слияния являются чем-то вы знаете, когда вы видите.
Поэтому, возможно, лучше задать вопрос: какие команды git вы можете использовать при компиляции слияния, чтобы получить diff-выход всех новых изменений, введенных исключительно в самом делете слияния. Этот diff должен включать:
- все слияния разрешений конфликтов (по крайней мере, если разрешение включало в себя что-то более сложное, чем выбор одного родителя, изменяющегося по сравнению с другим)
- все добавления или удаления, которые не существовали ни в одном из родителей (как показано в
D
) - все изменения, которые существовали у одного из родителей, но сброс слияния (как показано в
I
)
Цель состоит в том, чтобы иметь возможность взглянуть на этот результат на человека и знать, было ли слияние успешным или (случайно или злонамеренно) "злым" без, чтобы пересмотреть все ранее (например, F
и H
), которые интегрируются в слияние.