git rebase和keep已合并的rebased分支的分支,而无需手动解决冲突



当我有一个看起来像这样的数字图时:

A - B - C

E - F - G - H
       /
I - J

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

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

我尝试过git rebase,有很多选择,但我没有得到我想要的结果。

我尝试了--on选项,但它创建了一个分支,我需要手动解决冲突。

只需将--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

再次,请确信此拓扑结构与您的第二个图相同。QED。

(正如你在评论中所说,大多数提交的SHA不可避免地会发生变化;这就是重新基准。但正如复制的提交消息所示,它们是正确的提交。(

我发现,不必手动解决冲突的实际方法是使用rerere-git的功能。rere用于保留冲突解决方案,并在合并中再次遇到冲突时应用这些解决方案。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

对于重定基础的分支中的更多合并,可以在每次合并的重定基础之前使用re-re-train.sh。

最新更新