2011-12-29 130 views

回答

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不存在,这也可以工作:因为它没有提交它的“own”,指针可以只是任意设定)

编辑:在这种情况下,则可以选择做:

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

+0

它的工作原理。你能详细解释步骤2中会发生什么吗? – 2011-12-29 11:40:04

+0

@bmm在步骤2中,移动分支“topic1”('-f'以强制设置现有分支)到当前位置过去两步的提交('HEAD',in“topic2”第一条命令让我们进入该分支)。就像它在答案中所说的那样,我会建议用日志中所需的提交ID替换'HEAD〜2'(即你想要的“id1”的id以分支)。 – Arkku 2011-12-29 15:07:26

1

如果主题2实际上是一个至少有一个提交的分支,那么您可以执行一些嫁接操作。但更简单的方法是合并主题1和主题2.现在'重新命名 - 将'这个合并分支的新位置与--preserve-merges合并。将主题1和主题2重置到它们应该坐的位置。

0

您可能会重新编号topic1topic2分支一个接一个。

调整基线第一个

git checkout topic1 
git rebase master 

然后重订第二个

git checkout topic2 
git rebase master 

但我不知道将与topic1^点什么。

我建议以更复杂一点的方式来保存分支合并历史记录。

首先做出新的分支所有提交由这两个主题分享(你可以使用commitish或标签代替)

git checkout -b topics topic1^ 

然后重订其在主

git rebase master 

然后在共享的分支变基这两个主题。

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

这应该工作。现在你可以放弃临时分支。

git branch -d topics 
+2

re。第一部分:如果将两者分别绑定到主服务器上,则最终将针对topic1和topic2的共享部分分别进行提交。但是,如果topic1只是指向topic2的过去的指针,那么您可以执行'git rebase master topic1'和'git rebase topic1 topic2',这应该也会导致与我建议的解决方案相同的情况。 – Arkku 2011-12-29 10:31:53

+0

@Arkku,我认为你的评论中的解决方案非常简单,它的工作原理。事实上,它应该成为一个答案。 – 2011-12-29 11:34:22

+0

@Arkku +1 git rebase topic1 topic2。你可以编辑我的答案,或者我可以自己做,如果你不介意解决完美的解决方案 – lig 2011-12-29 11:51:56

相关问题