有時候,在分支提交更改的時候,會忘記rebase,就直接提交上去,或者忘記和本地遠程分支做merge,就直接rebase了別的分支。有時候真希望有一種切片的方式,讓自己的分支只需要接上某一段。這個時候你可以使用git中的rebase --onto了。
假設場景 B----C A,現在想將B-C之間的切片(注意邊界的B和C,后文會講到)放到A之上。
假設git rebase --onto A B C,這個demo.A代表的是你實際想要將切片放到哪的分支,B代表切片開始分支(一定要特別注意B的開閉問題,這里rebase --onto的機制是左開右閉)也就是說,如果你真的想要B的這一個節點切片,你應該從B之前的一個分支開始,這個時候git又為我們准備好了,即B~1或者B^,兩者都代表回到B之前的一個節點。C代表的是切片的末尾,此時是閉,也就是說C的當前節點也會被帶到A之上。
很多同學看到這里會說,原來這么簡單,我會了! 其實,你們還忽略了一個很嚴重的問題,即A,B,C哪個分支才是我之后真正的活動分支。即我完成切片操作之后,A的歷史是在切片之上了嗎?
我要告訴你的是,A的歷史壓根就沒有改變。 同學會問:什么!?那我做切片干嗎,我就想在A之上放上我的切片歷史啊! 其實這個時候有一個細節就特別要注意,那就是真正的活動分支是C,也就是說如果你想保留A和C的歷史,你就需要在切片的末尾先建立一個分支temp,這樣我調用命令 git rebase --onto A B~1 temp,也就是說我把B到C之間的歷史加到了A之上,並且當前temp分支的歷史狀態就是我想要的。這樣,你才真正完成了git rebase --onto這個命令。
除了以上的使用場景之外,還有一個用法比較經典。假設你有一段很長的歷史比如A-1-2-3-4-5-6-7-8-B.
這個時候你忽然發現在1的地方,有一處改錯了,但你又不想git reset B~8,進行修改之后再一個一個重寫提交信息。這個時候你就可以用git rebase --onto了。 其實很簡單,假設我們在1這個節點有個錯誤,首先,我在1切一個分支temp,切過去之后做更改,更改完之后我用git commit --amend,即重寫本次提交歷史的。提交之后,我1的提交信息沒有改變,但文件已經被我改變了,好,接下來要做的就是把原來1之后的到B的歷史,加到新的1之上。因為我們通過tig或者gitk可以看到,此時的1和新1完全走的是兩條分支狀態,所以自然而然的我們會想到去這么做。
這個時候就可以用我們的git rebase --onto了, 首先在切片末尾,即B上建立一個活動分支result,然后調用命令git rebase --onto 新1 1 result,注意里面開閉區間的問題,因為我此時已經有1的歷史,所以我應該從1的下一個開始,但又因為是左開又閉,所以我這里就直接寫1就沒問題。這樣就完成了回退歷史做修改,並且可以不用重新寫提交信息的操作,很酷炫吧!
希望這篇文章可以給你在使用git的時候給你幫助,同時留下你的腳印,這也是對我最大的支持,謝謝。