詳細參考: (英文版 )
有時候,在分支提交更改的時候,會忘記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 rebase onto的多種用法
我不是git專家,所以我經常在git中學習會改變我對該工具看法的東西。當顯示git rebase i,我停止了對提交的思考。當我發現git reflog,我對重新部署變得更加自信。但是我認為我被教過的最重要的命令之一是git rebase onto。恕我直言,該檔案在選擇結果方面仍有改進的餘地。如果...
TCP IP詳解 卷1,2,3詳解
大家知道,tcp ip已成為計算機網路的事實上的標準。在關於tcp ip的論著中,最有影響的就是兩部著作。一部是douglas e.comer的 用tcp ip進行網際互連 而另一部就是stevens寫的這3卷書。這兩套巨著都很有名,各有其特點。無論是從事計算機網路的教師還是進行科研的技術人員,這兩...
iptable 詳解 iptable命令詳解1
p protocal protocol 協議 j jump target i in inte ce name 入口 o out inte ce name 出口 f,fragment 分片 指定 p tcp時 source port port port 原埠 也作 sport destionation...