`git rebase`整个分支树

时间:2015-10-06 18:09:40

标签: git merge branching-and-merging

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

  X---Y

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

现在YD包含完全相同的filesm(将2个部分视为单个不相交的历史记录)

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

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

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

我如何改变整个"分支树"?

背景

代码最初是使用subversion开发的。 在某些时候,我转而使用git来实现实验性功能,但刚刚从svn-repository的最后一个状态开始(而不是进行正确的svn2git转换)。 git历史包括分支,合并和事物。

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

1 个答案:

答案 0 :(得分:2)

似乎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