带分支的git rebase(整棵树)

时间:2013-06-14 10:53:35

标签: git rebase git-rebase

我正在尝试将两个独立的提交树连接到一个存储库中。

最初我有:

A--B--C--D (master1)

E--F--G--H (master2)
   \
    I--J (somebranch)

这些树没有共同的祖先,彼此独立(不同的文件和目录)。 我想将master2和somebranch(实际上可能是多个分支)重新绑定到master1。

通过以下方式对单个分支进行重新定位很容易:

#simple reabse:
git checkout master2
git git rebase master1

会给我:

A--B--C--D (master1)
          \
           E'--F'--G'--H' (master2)
E--F--G--H
   \
    I--J (somebranch)

最好我想要一个命令同时移动两个(或更多)分支,以得到这样的结果:

A--B--C--D (master1)
          \
           E'--F'--G'--H' (master2)
                \
                 I--J (somebranch)

2 个答案:

答案 0 :(得分:1)

您可以使用一种鲜为人知的称为移植物的功能将历史记录拼接在一起。

$ echo `git rev-list [E] -1` `git rev-list master1 -1` > .git/info/grafts
$ git filter-branch --tag-name-filter cat master2 [other branches]

或者,如果涉及多个分支,并且您不想将它们全部列出,则可以执行以下操作:

$ git filter-branch --tag-name-filter cat `git show-ref --heads | awk '{print $2}'`

(有关详细信息,请参阅answer 161928blog articleadvanced instructions

答案 1 :(得分:0)

我已回答了这个问题herehere。简短的回答,使用带有--preserve-merges选项的rebase,但在将所有分支加入到一个公共的人工节点之前:

git checkout H
git merge -s recursive -Xours J # will generate a J2 node

rebase:

git rebase --preserve-merges --onto D E^ J2

其中 E ^ E J2 的父级,是合并的结果节点。如果您使用 E 而不是 E ^ ,则节点 E 将不会重新定位。

在引用的帖子中查看更详细的评论。