如何将2个主题分支重新绑定到新分支?

时间:2011-12-29 09:14:07

标签: git git-rebase

这是我的git存储库历史记录的当前状态:

--o--o--o--o--o--o--o master
            \
             o--o--o--o--o  topic2
                   |
                 topic1

我想将topic1和topic2重新绑定到master上,并使其像:

--o--o--o--o--o--o--o master
                     \
                      o--o--o--o--o  topic2
                            |
                          topic1

实现这一目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:4)

git rebase master topic2
git branch -f topic1 HEAD~2   # On (rebased) topic2, set topic1 pointer

请注意,这假设topic1只是指向topic2过去的指针,即topic1上的任何提交都不应在topic2上。 (HEAD~2假设提交历史记录如图所示,实际上您可能希望使用特定的提交ID。请注意,如果topic1甚至不存在,这将如何工作:因为它没有提交它的“拥有”,指针可以任意设置。)

修改:在这种情况下,您也可以执行以下操作:

git rebase master topic1
git rebase topic1 topic2

最终结果应该与第一个选项相同(iff topic2包含所有topic1的提交!)。此语法可能更容易理解,但如果topic1 包含不在topic2中的提交,则解决方案会有所不同。如果是这种情况,那么前一个解决方案只会放弃 topic1中不在topic2的任何提交,而后者会将它们合并到topic2。这两种结果可能都是不可取的,但在我看来,从第一种解决方案中可以更清楚地知道会发生什么,这就是为什么我把它放在第一位。

为了说明,如果您的提交历史记录如下:

a1 - a2 - a3 - a4 - a5 - a6 - a7 master
               \
                b1 - b2 - b3 - b4 - b5 topic2
                          \
                           c1 topic1

然后第一个解决方案(rebasebranch)会给你:

a1 - a2 - a3 - a4 - a5 - a6 - a7 - b1' - b2' - b3' - b4' - b5' topic2
                               \ master         \ topic1

第二个(rebaserebase):

a1 - a2 - a3 - a4 - a5 - a6 - a7 - b1' - b2' - b3' - c1' - b4' - b5' topic2
                               \ master               \ topic1

然而,在这种情况下,你可能想要的是:

a1 - a2 - a3 - a4 - a5 - a6 - a7 - b1' - b2' - b3' - b4' - b5' topic2
                               \ master         \
                                                 c1' topic1

这个结果的解决方案是:

git branch tmp id_of_b3_commit   # In this case id_of_b3_commit == topic1^
git rebase master tmp
git rebase tmp topic1
git rebase tmp topic2
git branch -d tmp

(如果您将其设置为脚本,则可以使用git merge-base topic1 topic2来查找要放入tmp分支的提交的ID。)

答案 1 :(得分:1)

如果主题2实际上是一个至少有一个自己的提交的分支,那么你可以进行一些嫁接。但更简单的方法是合并主题1和主题2.现在'rebase - “将这个合并分支的新位置与--preserve-merges相关联。将主题1和主题2重置为它们应该位于的位置。

答案 2 :(得分:0)

您可以逐个重新定位topic1topic2分支。

重新启动第一个

git checkout topic1
git rebase master

然后重新推出第二个

git checkout topic2
git rebase master

但我不确定topic1^点会是什么。

我建议以更复杂的方式执行此操作,以保留分支合并历史记录。

首先使用两个主题共享的所有提交创建新分支(您可以使用commit或tag)

git checkout -b topics topic1^

然后在主人

上重新定义它
git rebase master

然后在共享分支上重新定义两个主题。

git checkout topic1
git rebase topics
git checkout topic2
git rebase topics

这应该有效。现在你可以放弃临时分支。

git branch -d topics