承接上篇關於Git(一)-什麼是版本控制系統?,該篇分享會針對「branch」來介紹git。
「分支」的概念就有點像是樹狀圖般,當我們開立一個新分支,那個新分支就會承載舊分支的檔案內容。如下圖所示:
A---B //old branch
\
C //new branch
C節點為新分支的起點,同時它也擁有B節點的檔案內容。
要是我們想要在一個專案上開發新功能的時,也想讓專案的主系統也一併開發,這時就能使用「分支」。它的好處並不只有併行開發,還能防止在開發新功能時,不小心間接影響主系統的程式。要是新功能到最後沒開發成功,也只要將該分支給刪除掉,非常便利。
問題來了,那分支要怎麼建立?別擔心,這邊有兩種方式可以建立:
方法一
$ git checkout -b hotfix //建立名字為hotfix的branch的同時跳到該branch
Switched to a new branch 'hotfix'
方法二
$ git branch hotfix //建立名字為hotfix的branch
$ git checkout hotfix //跳到hotfix的branch
若是分支的開發已經完成想要將新功能納入主系統,這時候就可以使用git的「merge」或「rebase」指令。
「merge」也稱作「合併」,就是將兩個分支中的檔案合併在一起,並在新增一個節點來當合併後的支點。
假設情境如下。有兩個分支,分別是master及hotfix:
A---B //master
\
C---D //hotfix
我們先使用git checkout master
的指令回到master主線上,使用指令git merge
後的結果。可以發現到多了一個E的節點來合併master分支中B及hotfix分之中D節點的檔案。
$ git checkout master
Switched to branch 'master'
$ git merge hotfix
在合併之後,情境如下:
A---B---E //master
\ /
C---D //hotfix
「rebase」也稱作「衍合」,就是將新分支挪到舊分支的後面。讓新分支擁有舊分支的檔案,但舊分支並還未有新分支的檔案。
假設情境如下。有兩個分支,分別是master及hotfix:
A---B //master
\
C---D //hotfix
我們先透過git checkout hotfix
指令轉到hotfix分支裡,並使用git rebase master
指令來將hotfix分支挪到master分支的後面。此時hotfix分支會擁有master分支的檔案,而master分支沒有hotfix分支的檔案。
$ git checkout hotfix
Switched to branch 'hotfix'
$ git rebase master
這邊需要特別注意的是,由於已經將hotfix分支的節點C及節點D挪到master分支後面了,它們的SHA值會與後續的節點C’及節點D’有所不同。這是因為節點C’及節點D’也包含了節點B的資料。
A---B---C'---D'
| |
master hotfix
之後為了讓merger的分支也能擁有hotfix的檔案,在使用git merge
指令來將master分支提撥到最前面就會變成:
A---D---C'---D'
|
master, hotfix
這樣就是mater分支的位置已經移動到hotfix的最新分支上,這樣就會被稱為fast-forward的合併。
一旦分支中的檔案push到remote repository,就不要對該分支進行rebase的操作。因為這會間接干擾到commit歷史紀錄,這部份Pro Git的分支的衍合文章中有更詳細的說明。
只要在確定分支已經合併到master且專案也確定告一段落了,其hotfix這個分支就會是多餘的。這時我可們可使用git branch -d hotfix
指令來刪除hotfix這個分支。
$ git branch -d hotfix
讀者也有可能會擔心要是在還沒merge或rebase前,不小心就刪除分支怎麼辦?其實不用擔心,git有防呆的功能,只要在還沒合併前就輸入刪除指令,則會回應:
$ git branch -d hotfix
error: The branch 'hotfix' is not fully merged.
If you are sure you want to delete it, run 'git branch -D hotfix'.
但若真的執意要刪除,執行它所說的指令git -branch -D hotfix
就可以了。這時就會跳出回應為:
$ git branch -D hotfix
Deleted branch develop (was 81ad552).
代表已經成功刪除。
不知道讀者在看完此篇介紹後,對於branch有沒有更深入了解?branch之所以重要是因為不管是在個人或是團隊的系統開發通常都會使用到該機制。而什麼時候該設立branch,什麼時候又該merger或rebase,這都是個人或團隊在開發初期就要溝通好的規則。
基本的「branch」指令介紹就到此結束,在下篇分享中將會針對git flow來做介紹。