`git rebase` 整个分支树

`git rebase` entire branch-tree

我的 git 存储库中有两个不相关的 "parts",其中一个包含合并:

  X---Y

        A---B---C
       /         \
  D---E---F---G---H

现在 YD 包含完全相同的 filesm(将这两个部分视为一个独立的历史记录)

我想将整个第二部分 (D..H) 重新定位到第一部分,所以我得到类似

的内容
                A---B---C
               /         \
  X---Y---D---E---F---G---H

不幸的是,做一个简单的 git rebase 只适用于单个分支,并且会使历史变平并丢失 branching/merging 部分。

如何重新设置整个 "branch-tree" 的基线?

背景

代码最初是使用 subversion 开发的。 在某些时候,我切换到 git 来实现实验性功能,但只是从 svn-repository 的最后状态开始(而不是进行适当的 svn2git 转换)。 git 历史包括分支、合并等等。

我现在想完全切换到 git,但也想将两个历史合并为一个(包括所有合并)。

似乎 rebase 命令有一些保留分支的选项(最重要的 --preserve-merges:

git checkout d--h
git rebase --root  --preserve-merges --onto x--y

这将完全满足我的需求。

(正如预期的那样)它不会迁移任何标签或未合并的分支。 因此,要将以下基于 D 的子树(请注意,这包含两个未合并的分支)变基到 Y,...

  X---Y

        A---B---C
       /
  D---E---F---G---H

...,您需要多次调用 git rebase:

git checkout branch-to-h
git rebase --root  --preserve-merges --onto x--y
git checkout branch-to-c
git rebase --root  --preserve-merges --onto x--y

这导致:

            A---B---C
           /
  X---Y---D---E---F---G---H