Git工作流程最佳實踐--git flow

本文參考a-successful-git-branching-model

Git flow是基于git之上的一種軟件開發迭代模型。Git flow是使用git進行源代碼管理的一套行為規范。
Git Flow重點解決的是由于源代碼在開發過程中的各種沖突導致開發活動混亂的問題,提高開發效率。

image

Git Flow中的分支

Git Flow模型中定義了主分支和輔助分支兩類分支。其中主分支用于組織與軟件開發、部署相關的活動;輔助分支組織為了解決特定的問題而進行的各種開發活動。

主分支

  • master分支
  • develop 分支

輔助分支

我們的開發模式旁邊的主要分支機構掌握和發展,使用各種支持分支機構,以幫助團隊成員之間的平行發展,便于跟蹤的功能,準備生產版本,并協助快速修復現場生產問題。 與主分支不同,這些分支總是有有限的生命時間,因為它們最終將被移除。

  • feature分支
  • release分支
  • hotfix分支

feature 分支

  • 從develop分支檢出
  • 必須合并回develop分支
  • 命名規范:除了master, develop, release-*, or hotfix-*

當開始一個新特征的開發時,從develop檢出feature分支。Feature分支的本質是,只要特性處于開發階段,它就會存在,將來會被合并會develop分支(為了即將發布的版本而明確地添加新特性),或者丟棄掉(如果是令人失望的實驗)。

Feature分支只存在于開發者本地,不能被提交到遠程庫

image
創建feature

Switched to a new branch "myfeature"

$ git checkout -b myfeature develop

開發。。。

完成feature

完成的功能可以合并到develop分支,以明確將它們添加到即將發布的版本中:

$ git checkout develop

$ git merge --no-ff myfeature

$ git branch -d myfeature

$ git push origin develop

release分支

  • 從develop分支檢出
  • 必須合并回develop分支和master分支
  • 命名規范:release-*

release分支是為發布新的產品版本而設計的。在這個分支上的代碼允許做小的缺陷修正、準備發布版本所需的各項說明信息(版本號、編譯時間等等)。通過在release分支上進行這些工作可以讓develop分支空閑出來以接受新的feature分支上的代碼提交,進入新的軟件開發迭代周期。

當develop分支上的代碼已經包含了所有即將發布的版本中所計劃包含的軟件功能,并且已通過所有測試時,我們就可以考慮準備創建release分支了。而所有在當前即將發布的版本之外的業務需求一定要確保不能混到release分支之內(避免由此引入一些不可控的系統缺陷)。

創建一個release分支

Release分支從develop分支檢出。例如, 當前產品版本是1.1.5,我們有一個比較大的更新,develop分支已經做好發布準備了,我們新的版本號定位1.2 (而不是1.1.6 或 2.0)。所以,我們從develop分支檢出release分支,命名為release-1.2:

$ git checkout -b release-1.2 develop

$ ./bump-version.sh 1.2

$ git commit -a -m "Bumped version number to 1.2"

這個新的分支可能會存在一段時間,直到發布可能被推出。 在此期間,可以在此分支做一些小的錯誤修復(而不是開發分支)。而不能添加大的新功能。

完成release分支

當release分支準備發布時,需要執行一些操作。 首先,release分支被合并master分支(每往master提交一次,就是一個新的版本)。 接下來,對master的提交必須打tag,以便將來找到這個歷史版本。 最后,release分支所做的更改需要重新合并到develop分支,以便將來的版本也包含這些錯誤修復。

$ git checkout master

$ git merge --no-ff release-1.2

$ git tag -a 1.2

此時,已經發布完成,并打過了tag。

為了保存release分支所做的更改,需要把release分支合并回develop分支

$ git checkout develop

$ git merge --no-ff release-1.2

這個操作可能會有沖突,合并沖突,提交就行了。

現在我們已經完成了,可以刪除release分支了,因為我們不再需要它了:

$ git branch -d release-1.2

hotfix分支:

  • 從master檢出
  • 合并會develop和master分支
  • 命名:hotfix-*
image

hotfix分支非常像release分支,因為它們都意味著即將發布一個新的版本,盡管是未計劃的。

當線上出現一個嚴重的bug,需要立即修復的時候,就需要從master分支上指定的tag版本派生hotfix分支來進行緊急修復工作。

這樣做的顯而易見的好處是不會打斷正在進行的develop分支的開發工作,能夠讓團隊中負責新功能開發的人與負責代碼緊急修復的人并行的開展工作。

創建hotfix

hotfix分支從master檢出。例如,當前線上運行的是1.2版本,出現了嚴重bug。而且develop分支還不夠穩定。可以從master檢出hotfix分支來修復bug:

$ git checkout -b hotfix-1.2.1 master
$ ./bump-version.sh 1.2.1
Files modified successfully, version bumped to 1.2.1.
$ git commit -a -m "Bumped version number to 1.2.1"

修復bug。。。

$ git commit -m "Fixed severe production problem"
完成hotfix

當完成修復,hotfix分支需要合并到master,也要合并到develop分支,以便下個版本也包含這次修復。這個和完成release分支完全相似。

  1. 合并到master并打tag
$ git checkout master

$ git merge --no-ff hotfix-1.2.1

$ git tag -a 1.2.1
  1. 合并到develop分支
$ git checkout develop

$ git merge --no-ff hotfix-1.2.1

注意:有一個例外,如果此時存在release分支時,就需要將hotfix分支合并到release分支,而不是develop分支。其實當release分支完成的時候,這次修復也就被合并到develop分支了。(如果在develop分支的工作立即需要修正這個錯誤,而不能等到release分支完成,也可以將后hotfix分支合并到develop分支。)

最后,刪除這個hotfix分支:

$ git branch -d hotfix-1.2.1

summary

Git Flow開發模型從源代碼管理角度對通常意義上的軟件開發活動進行了約束。應該說,為我們的軟件開發提供了一個可供參考的管理模型。Git Flow開發模型讓nvie的開發代碼倉庫保持整潔,讓小組各個成員之間的開發相互隔離,能夠有效避免處于開發狀態中的代碼相互影響而導致的效率低下和混亂。

所謂模型,在不同的開發團隊,不同的文化,不同的項目背景情況下都有可能需要進行適當的裁剪或擴充。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Git分支管理 master:主分支,當前分支上的代碼隨時可以直接發布,并且只能通過Pull Request從其他...
    UEUEO閱讀 9,752評論 5 33
  • 此次推送的來信來自于一名名叫火火仔的讀者,回復下次推送。 池塘之底,看到你的回信,又感覺自己被翻牌子了,好開心,糾...
    池塘之底閱讀 1,276評論 5 13
  • 我細細輕撫你的眉眼 在你眉間種了一個春天 風吹來時 我剛好看到你的臉 夏至未至 你的短發也已及肩 我借了一場相遇 ...
    李小歪閱讀 374評論 6 13
  • 【摘錄】不去無聊,不去迷茫,不去放縱,獨立思考,清醒果斷,不拖延,無借口。這是 錚錚颯響的A。——雪小禪《在薄情的...
    蘇靜安閱讀 180評論 0 0
  • 嘻嘻,第一次用簡書這個平臺,見到第一眼就喜歡了,給我一種久違的親切感。 從小以來一直就是個喜歡自己跟自己說話的孩子...
    87596a809b1f閱讀 103評論 1 1