git:rebase(變基)的使用和理解

newbeehh發表於2018-07-13

今天瞭解下git的rebase功能,這裡假設大家已經對git有所學習了,因此不會講解git的其他基礎用法。git是一款工具,所以學習的首要目的是明白其功能有什麼作用,這裡我們一步一步來分析rebase(變基)的作用。

假設我們需要建立一個分支用來開發產品的新功能,

 git checkout -b feature

git:rebase(變基)的使用和理解

可以看到我們當前只有兩個分支,並且已經切換到了feature分支上。

接下來我們在feature分支下修改檔案test.txt中的內容,在裡面新增content_feature,儲存並且提交。

git add test.txt

git commit -m 'feature分支'

檢視下提交的情況:

git log --graph --pretty=oneline --abbrev-commit 

git:rebase(變基)的使用和理解

這時,feature分支的功能開發完成了,可有時我們可能也會在master分支下,對同一個檔案做出修改。如這時我們在master分支下對test.txt檔案新增的內容為content_master

同樣是儲存並且提交。

git add test.txt

git commit -m 'master分支'

git:rebase(變基)的使用和理解

接下來是重點,當我們feature新功能開發完成時,就要合併到主分支中了。

git merge featture

git:rebase(變基)的使用和理解

git:rebase(變基)的使用和理解

可以看到合併內容有衝突,我們需要手動修改。那就改成content_master_feature吧。

git:rebase(變基)的使用和理解

接下來重新提交完成合並:

git add test.txt

git commit -m 'merge_master_feature'

git:rebase(變基)的使用和理解

可以看到合併成功。

。。。。總算該講到rebase(變基)了。

變基其實也是一種合併分支的方法。如我們可以切換到feature分支下後,再用git reabse master命令進行分支合併。為什麼要切換到feature分支下呢?而這句命令又是什麼意思?

首先,我們得知道,使用merge合併時,其實是一種三方合併,就是修改後的master分支和feature分支,是以修改前的master分支為基礎進行的合併。盜圖:

git:rebase(變基)的使用和理解

可以認為c3,c4分別代表修改後的master分支,feature分支,而c2就是修改前的master分支,做為c3,c4基礎的。

這時再看rebase變基這個名稱,不就變換基礎嗎?那把誰變成基礎分支呢?再盜圖:

git:rebase(變基)的使用和理解

可以看到,我們把c3作為基礎了,也就時修改後master分支,而feature分支的變化直接作用在master分支上,形成了新的master分支c4'。實現這些的命令:

git checkout feature

git rebase master

git:rebase(變基)的使用和理解

和之前一樣,先要解決衝突,並且如何解決的方法都提供給我們了。

git add test.txt

git rebase --continue

這時,feature(c4')分支就以修改後的master(c3)分支為基礎進行的改變。
接下來就可以切換回master分支,並快速合併兩個分支。

$ git checkout master
$ git merge feature複製程式碼

git:rebase(變基)的使用和理解

說到這,,有點想罵人了是不,不是有merge了嗎?要rebase這麼麻煩幹嘛啊??請下圖:

沒有變基的合併:

git:rebase(變基)的使用和理解

變基後的合併:

git:rebase(變基)的使用和理解

嗯嗯,沒錯了,變基的作用就是修整歷史,將分支歷史併入主線

。。。是不是,這功能看起沒沒啥卵用,其實這功能是需要在某些場景下才會有明顯作用,比如當我們向他人維護的開源專案提交修改時,肯定要先在自己的分支中進行開發,然後再提交,但如果我們變基後再提交,維護人員就不用進行整合工作了,直接快速合併即可。

感覺這些作用對我來說還是好遙遠的啊,,,所以,就先學習到這兒吧,這些比較高階的功能你沒實際的使用場景,學了也會很快忘記,瞭解瞭解即可,等到真的要用到時,也能加快我們的學習速度。

參考:

git的官網教程

某個大神的深入講解


相關文章