还原合并提交后解决合并冲突

Posted

技术标签:

【中文标题】还原合并提交后解决合并冲突【英文标题】:Resolving merge conflicts after reverting a merge commit 【发布时间】:2021-07-28 20:12:49 【问题描述】:

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

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

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

【问题讨论】:

您是否通过在功能分支顶部的新提交修复了该错误?或者你做了一个全新的功能分支?或者你只是重写了功能分支的一些提交? 我刚刚在现有功能分支之上创建了一个新提交。 合并后我没有删除功能分支,所以我已经签出到功能分支并推送了下一个带有修复的提交。 【参考方案1】:

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

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

您在功能分支上创建了提交123,并在提交M 处将其合并到开发中。然后你发现有一个 bug 并在 commit 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 replace --graft 让Git 认为之前的合并从未发生过,如this answer 中所述。

另一种方法是创建一个全新的功能分支。假设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 将是自然的选择。

【讨论】:

通常拉取请求会等待一段时间的批准。我希望有一个没有冲突的拉取请求(我使用 Bitbucket),但是在恢复 R 之后,一个分支开发存在一段时间存在一个错误,这不是一个好的做法。 你已经通过恢复提交把自己画到了一个角落。我在答案中添加了另一个想法,即让您在不逆转还原的情况下逃脱。但这是一种先进的技术。 使用 rebase 怎么样?也许它会有所帮助。 如果你做得正确,变基会有所帮助。 您能否提出一个利用变基的解决方案?答案会更完整。

以上是关于还原合并提交后解决合并冲突的主要内容,如果未能解决你的问题,请参考以下文章

在 Git 中,如何恢复在提交之前还原的暂存文件?

个人作坊,vs 集成 GIT版本控制,GIT恢复历史版本时,总提示有冲突要求合并. 请问怎么才能还原到历史版本

Git 还原一些提交(包括合并),然后稍后重新提交

gitlib还原合并请求后如何再次合并

git merge仓

还原合并提交时 1 和 2 的意义