Разрешение конфликтов слияния после отмены коммита слияния

Я объединил функциональную ветку в develop. После этого я обнаружил ошибку в коде ветки функции, поэтому я отменил слияние (разработка ветки):

git revert -m 1 <merge-commit-hash> 
git push origin develop

Затем я исправил ошибку в ветке функций. Тем временем некоторые другие ветки были объединены в разработку. Я создал запрос на вытягивание (ветвь функций -> разработка) с исправлением, но его нельзя объединить с разработкой из-за конфликтов. Я хотел бы иметь запрос на вытягивание без конфликтов. Когда я пытаюсь объединить разработку в ветку функций для разрешения конфликтов, код из ветки функций возвращается (вероятно, из-за более раннего возврата слияния). Как это исправить?


person Irbis    schedule 06.05.2021    source источник
comment
Вы исправили ошибку с новым коммитом поверх ветки функций? Или вы сделали совершенно новую ветку функций? Или вы переписали только некоторые коммиты функциональной ветки?   -  person j6t    schedule 06.05.2021
comment
Я только что создал новую фиксацию поверх существующей ветки функций.   -  person Irbis    schedule 06.05.2021
comment
Я не удалял функциональную ветку после слияния, поэтому я перешел на функциональную ветку и отправил следующую фиксацию с исправлением.   -  person Irbis    schedule 06.05.2021


Ответы (1)


У вас есть эта история (время течет слева направо):

        ...   ...
            \     \
----------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
comment
Обычно запрос на включение ожидает одобрения в течение некоторого времени. Я хотел бы, чтобы запрос на вытягивание был без конфликтов (я использую Bitbucket), но после отмены R ветка разработки некоторое время существует с ошибкой, что не является хорошей практикой. - person Irbis; 06.05.2021
comment
Вы загнали себя в угол, отменив коммит. Я добавил к ответу еще одну идею, которая позволит вам уйти без отмены возврата. Но это продвинутая техника. - person j6t; 06.05.2021
comment
А как насчет использования rebase? Может быть, это могло бы помочь. - person Irbis; 06.05.2021
comment
Перебазировка может помочь, если вы делаете это правильно. - person j6t; 06.05.2021
comment
Не могли бы вы предложить решение, которое использует перебазирование? Ответ будет более полным. - person Irbis; 06.05.2021
comment
Я добавил предложение, используя git rebase. - person j6t; 07.05.2021