恢复合并提交后解决合并冲突

时间:2021-05-06 13:42:00

标签: git git-merge git-revert git-merge-conflict

我已将一个功能分支合并到开发中。之后我在功能分支代码中发现了一个错误,所以我恢复了合并(分支开发):

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

接下来我修复了功能分支上的错误。与此同时,其他一些分支已合并到开发中。我已经使用修复创建了一个拉取请求(功能分支 - > 开发),但由于冲突,它无法合并到开发中。我想要一个没有冲突的拉取请求。当我尝试将开发合并到功能分支以解决冲突时,功能分支中的代码被还原(可能是由于较早的合并还原)。如何解决?

1 个答案:

答案 0 :(得分:2)

你有这段历史(时间从左到右流动):

        ...   ...
            \     \
----------M--o--R--o    <-- develop
         /
--1--2--3--F            <-- feature

您在功能分支上创建了提交 123,并在提交 M 时将其合并到开发中。然后你发现有一个 bug 并在提交 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 的反转。

另一种方法是使用 this answer 中描述的 git replace --graft 让 Git 认为先前的合并从未发生过。

另一种方法是创建一个全新的功能分支。假设 1 是在 M 中合并的第一个提交,它可能是这样的:

git checkout feature
git rebase --force-rebase 1^
git checkout develop
git merge feature

git rebase --force-rebase 1^ 确保提交 123F 被复制并创建一个新分支,该分支在原来的分支分叉了。您将获得此历史记录:

        ...   ...
            \     \
----------M--o--R--o--N    <-- develop
         /           /
--1--2--3--F        /      <-- abandoned feature branch
--1'--2'--3'--F'---'       <-- feature

当然,您可以为功能分支选择一个新的分叉点。 R 将是自然的选择。