git rebase
可以工作。假設當前分支爲master
,並且第一個圖中的提交從底部到頂部標記。第一4個綠色是A B C d,接下來的5紫色是E F G H I,左2綠色J個K,右2紫色是L M和頂綠色是N.
git rebase --onto J D master
,我們得到一個線性歷史A-B-C-D-J-E'-F'-G'-H'-I'-L'-M'
。 E'
和E
是具有不同sha1的等價提交。
還有另一種方式
git rebase --onto I D master
,我們得到一個線性的歷史A-B-C-D-E-F-G-H-I-J'-L'-M'
。
如果git rebase
不是那麼清楚,也可以通過git reset
和git cherry-pick
來完成,前者爲剪切而後者爲移植。
由於K和N是合併提交,它們不應該存在於線性歷史記錄中。我們可以忽略它們。
git reset J --hard
git cherry-pick E F G H I L M
#or one by one: git cherry-pick E;git cherry-pick F;...
最後我們得到線性歷史A-B-C-D-J-E'-F'-G'-H'-I'-L'-M'
。
或者以另一種方式
git reset I --hard
git cherry-pick J L M
而我們得到的線性歷史A-B-C-D-E-F-G-H-I-J'-L'-M'
。如果沒有衝突,這兩棵樹的內容相同。