Git flow 出自 A successful Git branching model,這里使用了一個前端項目配合本文稿實施了 git flow 並記錄流程作出示例和參考,對 hotfix 與持續部署略有提及,本意是用作公司內部的技術安利。
所用源碼及文檔本身見於 github jusfr/HelloGitflow
前言
Gitflow 是一種 git 分支管理工具——說是思想也不為過,它使用既定策略區分和管理開發、測試、生產環境的代碼版本,對測試與持續集成友好,與敏捷、迭代的思路一致。
1 准備工作
1.1 創建空白目錄
mkdir HelloGitflow
cd HelloGitflow
1.2 開始當前目錄工作,示例創建和保存一個 index.html
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<div></div>
</body>
</html>
git add index.html
git commit -m "init commit"
2 Git flow init
git flow init
這里使用了默認配置,一路 next
3 一個完整的開發周期
3.1 任務拆解,示例添加了分支 about 和 navigation
git flow feature start about
git flow feature start navigation
任務拆解相當於 story 認領,實際開發中的步驟更加繁冗。
3.2.1 about 分支創建了一個 about.html
git checkout feature/about
# more work to do
git add about.html
git commit -m "add about.html"
3.2.2 navigation 分支創建了一個 nav.html
git checkout feature/navigation
# more work to do
git add nav.html
git commit -m "add nav.html"
3.3 開始合並分支
3.3.1 合並 about
git flow feature finish about
3.3.2 合並 navigation,存在 merge 過程
git flow feature finish navigation
3.4 版本發布
3.4.1 當 feature 積累數量達到可以進行版本發布時,開始進行 release 發布
git flow release start v0.1
3.4.2 部分內容需要修改,在這里為各頁面添加了 title
git add index.html about.html nav.html
git commit -m "add title for each page"
3.4.3 結束當前 release 分支
# git push
git flow release finish v0.1
4 連續的開發周期
我們開始在遠程分支上工作,可以在結束分支前先將其 push 到遠程分支上避免未在本地保留的情況
git remote add github https://github.com/jusfr/HelloGitflow.git
git push github --all
雖然開出來很多分支,但是可以觀察到 master 和合並了兩次,且分別被標記為 v0.1 和 v0.2
不考慮測試等情況,標記 v0.1 和 v0.2 的 master 版本或者 release/v0.1 和 release/v0.2 都是可以部署的版本。
5 線上的 bug 修復
現在已經在 v0.2 基礎上進行 account 和 react 的分支開發,但是發現線上的 v0.2 版本需要立即修復的問題,分支狀態
開啟 hotfix/v0.2.1 來修復這個問題
git flow hotfix start v0.2.1
在 hotfix/v0.2.1 的視角來看,它是從最近的 mater 分支checkout 下來的,所以對正在進行的 account 和 react 無影響
以全局視角來看,hotfix/v0.2.1 與 account 和 react 確實沒有交集
現在問題修復,合並 hotfix/v0.2.1
git flow hotfix finish 'v0.2.1'
當然仍然可以先 push 到遠程分支,可以看到進行了若干步操作
- 合並 hotfix/v0.2.1 到 master 分支,master 分支被打上 v0.2.1 的 tag
- 合並 master 到 develop 分支。
在第2步中,如果 develop 有過變更,比如有過 feature 合並,那么可能存在沖突需要解決
在此示例中, master 分別被打上了 v0.1, v0.2, v0.2.1 標記,這對基於 master 的持續部署非常友好:可以快速在這些版本中部署與回滾,而不用關心存在多少變更與分支等等。