2010-12-06 32 views
3

說我有一個混帳回購協議,這樣的提交歷史:A-B-C-d-E混帳:由一系列利空出臺消除改變承諾

現在,我突然意識到,這犯B和C是完全有缺陷的和不必要的。另外,假設我有重寫項目歷史的完全自由(也許我正在單獨研究這個項目)。

我有另一個分支指向提交B和C,所以失去它們不是問題。如果我真的需要這些改變,我可以檢查該分支並看看它們。

但是對於主分支,我想強制歷史爲A-D'-E',其中D和E不僅具有修改的父母列表,而且也不包含由提交B和C.

這可能嗎?如果是這樣,怎麼樣?

回答

5

git rebase -i HEAD~5

然後,從通訊列表中刪除不需要的提交它的

+0

不錯!我之前從未使用過rebase -i,但它似乎可以爲單純的凡人(比如我自己)進行重組。我認爲這個問題可能可以通過rebase解決,這就是爲什麼我用「git-rebase」標記它,但rebasing有點難纏(至少對我來說)。更何況你可以很容易地搞砸了你的回購歷史。但是 - 我似乎很容易。 – Kipras 2010-12-08 14:49:36

2

我打算假設有5個提交。

在這種情況下,你會做一個:

git rebase -i HEAD~5 

然後,你刪除關於提交B和C.

最後2行,你會做一個:

git rebase --continue 
+0

只有在必須停止用戶輸入的情況下才需要「rebase --continue」,在這種情況下,除非在'B`之後應用`D`,否則不會出現這種情況。和`C`已被刪除。 – Cascabel 2010-12-06 15:09:52

1
git rebase --onto $commit_A$commit_C$commit_E

這就是說「在C之後的所有提交,直到幷包括E,並在A之上重播它們」。

當然,您可以使用任何符號表示提交的提交。例如。如果master是E和你有一個分支位於C指指點點,說backup,你也可以這樣說:

git rebase --onto $commit_A backup master

這是更方便,因爲你將留下HEAD指着master,並master反過來指出重寫E.