2012-10-19 83 views
6

我有兩個獨立的分支。我在一個月以上的不同時間對他們進行了研究。我去了一個分支(讓我們稱之爲apple)到其他(我們稱之爲orange),通過檢查橙色和做git merge --no-ff apple,一切都很順利。在gitk中,我可以清楚地看到每個分支都有自己的歷史記錄,並在橙色合併提交中合併在一起。git - rebase廢墟合併

後來我意識到橙色提交是不正確的,在構建過程中存在錯誤,我必須編輯橙色提前提交。我使用git rebase -i HEAD~19,選擇提交併將pick更改爲edit。所以我編輯提交,一切都很好,我完成了rebase。我回到gitk,兩個分支的所有歷史都是橙色的線性歷史。

所以我把事情搞砸了,或者這是應該的方式嗎?我使用git reflog返回到合併時的狀態,然後在橙色合併之前我再次執行了另一個復位操作,然後執行了rebase並修復了該提交,之後我進行了合併。現在一切看起來都是我所期望的,來自分支機構的提交不交錯在一起。

爲了將來的參考可以有人告訴我如何可以rebase提交我已經在另一個分支合併的分支,沒有結束隔行提交(線性歷史)?

如果我的術語不正確,請隨時編輯。再次感謝

+0

我不知道'gitk',但在'gitg'我有一個選項可以選擇分支,你是否選擇了像所有本地分支一樣的東西? –

+0

也許rebase上的提交ID而不是相對的'HEAD〜19'? – nneonneo

+1

請注意,git 1.8.5將引入[整潔的方式來保存合併'pull --rebase'](http://stackoverflow.com/a/18756102/6309) – VonC

回答

9

這是rebase的預期行爲。 它有效地重寫分支的歷史,並導致它(默認)失去合併和其他元數據,留下一個簡單的直分支。

您可以通過使用

git rebase --preserve-merges 

保留合併,但有一些問題與--interactive結合--preserve-merges。仔細踩踏。

+1

有趣,但似乎有一個缺點:http://marc.info/?l=git&m=129382385207873 – VonC

+0

是的,這就是我的意思是關於'-i'。 '-i' =='--interactive'。我認爲問題在於,有時重新排列的歷史不能正確地包含合併歷史記錄,而不會破壞數據。 – willoller

+1

我確實知道'-i'代表什麼,我的觀點只是提及,當與'--preserve-merge'結合使用時,似乎並不能自動解決已知的衝突。 – VonC