这是一个 git 树
我的目标是在
branch_1
上重新调整提交 master
的基础,因此 C
、E
、F
和 G
在 D 之后添加到 master 上,如下图所示
我已经设置了一个公共 github 存储库,可以在 https://github.com/gissehel-sandbox-org/sandbox-git-rebase-on-merge 上重现 rebase 之前的情况
存储库上的 README.md 页面更详细地解释了如何创建测试用例(如果此解释还不够)。
有一个testcase1,其中commit
E
和commit F
不冲突,但是合并G
添加一行。 (这不是最佳实践,但它是为了表明第二个测试用例中的问题就在这里)。
有一个 testcase2,其中提交
E
和提交 F
发生冲突,并通过合并 G
通过其他提交 E
和提交 F
来解决提交(常见合并冲突用例)。
但是我进行变基操作,提交中的更改
G
始终被忽略(在两种用例中)。
我的问题是,有没有一种方法可以安全地对包含合并的分支进行变基,而不必重做整个合并(当合并很复杂时,这可能不安全)?
变基示例
git checkout testcase2/branch1
git rebase testcase2/master
这里提交
F
引发了与合并 G
中已解决的冲突相同的冲突,并且合并 G
被忽略。
另一个例子:
git checkout testcase2/branch1
git rebase testcase2/master --rebase-merges
这里保留了分支的拓扑,但是样式不是合并的内容
G
,冲突还得再次解决。
我知道人们对于是否使用 rebase 有强烈的意见,并且我完全相信这两个选项不会有问题:
branch_2
上使用了branch_1
变基,然后在branch_1
上使用了
master
branch_2
合并到 branch_1
并将 branch_1
合并到 master
问题不在于处于这种情况是一个好主意,问题实际上是关于代码何时处于该状态,并且我想要(无论您是否认为这是一个好主意)进行变基,git 是否能够是否安全地变基(例如使用一些我不知道的选项)?
您无法避免以某种方式重新创建合并,并且如果之前存在合并冲突,则会再次出现合并冲突。我要做的是:
将整个工作树文件夹复制到其他位置以防万一。
仅对合并前的部分进行变基:
git switch --det E
git switch -c temp
git rebase --onto D B temp
这将为您提供
C'
和 E'
在正确的位置。到目前为止,一切都很好!现在将 F 挑选到另一个新分支中的 C'
上:
git switch --det C'
git switch -c temp2
git cherry-pick F
现在您已准备好合并:
git switch temp
git merge temp2
如果存在合并冲突,请处理它并完成合并。现在修复分支名称:
git branch -M branch_1
git branch -D temp2