妙用git rebase --onto指令

來源:互聯網
上載者:User

標籤:使用   strong   檔案   問題   re   c   

    有時候,在分支提交更改的時候,會忘記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的時候給你協助,同時留下你的腳印,這也是對我最大的支援,謝謝。       

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.