2010-11-05 139 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作爲他們的父母,剩下的只會指向他們的直接父母。我在這裏錯過了什麼嗎?