У вас есть эта история (время течет слева направо):
... ...
\ \
----------M--o--R--o <-- develop
/
--1--2--3--F <-- feature
Вы создали коммиты 1
, 2
, 3
в своей функциональной ветке и объединили их с разработкой в коммите M
. Затем вы обнаружили ошибку и вернули ее в коммит R
(до или после слияния других веток; это не имеет значения).
Теперь вы исправили проблему с фиксацией F
и хотите снова объединить функцию. Это приносит много неприятностей (конфликты слияния), потому что F
зависит от изменений, которые вы сделали в ветке функций, а develop
их больше нет (вы отменили их в R
).
Один из выходов состоит в том, что вы вернете возврат, а затем объедините обновленную ветку функций:
git checkout develop
git revert R
git merge feature
Это не должно приводить к конфликтам слияния, но должно привести к этой истории:
... ...
\ \
----------M--o--R--o--R'--N <-- develop
/ /
--1--2--3--F------------' <-- feature
R'
является разворотом обратного R
.
Другой способ — заставить Git думать, что более раннее слияние никогда не происходило, используя git replace --graft
, как описано в этом ответе.
Еще один метод — создать совершенно новую ветку функций. Предполагая, что 1
является первым коммитом, который был объединен в M
, все может выглядеть так:
git checkout feature
git rebase --force-rebase 1^
git checkout develop
git merge feature
git rebase --force-rebase 1^
обеспечивает копирование коммитов 1
, 2
, 3
, F
и создает новую ветвь, которая разветвляется в той же точке, что и исходная ветвь. Вы получаете эту историю:
... ...
\ \
----------M--o--R--o--N <-- develop
/ /
--1--2--3--F / <-- abandoned feature branch
--1'--2'--3'--F'---' <-- feature
Конечно, вы можете выбрать новую точку разветвления для функциональной ветки. R
было бы естественным выбором.
person
j6t
schedule
06.05.2021