还原合并提交后解决合并冲突
Resolving merge conflicts after reverting a merge commit
我已经将一个功能分支合并到开发中。之后我在功能分支代码中发现了一个错误,所以我恢复了合并(分支开发):
git revert -m 1 <merge-commit-hash>
git push origin develop
接下来我修复了功能分支上的错误。与此同时,其他一些分支已被合并到 develop 中。我已经使用修复创建了一个拉取请求(功能分支 -> 开发),但由于冲突无法合并到开发中。我想要一个没有冲突的拉取请求。当我尝试将开发合并到功能分支以解决冲突时,功能分支中的代码被还原(可能是由于早期的合并还原)。如何解决?
你有这段历史(时间从左到右流动):
... ...
\ \
----------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'
是revertR
.
的反转
另一种方法是使 Git 认为之前的合并从未发生过,如 this answer.
中所述,使用 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
当然,你可以为特性分支选择一个新的fork点。 R
是自然的选择。
我已经将一个功能分支合并到开发中。之后我在功能分支代码中发现了一个错误,所以我恢复了合并(分支开发):
git revert -m 1 <merge-commit-hash>
git push origin develop
接下来我修复了功能分支上的错误。与此同时,其他一些分支已被合并到 develop 中。我已经使用修复创建了一个拉取请求(功能分支 -> 开发),但由于冲突无法合并到开发中。我想要一个没有冲突的拉取请求。当我尝试将开发合并到功能分支以解决冲突时,功能分支中的代码被还原(可能是由于早期的合并还原)。如何解决?
你有这段历史(时间从左到右流动):
... ...
\ \
----------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'
是revertR
.
另一种方法是使 Git 认为之前的合并从未发生过,如 this answer.
中所述,使用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
当然,你可以为特性分支选择一个新的fork点。 R
是自然的选择。