2011-01-16 68 views
2

我想刪除一個in-between merge(remove,not squash),然後將最後2個提交移動到一個新分支。如何在git中刪除中間合併?

這是我目前git log --graph

* 3a5c453 - (2 hours ago) last commit (HEAD, master) 
* b6c19f1 - (2 hours ago) Merge branch 'tade' into HEAD 
|\ 
* | be356d0 - (2 hours ago) previous commit 
| * 65328dc - (3 hours ago) some other commit in branch tade 

我想這結束了:

* bbbbbbb - (some time in the future) a later commit on tade (tade) 
* | aaaaaaa - (some time in the future) a later commit on master (master) 
| * | 3a5c453 - (2 hours ago) last commit (HEAD, newone) 
| * | be356d0 - (2 hours ago) previous commit 
|/ | 
| * 65328dc - (3 hours ago) some other commit in branch tade 

我想用git rebase -i除去與分支TADE合併,然後做一個git branch newonegit reset --hard HEAD^2將最後2個提交移動到新分支。但是當我做了rebase之後,它向我展示了tade分支中的所有提交,它們合併成了master和|不情願刪除它們。

有沒有更好的方法,還是應該繼續使用它?

編輯:我更新了預期的狀態圖,使其更清晰。 2個新的提交(aaaaaaabbbbbbb)僅存在來說明好一點(我希望)狀態

+0

我真的很困惑那些垂直線在你想要的結果。上面有一些其他的提交,在分支tade上,以及......任何暗示的分支在最左邊? – Cascabel

+0

如果您使用實際分支名稱標記當前HEAD並且告訴我們您是如何調用'rebase -i',這也會很有幫助。 – Cascabel

+0

對不起,我是git log --graph輸出的新手。我會改變圖表以澄清預期的狀態。 – Kostas

回答

1

使用交互式衍合衍合3a5c453be356d0,而不是合併提交b6c19f1(即只需移動3a5c453提交一跌)。那麼你應該有這樣的事情:

* xxxxxxx - (2 hours ago) Merge branch 'tade' into HEAD 
|\ 
* | yyyyyyy - (2 hours ago) last commit (HEAD) 
* | be356d0 - (2 hours ago) previous commit 
| * 65328dc - (3 hours ago) some other commit in branch tade 

然後,你可以創建新的分支:

git checkout -b newbranch yyyyyy 

然後你就可以刪除xxxxxx,並承諾事主,這樣結束了:

* zzzzzz - new commit on master 
| * | yyyyyyy - (2 hours ago) last commit (HEAD) 
| * | be356d0 - (2 hours ago) previous commit 
| | * 65328dc - (3 hours ago) some other commit in branch tade 
+0

當我進行交互式重新分配時,我會在我的2個提交之間得到大量提交(來自tade分支)。我應該把它們全部放在下面嗎? – Kostas

+1

嘗試'rebase -i 65328dc',它應該只給出'65328dc'和當前HEAD之間的那些。 – poke