git branch几个提交前?

时间:2010-11-05 20:51:46

标签: git

这是当前的分支设置:

A---B---C-----------------D---E---F master
         \
          G---H---I---J---K---L branchA

我意识到当我去branchA工作时,最后几次提交是为了一个应该是新分支的新功能。所以我想让它看起来像树:

A---B---C-----------------D---E---F master
         \
          G---H---I------------M branchA
                   \
                    J---K---L branchB

我不想重命名分支,因为这会将G,H和I重命名为新的分支名称。我可以创建一个新的分支,从I(git branch branchB <SHA-of-I>)开始,但是如何最好地“移动”提交J,K和L? {branch}只在branchB上快速转发branchB头到branchA。

3 个答案:

答案 0 :(得分:6)

您不需要移动J,K和L.您想在branchB上使用它们吗?使branchB指向提交L。

git branch branchB branchA    # start branch B at commit L
git checkout branchA
git reset --hard <SHA1-of-I>

# If you don't want to check out branchA, you could use
#     git branch -f branchA <SHA1-of-I>

需要移动的东西是 branchA ,它会被移回提交I。

如果已经提交了M,那么您将需要使用rebase。不要重置branchA,而是使用git rebase --onto <SHA1-of-I> <SHA1-of-L> branchA将所有超过branchA上的提交L的内容移动到提交I上。

答案 1 :(得分:0)

您是否尝试过使用git rebase

答案 2 :(得分:0)

我不明白你对G,H的关注,我出现在branchB而不是branchA上。我的意思是,如果您将branchA重命名为branchB,并从I分支以创建新branchA,并将M提交至{{ 1}},你应该得到你想要的东西。

据我所知,分支只是指向特定提交的命名头(查看.git / refs / heads),而树的其余部分仅由git中的父子关系决定。即使你以某种方式设法将J-K-L重新绑定到新的branchB上,并将M提交到现在空置的空间,对象数据也是相同的。 M和J都指向我作为他们的父母,而G / D会指出C作为他们的父母,其余的只是指向他们的直接父母。我在这里错过了什么吗?