1

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

最初我有:

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)
4

2 回答 2

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}'`

(更多详情请看答案161928,或博文进阶说明

于 2013-06-14T11:28:22.397 回答
0

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

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

变基:

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

其中E^是 E 的父级,J2合并的结果节点。如果您使用E而不是E^ ,则不会重新设置节点E的基础。

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

于 2017-08-24T12:36:06.553 回答