Git Workflow — 善用Git分支強化專案的開發流程
Git 是一個分散式的版本控制系統,我們可以用它來控管專案的版本管理。
這篇文章的重點在於,如何善用Git的分支(branch)與合併(merge) 或者rebase來定義開發流程,因此在這邊不會介紹Git的基本指令,有興趣的可以看看:
裡面介紹了Git的基本用法,是一篇很好的文章。
概念介紹
我們根據專案開發可以列出如下的分支:
Master branch: 主線,該專案的預設分支線。
Develop branch: 開發線
Feature branches: 開發新功能的分支,只經由develop branch分支出來,慣例是以新功能的用途命名,當新功能開發完成便會併回develop branch。
Release branches: 負責專案發布新版本的分支,會經由develop branch分支出來,當該版本的發布完成後會併回develop跟master branch。
Hotfix branches: 當正式版本的產品需要立即解決問題所使用的分支,當緊急修改完成後,該分支就會併回master與release branch,再由release合併到develop去更新緊急修正的部分。
實際操作
我使用平常開發使用的SourceTree來顯示git repo的進展。
讓我們來看看以下範例:
Master branch
在建立git repository時,預設就會有一個master分支:
$ git branch
* master
加入master1.txt到master branch
$ touch master1.txt
$ git add master1.txt
$ git commit -m "Add master1.txt"
Develop branch
開一個develop branch,並切換到develop
$ git branch develop
$ git checkout develop
或者也可以直接用 git checkout -b develop
,便會新增且切換到新的分支
從SourceTree看看目前的情況:
因為develop剛由master分支出來,所以目前master與develop的進度相同。
接著我們快轉一下直接看看圖:
可以看到目前我在develop分支(紅色線)上增加了幾個commit,兩條線在第五點的時候曾經合併(merge)過,但後來兩條分支已有不同的走向。
Feature branches
在共同協作的情境下,我們會將develop branch當作每個人開發時期的主線,因此當我們想要替專案加上新的功能,應該從develop分支延伸出新的feature分支,讓我們看看下圖:
會看到我們從develop branch(藍色線)上新增了feature1與feature2。
feature1是由develop的 ‘Modify mastet2.txt on develop’ 這個commit分支出來,並增加了2個commit。
而我們模擬develop這條線繼續往前進,並在 ‘Modify develop1.txt’ 分支出feature2,並增加2個commit後合併回develop。
這樣就如同新功能開發完成後,將它併回develop開發線上一樣。
Release branches
如上圖可以想像的情境是,我們在feature2開發完畢後,將它合併回develop — Merge branch ‘feature2’ into develop,此時我們也許認為專案已經到了可以發布新版本的地步,或者在之前已經訂了新版的發布日期。
那麼這時,我們會從develop開一個 ‘release’分支:
$ git checkout -b release
而這個‘release’分支不應該再拿來開發新功能,只有跟新發佈的事務有關的更新才適合加在新的分支上面(例如修bug、加上文件說明)。
而確定產品發佈時,便回將release併入master,然後使用Git tag功能加上版本號,例如:
$ git checkout master
$ git merge release
$ git tag -a "v0.1"
並且在發佈新版本之後,要將release再併回develop更新開發線的進度。
Hotfix branches
這個分支顧名思義是拿來做緊急修護的補丁(patch)用的,因為一個持續發展的develop與feature branch會充滿各種新的代碼,而我們為了在新版的發佈後修補正式環境的bug,所以這個分支會由master衍生出來。
如上圖所示,我們先從master分支出hotfix,修正bug後,便將併入master與develop,以及在master上加上tag標注新的版本號:
$ git checkout master
$ git checkout -b hotfix
...(fix bug)
$ git checkout master
$ git merge hotfix
$ git tag -a "v0.2"# Merge into devlop
$ git checkout develop
$ git merge hotfix
介紹完5種分支,其實可以發現目的都差不多,就是用一條專用的分支去完成特定的工作而不要干擾到其他正在進行的工作流程。
最後附上範例的github連結: