2014-10-01 55 views
2

我有這個樣子(通過數字/字母排序)病史:聯合收割機意外劃分承諾

c1a - c1b - c2a - c2b - c4 - c5 - c6 - c8 (master) 
        |    \  
        |    c9 (branch2) 
        \ 
         c3 - c10 (branch3) 
         \ 
         c7 - c11 (branch4) 

我想壁球犯C2A EN C2B,但我無法找到一個分支獨立的方式這樣做,所以我不得不重訂的4倍,而不是與結果我期待(星表示,由於重定基份):

c1a - c1b - c2ab - c4 - c5 - c6 - c8 (master) 
     ||\  
     || c2ab* - c4* - c5* - c6* - c9 (branch2) 
     |\ 
     | c2ab** - c3 - c10 (branch3) 
     \ 
     c2ab*** - c3* - c7 - c11(branch4) 

c1a - c1b - c2ab - c4 - c5 - c6 - c8 (master) 
       |    \  
       |    c9 (branch2) 
       \ 
       c3 - c10 (branch3) 
       \ 
        c7 - c11 (branch4) 
代替次

所有修改歷史都是本地和遠程

我的問題是:

  • 我如何解決我的歷史,使所有副本合併成一個承諾?
  • 如何將c1a和c1b壓縮到一個提交中,而不重新創建問題?

回答

2

1)需要運行git rebase至少3次以上爲分支2,圖3,和圖4

2)你不能。如果更改提交,則必須每後代提交重寫,以及與這些提交相關的所有ref(通過rebase)。這是沒有辦法的。

您的中間圖表表明您的初始投標嘗試出現了問題,因此這一次您最終會得到兩次通常所需的重新佈局操作。

一般來說,如果你有一個發佈的歷史與許多提交和基於它的參考,我不會推薦使用它。

從您的原始圖開始 - 您有3個SHA充當您的分支的錨。通向主站和分站3的C2B,通向分站4的C3以及通向分站2的C6。一旦你重寫了C2B的SHA,所有其他的SHA也會發生變化,這使得整個過程變得非常複雜,很難自動化,而不直接跟蹤中間SHA。以下應該適用於這種特定的情況。

請注意,這要求您具有各分支上的提交的具體知識。你可以嘗試在沒有提交限制器的情況下進行rebase,但是我偶爾也會遇到不好的經歷(其中Git發生的變化超過了它應該的變化,並且最終不得不按Ctrl-C進行操作,然後放棄並重試)

git checkout master 
git rebase -i HEAD~5 
# edit rebase todo list to combine c2a/c2b 
# once rebase has finished, master is OK. Use git log to get the SHA that represents C2AB 
git checkout branch2 
git rebase --onto master~1 HEAD~1 # this will relocate the one unique commit on branch2 and hang it off of C6' 
git checkout branch3 
git rebase --onto C2AB_SHA HEAD~2 # this will take the two commits on branch3 and put them onto C2AB 
git checkout branch4 
git rebase --onto branch3~1 HEAD~2 # this will take the two commits on branch4 and put them on C3' 

正常情況下,當你做這樣的事情時,你會重新分配其他分支到你的新分支小費,而不是試圖保留原始的親子關係。它使事情變得更容易。

您的恢復過程實際上是相同的,但略有不同--onto和限制說明符。

+0

你能否向我解釋在這種特殊情況下如何使用rebase? – 2014-10-01 21:25:48

+0

對於你現在所處的狀態,或者你最初應該做什麼? – 2014-10-01 21:29:35

+0

兩者都不錯,如果它不是太多的工作,因爲c1a/c1b是完全一樣的情況。 – 2014-10-01 21:30:43