«Изменить» коммит git merge после изменения ветки слияния - PullRequest
2 голосов
/ 11 декабря 2019

Предположим, что я слил ветку источника в ветку назначения в git. Потребовалось много времени для разрешения конфликтов. Тем временем исходная ветвь сильно изменилась. Теперь мне нужно объединить последнее состояние исходной ветви с целевой веткой, но мне нужно «изменить» первый коммит слияния, поэтому у меня есть только один коммит слияния вместо двух. Как я могу раздавить два слияния?

Если бы это были регулярные коммиты, я бы сделал мягкий сброс на HEAD ~, затем зафиксировал --amend, но в этом случае это привело бы к слиянию2 с неправильными родителями: он не был бы получен из последнего коммитаветки src. Перебазировка также не работает, так как я не знаю, как перебазировать коммит как слияние (то есть сделать так, чтобы у него было два конкретных родителя). Я также не хочу переделывать все слияние с нуля, так как это займет много времени.

Есть ли способ сделать это в git?

1 Ответ

1 голос
/ 11 декабря 2019

Я думаю, что нашел решение. Предположим, что график выглядит так на втором рисунке (с «merge» и «merge2»). Затем сделайте это:

git replace --graft HEAD HEAD^^ HEAD^2

Это изменит родителей HEAD на HEAD ^^ и HEAD ^ 2.

Первым родителем коммита слияния всегда является целевая ветвь, а вторым родителем является исходная ветвь (ветвь, которая была объединена с другой). HEAD ^ является первым родителем HEAD (= merge2), который является первым коммитом слияния, поэтому HEAD ^^ является первым родителем первого коммита слияния - это должен быть новый первый родитель второго коммита слияния! HEAD ^ 2 является вторым родителем merge2, который следует оставить без изменений. Таким образом, замена двух родителей HEAD на HEAD ^^ и HEAD ^ 2 делает свою работу.

...