2011-06-02 74 views
31

鑑於以下git歷史:如何避免git rebase查殺合併提交?

C-I origin/master 
/
A-B-F-G-H master 
\ /
    D-E  branch-b 

我要變基上的origin/master上面有我的地方master分支,但我希望保留合併提交G。當我試着簡單地做一個git rebase origin/master,而在master時,它壓制D..EG,並承諾用E的提交信息,所以存在合併的歷史丟失了。有沒有辦法保留這個合併,同時仍然獲得rebase?爲了清楚起見,我的預期結果是:

A-B-C-I-F-G-H master 
\  /
    D-----E  branch-b 

回答

44

--preserve-merges添加到您的rebase命令中。如果您的合併中存在衝突解決方案,請將「遞歸他們的」策略作爲參數添加。

+11

或只是'-p'。 – 2011-09-02 15:33:53

+6

關於這個標誌會發生什麼荒謬的細節,請參閱我的答案在http://stackoverflow.com/questions/15915430/what-exactly-does-gits-rebase-preserve-merges-do-and-why。 – Chris 2013-09-30 20:03:05

+4

你能否詳細說明爲什麼遞歸他們在這種情況下會有所幫助?合併提交'G'可以使用不同的衝突解決策略創建,難道不會? – 2015-12-10 12:13:25

2

這不會很漂亮,但我認爲你可以做到這一點。

再次基於˚F到原點/主作爲新的主分支:

git checkout F 
git checkout -b new_master 
git rebase origin/master 

合併分支-B到您的新的分支:

git merge branch-b 

櫻桃挑殘留的H提交到你的新主人分支:

git cherry-pick master 

刪除你的舊主人的分支:

git branch -D master 

不幸的是,你也將不得不再次合併(希望它不需要任何手動合併)。

我沒有真正嘗試過,因此我會先備份存儲庫,但我相信您會得到您想要的。我也建議在每個命令之後打開gitk --all並用「F5」刷新樹,這樣你就可以看到有什麼變化。

如果他們知道更優雅的方式來執行操作,則其他人仍應該發帖。