Git 版本控制 branch model 分支模組基本介紹

我相信大家對於 Git 版本控制不陌生了,Git 最大強項就是可以任意建立 branch,讓您開發程式不需要擔心原本的程式碼會被動到,造成不知道該怎麼恢復原來的狀態。為了不影響產品發展,branch 對於大型工作團隊就顯得更重要了,今天在網路上看到一篇 A successful Git branching model 文章,裡面把 branch 使用方式寫得非常清楚,底下我會透過指令來說明如何使用簡單 branch 指令,當然請大家先去 github 註冊申請帳號,如果不想申請帳號,也可以自己在 local 端去執行。

底下所引用的圖片都是經由 A successful Git branching model 文章所提供。

git-flow

看到這張圖其實就說明了 branch 最重要的精神:『無限建立分支』,大家也不用害怕看不懂這張圖,底下說明 branch 分支狀況

主要分支

  • master 主程式(除非重大 bug,則會分出 hotfix 分支)
  • develop 開發分支(用來在另外分支出 Release, feature)

次要分支

  • Hotfixes(由 master 直接分支,馬上修正 bug)
  • Feature(由 develop 直接分支,開發新功能)
  • Release(由 develop 直接分支,開發下一版 Release)

主要分支 ( The main branches )

當專案開始執行時,我們這時候必須將程式碼分成兩部份,一個是 master 另一個就是 develop,master 主要用來 Release 產品專用,沒事就不要去動它,假如要繼續開發新功能,或者是修正 Bug issue 就利用 develop 這分支來開發,等待開發完成,要 Release 下一版產品時就將 develop merge 到 origin/master 分支,這樣才對,避免有人把 origin/master 改爛,底下這張圖就說明了一切:

bm002

次要分支 ( Supporting branches )

次要分支這裡包含了 Hotfixes, Feature, Release,其中 Hotfixes 用來修正產品最重大 bug,所以由 origin/master 直接分支出來,修正之後在 merge 回 master 跟 develop。Feature 跟 Release 都是從 develop 分支出來,最後都 merge 回 develop branch,主分支 master 再去 merge develop,這樣就完成了。上面的例子,不一定套用在各專案,因為 branch 免錢,要多少有多少,不一定完全都要 follow 此方法。

新功能分支 ( Feature branches )

branch off from: develop Must merge back into: develop

fb

看到上面圖說明,我想大家都很清楚,develop 分支出 Feature branch,用來開發產品新功能,等到開發完整之後,在直接 merge 回 develop,底下直接用實際例子來操作:

直接由 develop 開出分支 myfeature,並且直接切換過去

git checkout -b myfeature develop

直接下 git branch 觀看目前位置

develop master * myfeature

經過編輯修改並且 commit

git add test.php
git commit -a -m "Add: test.php"

合併分支:先切換到 develop

$ git checkout develop
Switched to branch 'develop'

利用 –no-ff 合併分支(稍後說明為什麼使用 –no-ff)

$ git merge --no-ff myfeature
Merge made by recursive.
 test.php |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)
 create mode 100644 test.php

刪除 myfeature 分支

$ git branch -d myfeature
Deleted branch myfeature (was dedf7ed).

將資料上傳

$ git push origin develop

在說明 git merge –no-ff 之前,大家先看底下的圖。

merge-without-ff

有沒有很清楚發現差別,右邊是正常的 merge,會將原本的 commit log 合併成一條,然而如果加上 –no-ff option 的話,commit log 會紀錄您是開分支出去的,清楚紀錄您的分支操作步驟,建議大家多使用此方法,畢竟預設的 merge 看到的效果不是我想要的。

Release branches

May branch off from: develop Must merge back into: develop and master Release branch 跟 feature branch 不同點就是: 前者需要 merge 回 master,後者不需要,所以操作步驟會多一點,但是觀念不變啦。底下實際看個例子,操作一次,大家就可以熟悉了。

從 develop 開新分支 release-1.3

git checkout -b release-1.3 develop

經過一堆 commit message

git commit -a -m "Update: release 1.3"

切回去主分支 master

git checkout master

master 合併 release-1.3 分支

git merge --no-ff release-1.3

在 master 上面加上新 tag

git tag -a v1.3 -m "Release v1.3 Tag"

切換到 develop 分支

git checkout develop

一樣是 merge release-1.3

git merge --no-ff release-1.3

上傳資料

git push

將新 Tag v1.3 更新到 origin/master

git push origin v1.3

刪除 release-1.3 分支

$ git branch -d release-1.3
Deleted branch release-1.3 (was 2c92042).

重大 issue 分支 ( Hotfix branches )

May branch off from: master Must merge back into: develop and master

Branch naming 命名方式: hotfix-*

hotfix-branches1

當我們產品線發現 critical bug 時,這就要從 master 拉出 hotfix-* 分支,儘快將 bug 解決,並且同時 merge 到 develop 跟 master,底下實際例子操作:

從 master 開新分支 release-1.3

git checkout -b hotfix-1.3.1 master

修改檔案,並且 commit

git commit -a -m "Hotfix: release 1.3.1"

切換到 master

git checkout master

merge hotfix-1.3.1 分支

git merge --no-ff hotfix-1.3.1

加上修正過後的 Tag

git tag -a v1.3.1 -m "Hotfix v1.3.1 Tag"

切換到 develop 分支

git checkout develop

一樣是 merge hotfix-1.3.1 分支

git merge --no-ff hotfix-1.3.1

合併過後就刪除 hotfix-1.3.1 分支

git branch -d hotfix-1.3.1

上傳資料

git push

將 Tag v1.3.1 上傳

git push origin v1.3.1

可以直接看看我的例子 https://github.com/appleboy/test/network 畫出來的 network 圖就是長那樣…

看完上面例子,是否清楚瞭解 branch 的基本用法,其實不會很難,看圖說故事而已,git Tag 的用法可以參考之前寫的一篇:『git-版本控制-如何使用標籤tag』。如果有任何問題,都可以在此留言。