今天瞭解下git的rebase
功能,這裡假設大家已經對git有所學習了,因此不會講解git的其他基礎用法。git是一款工具,所以學習的首要目的是明白其功能有什麼作用,這裡我們一步一步來分析rebase
(變基)的作用。
假設我們需要建立一個分支用來開發產品的新功能,
git checkout -b feature
可以看到我們當前只有兩個分支,並且已經切換到了feature
分支上。
接下來我們在feature
分支下修改檔案test.txt中的內容,在裡面新增content_feature
,儲存並且提交。
git add test.txt
git commit -m 'feature分支'
檢視下提交的情況:
git log --graph --pretty=oneline --abbrev-commit
這時,feature
分支的功能開發完成了,可有時我們可能也會在master
分支下,對同一個檔案做出修改。如這時我們在master
分支下對test.txt檔案新增的內容為content_master
。
同樣是儲存並且提交。
git add test.txt
git commit -m 'master分支'
接下來是重點,當我們feature
新功能開發完成時,就要合併到主分支中了。
git merge featture
可以看到合併內容有衝突,我們需要手動修改。那就改成content_master_feature
吧。
接下來重新提交完成合並:
git add test.txt
git commit -m 'merge_master_feature'
可以看到合併成功。
。。。。總算該講到rebase(變基)了。
變基其實也是一種合併分支的方法。如我們可以切換到feature
分支下後,再用git reabse master
命令進行分支合併。為什麼要切換到feature分支下呢?而這句命令又是什麼意思?
首先,我們得知道,使用merge
合併時,其實是一種三方合併,就是修改後的master
分支和feature
分支,是以修改前的master
分支為基礎進行的合併。盜圖:
可以認為c3,c4分別代表修改後的master
分支,feature
分支,而c2就是修改前的master
分支,做為c3,c4基礎的。
這時再看rebase
變基
這個名稱,不就變換基礎嗎?那把誰變成基礎分支呢?再盜圖:
可以看到,我們把c3作為基礎了,也就時修改後master
分支,而feature
分支的變化直接作用在master
分支上,形成了新的master
分支c4'。實現這些的命令:
git checkout feature
git rebase master
和之前一樣,先要解決衝突,並且如何解決的方法都提供給我們了。
git add test.txt
git rebase --continue
這時,feature(c4')
分支就以修改後的master(c3)
分支為基礎進行的改變。
接下來就可以切換回master
分支,並快速合併兩個分支。
$ git checkout master
$ git merge feature複製程式碼
說到這,,有點想罵人了是不,不是有merge
了嗎?要rebase
這麼麻煩幹嘛啊??請下圖:
沒有變基的合併:
變基後的合併:
嗯嗯,沒錯了,變基的作用就是修整歷史,將分支歷史併入主線。
。。。是不是,這功能看起沒沒啥卵用,其實這功能是需要在某些場景下才會有明顯作用,比如當我們向他人維護的開源專案提交修改時,肯定要先在自己的分支中進行開發,然後再提交,但如果我們變基後再提交,維護人員就不用進行整合工作了,直接快速合併即可。
感覺這些作用對我來說還是好遙遠的啊,,,所以,就先學習到這兒吧,這些比較高階的功能你沒實際的使用場景,學了也會很快忘記,瞭解瞭解即可,等到真的要用到時,也能加快我們的學習速度。
參考: