2010-11-05 161 views
3

下面是当前分支设置: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,我对新的分支名称。我可以创建一个新的分支,从我开始(git branch branchB <SHA-of-I>),但如何最好地“移动”提交J,K和L? git merge branchA而branchB只是将branchB头快速转发到与branchA相同的点。

+1

你是什么意思“移动提交JKL”?当您在那里创建分支B时,它们将根据需要位于分支B上。剩下要做的就是将branchA重新设置回给我,并且做任何它创建提交M(它从哪里来的?)。 – Cascabel 2010-11-05 20:55:23

+0

J,K和L是被添加到branchA中的原始错误提交,它需要成为他们自己的分支的一部分(branchB) – MidnightLightning 2010-11-05 21:11:22

+0

准确地说。但这并不意味着他们需要随处移动。除非在branchA上有任何东西,在JKL之前,*不应该在branchB上,只需在branchA的当前位置创建branchB,然后将branchA移回I. – Cascabel 2010-11-05 21:13:15

回答

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,这被搬回犯一

如果提交M有早就有了,那么你就需要使用rebase。而不是重置分支A,使用git rebase --onto <SHA1-of-I> <SHA1-of-L> branchA将branchA上的所有内容移动到提交I上。

+0

就是这样!提交M是一些新的提交(真的应该在branchA上),而我错过的命令是'git reset --hard'。谢谢! – MidnightLightning 2010-11-05 21:13:53

0

我不明白您对G,H,我出现在branchB而不是branchA上的担心。我的意思是,如果您将branchA重命名为branchB,并从I分支以创建新的branchA,并将M更改为branchA,则应该获得您想要的结果。

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