關於git rebase,git merge,git merge --no-ff的區別


最近在使用git的時候遇到了git merge和git rebase的區別,一開始弄不太懂,於是就上網查了一下相關的資料,然后自己用github實測了一下。現在總結了一下結論分享給大家。

  一、merge和rebase

    首先說一下,merge和mege -no-ff實現的功能是一樣的,因此我們可以把這三個命令分成兩個類,分別是git rebase和git merge。

  1.1 共同點

    首先說一下共同點,首先兩者的作用都是實現兩個分支的合並。另外兩條命令都是本分支送到別的分支上的,也就是說,如果你有一個主分支master,另外你有一個你用來寫代碼的分支test,那么如果你想把test分支merge或者rebase進入master,你就需要處在test中,使用git merge/rebase master把test的代碼合並到master中。

  1.2 區別

    接着說一下兩者的區別,rebase的原始作用是變基,換句話說需要把自己某段分支的代碼送到別的分支上,也就是說,它是以本分支作為基本的,而merge則不同,它是按照兩條分支作為基礎的,如果說兩者之間發生沖突,那么是不能繼續的。這個可能大家現在理解有點難度,等看到后面就會理解的。

  1.2.1 git rebase和git merge --no-ff的區別

    之所以說這兩個命令,是因為這兩個命令在執行過后所呈現的效果讓人比較好理解。簡單來說,git rebase XXX(變基分支),其結果如圖所示。

 

  如圖,分支一是master分支,分支二是test分支,如果我們想把test的分支rebase進入master分支中,那么他所呈現的效果就是1-2-3-4-5-6,換句話說,他把test上的分支移動到了master分支上,如果在報沖突時我們一路skip,那么它最后得到的結果就是test上我們所寫的代碼。也就是說test的分支結果移動到了master分支之后

  而git merge --no-ff則剛好相反,我們還拿上一個做例子,如果我們用git merge XXX --no-ff,那么我們得到的結果就是1-2-5-6-3-4-7(為什么會有7我們稍后解釋)。換句話說,我們把test上的代碼移動到了merge之前。具體請看圖

  1.2.2 git merge和git merge --no-ff的區別

    ok,接着我們說一下git merge和git merge --no-ff的區別,首先正如我前面所說的,兩者所實現的功能其實是一樣的,都是實現代碼合並,實現的最終效果是一樣的,但是no-ff有一個就是可以保存歷史記錄,舉一個例子,比如我們現在有個主分支master提交記錄為A-B-C,此時分出一個分支feature提交記錄為D-E-F,如國此時用master合並feature,那么得到的結果一定是這樣的:A-B-C-D-E-F,此時分支一定是指在F上面,而如果使用merge --no-ff,那么此時得到結果為A-B-C-D-E-F-G,當然從結果來看應該是一樣的,但是如果你萬一有一部分錯了,需要回退,那么你就需要用到no-ff了,因為這樣比較清楚。

  1.3 應用場景

    cherry-pick:這個很好理解,如果你想要某一次提交,那么你就用cherry-pick就行了。

    rebase:一般用於本地分支合並。原因是這樣比較清楚。

    merge:一般用於遠程分支合並,因為別人只會看你最后一次的提交。

  

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM