У нас есть проблема, когда разработчик случайно испортил слияние и нажал пустую транзакцию слиянием. Смотрите схему ниже:Пустой Git merge удален commits
develop ----A----------------------------------F------------------I
\ / /
feature1 B----------------C----------------------G---------H
\ /
feature2 ------------------------D---------E-----------------------
сказать, что филиал feature1
был создан в точке A
на develop
ветви. В точке C
, feature1
было слито с feature2
. Однако это слияние было сделано некорректно, а commit D
- фиксация слияния - была пустой фиксацией, которая фактически отклонила все изменения с feature1
(т. Е. Изменения B
и C
были случайно отклонены).
В точке E
, feature2
было объединено с develop
. Наконец, в точке H
, feature1
был объединен с develop
для внесения изменений G
и H
.
Тем не менее, как ожидается, в точке I
что develop
будут иметь изменения B
и C
, а также G
и H
. Однако, я считаю, что они были отклонены при слиянии C -> D
, это не так.
Есть ли простой способ исправить этот сценарий, особенно имея в виду, что в реальной жизни многие коммиты и слияния произошли на нескольких ветвях с момента неудачного слияния? Я думаю о том, как создать дубликат develop
в точке C
и использовать комбинацию переустановки и набора вишни для достижения этой цели. Однако это будет очень трудоемко, поэтому быстрый и безопасный способ спасти ситуацию будет очень ценен.
У вас есть два коммитов помеченные 'G' на вашей диаграмме, но они кажутся разными. Предполагается, что это 'F'? – torek
@torek Да, вы правы. Исправлена. – Dunnie
Я думаю, что ваш план - это очень правильный путь.Обратите внимание, что 'git rebase' имеет' -f'/'--no-ff', чтобы помочь вам скопировать фиксации, которые' git merge' будет считать * новым * (обязательным слиянием), но если они достаточно далеко в прошлом, вы столкнетесь с какой-то доработкой (будь то при заливке или слиянии). – torek