git rebase and keep已重定基分支的分支,该分支具有合并,但不需要手动解决冲突

46qrfjad  于 2023-02-14  发布在  Git
关注(0)|答案(2)|浏览(171)

当我有一个像这样的git图时:

A - B - C
      \
        E - F - G - H
          \       /
            I - J

有可能吗?如果有,我需要使用什么命令才能得到这样的结构:

A - B - C - E - F - G - H
              \       /
                I - J

我尝试过很多git rebase选项,但都没有得到我想要的结果。
我尝试使用--onto选项,但它创建了一个单独的分支,我需要手动解决冲突。

pu82cl6c

pu82cl6c1#

只需将--rebase-merges添加到rebase命令中。如果存在合并冲突,只需解决它们。请慢慢来,耐心等待。
下面的例子证明了这一点,我们从下面的拓扑结构开始:

*   1c69c6d (HEAD -> br) h
|\  
| * 2e08ae7 j
| * e9a2d44 i
* | 2e831e6 g
* | 19d765f f
|/  
* dd465e4 e
| * 5167934 (main) c
|/  
* ec99741 b
* 0f9a759 a

确保这与第一张图的拓扑完全相同。现在:

% git rebase --rebase-merges main

结果:

*   627ddfe (HEAD -> br) h
|\  
| * 2734bc2 j
| * 89fb7ba i
* | 4cbffe3 g
* | badcc53 f
|/  
* b239c38 e
* 5167934 (main) c
* ec99741 b
* 0f9a759 a

同样,确保这个拓扑结构与第二个图完全相同。
(As你已经在评论中被告知,大多数提交的SHA不可避免地会改变;这就是rebase的含义,但它们是正确的提交,正如复制的提交消息所示。

uubf1zoe

uubf1zoe2#

我发现实际上不用手动解决冲突的方法是使用rerere git的特性。rerere用来保存冲突解决方案,并在合并中再次遇到冲突时应用它们。在git repo中有一个叫做rerere-train.sh的手工脚本,它可以使用过去合并提交中的合并冲突解决方案手动训练rerere。
因此,要回答我最初的问题,需要在将rerere-train.sh脚本下载到父目录后运行以下命令:

git config rerere.enabled true
../rerere-train.sh H
git checkout H
git rebase --rebase-merges C
git commit -a
# Here you save the commit message of the merge
git rebase --continue

对于重定基分支中的更多合并rerere-train.sh可在每个合并的重定基之前使用www.example.com。

相关问题