【问题标题】:git rebase with branches (whole tree)带有分支的git rebase(整棵树)
【发布时间】:2013-06-14 10:53:35
【问题描述】:

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

最初我有:

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)

【问题讨论】:

标签: git rebase git-rebase


【解决方案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 161928,或blog articleadvanced instructions

【讨论】:

  • 谢谢,我知道嫁接功能,但我的目标不是连接树,我需要将 master2 和 somebranch 都重新设置为 master1。
  • 我不知道rebase 命令的变体可以满足您的需求。这与使用rebase 命令的效果相同(假设它们是真正独立的文件和目录)——但它在单个命令中对所有分支都执行此操作。
  • 这里的嫁接问题是在 filter-branch 之后提交 E` 有效地从 master1 中删除了所有文件 :(
【解决方案2】:

我已经回答了这个问题herehere。简短的回答是,使用带有--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 将不会被重新定位。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 2017-12-22
    • 1970-01-01
    • 2023-02-11
    • 2021-08-20
    • 1970-01-01
    • 2021-03-28
    • 2017-02-12
    相关资源
    最近更新 更多