2013-10-05 85 views
1

此問題與git rebase interactive: squash merge commits together非常相關。融合在一起合併提交

假設您正在爲某個項目編寫新功能。您從某個分支開始,如devel,然後爲您的功能feature/X構建分支。您不時會在項目中發現一些問題,因此您決定建立第二個分支,名稱爲fixes,從devel開始。

由於需要爲feature/X的推移,你繼續不時做git merge fixes應用修復,所以你在下列情況下結束:

 a --- b --- M --- c --- M --- d ---- e --- M (feature) 
    /  /  /    /
    /  /  /    /
devel ----- fix1 ------ fix2 ------------- fix3 (fixes) 

,因爲這是從來沒有推(所以我不「T打破別人的歷史),我想所有的合併因式分解連成一片,獲得如下:

 a ---------------------- M --- b --- c --- d --- e (feature) 
    /     /
    /     /
devel -- fix1 -- fix2 -- fix3 (fixes) 

獲得這一結果的方法是

git co -b feature2 devel 
git merge --no-ff fixes 
git rebase featur2 feature 

這實際上做的工作,但迫使我創建一個進一步的分支feature2,後來將出現在合併的提交消息。此外,當你在兩個以上的分支上工作時,請嘗試這樣做!

有沒有更好的方法來做到這一點?這似乎是一種值得方便的操作,所以我假設有一些捷徑。

感謝您的幫助

回答

1

您可能想要使用--preserve-merges選項git rebase --interactive,對提交進行重新排序,以便首先合併,然後將所有合併壓縮到一起。如果我是你,我會做兩次重組,一次重新排序,另一次重新排序,這樣解決衝突就更簡單了。

但是,您使用'feature2'的解決方案看起來不錯,您可以編輯合併提交消息,所以名稱'feature2'不是問題,而且您也不需要創建分支,您可以在一個獨立的頭上工作:

git checkout devel^0 
git merge --no-ff --edit fixes 
git rebase HEAD feature 
+0

我想''devel^0'語法。這不應該只是「發展」本身嗎? – Dacav

+1

如果你使用'devel',你將會在那個分支上,如果你使用'devel^0',你不會,而是你將會在一個分離的頭上。如果你在'devel'上,那麼你會合併到那個分支,但是如果你在一個分離的HEAD中,你將會合併到沒有分支。 – FelipeC

1

如果你可以用一個稍微不同的歷史生活,即

        + --- a' --- b' --- c' --- d' --- e' (feature) 
          /
          /
devel -- fix1 -- fix2 -- fix3 (fixes)

那麼您可以在一個單一的命令去做。

$ git rebase fixes feature

是否有什麼特別的你的歷史記錄,讓你想保留父鏈接從合併提交上feature時家譜已經存在於fixes

+0

從源頭上看,確實是一回事。這只是我喜歡對歷史發展有清晰的認識。無論如何,你的解決方案將會完成這項工作,所以+1。 – Dacav