使用 git 重新建立包含合并的分支

问题描述 投票:0回答:1

这是一个 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 git-merge git-rebase
1个回答
0
投票

您无法避免以某种方式重新创建合并,并且如果之前存在合并冲突,则会再次出现合并冲突。我要做的是:

  1. 将整个工作树文件夹复制到其他位置以防万一。

  2. 仅对合并前的部分进行变基:

     git switch --det E
     git switch -c temp
     git rebase --onto D B temp
    
  3. 这将为您提供

    C'
    E'
    在正确的位置。到目前为止,一切都很好!现在将 F 挑选到另一个新分支中的
    C'
    上:

     git switch --det C'
     git switch -c temp2
     git cherry-pick F
    
  4. 现在您已准备好合并:

     git switch temp
     git merge temp2
    
  5. 如果存在合并冲突,请处理它并完成合并。现在修复分支名称:

     git branch -M branch_1
     git branch -D temp2
    
© www.soinside.com 2019 - 2024. All rights reserved.