git - 还原合并提交后解决合并冲突
问题描述
我已将功能分支合并到开发中。之后我在功能分支代码中发现了一个错误,所以我恢复了合并(分支开发):
git revert -m 1 <merge-commit-hash>
git push origin 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'
是revert的反转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
将是自然的选择。
推荐阅读
- c++ - C++ std::stringstarts_with/ends_with 不区分大小写的版本?
- android - Websocket 未定义 - 在 Vue-Native-Websocket 中
- ios - SwiftUI 使用 List 和 Foreach 遍历字典中的键并创建列表视图
- javascript - 在 React 组件中混合文本和组件
- javascript - 在javascript中附加sql查询字符串的最佳方法
- unity3d - 为什么 Unity 反复给我同样的“XRStats::SetStatFloat failed”错误?
- css - 在 CSS 中隐藏标签类
- java - 我如何适应 HashMap 中的改造响应?
- twilio - 关闭自动回复消息
- r - 如何计算R中面板数据集中一组变量的5年平均增长率