請看上一篇前端小糾結--約定式提交和自動生成
changelog
javascript
git flow
工做流對比Git工做流指南html
git flow 介紹
git flow
源自這篇文章a-successful-git-branching-model,大神!!!。前端關於
git flow
的使用,請看如下連接,很是多的文章,寫的很是好。java
如何正確的使用git flowlinux
git-branching-model 如圖github
git flow
經常使用的分支如下部份內容來自如何正確的使用git flow博客和gitflow-examplesjson
develop
: 這個分支是咱們是咱們的主開發分支,包含全部要發佈到下一個Release的代碼,這個主要合併與其餘分支,好比Feature分支release/*
: 當你須要一個發佈一個新Release的時候,咱們基於Develop分支建立一個Release分支,完成Release後,咱們合併到Master和Develop分支master
: 也就是咱們常用的Master分支,這個分支最近發佈到生產環境的代碼,最近發佈的Release, 這個分支只能從其餘分支合併,不能在這個分支直接修改hotfix/*
當咱們在生產環境(master)發現新的Bug時候,咱們須要建立一個Hotfix, 完成Hotfix後,咱們合併回Master和Develop分支,因此Hotfix的改動會進入下一個Release全部在Master分支上的Commit應該Tagsegmentfault
feature
分支分支名 feature/*windows
Feature分支作完後,必須合併回Develop分支, 合併完分支後通常會刪點這個Feature分支
release
分支分支名 release/*
Release分支基於Develop分支建立,打完Release分以後,咱們能夠在這個Release分支上測試,修改Bug等。同時,其它開發人員能夠基於開發新的Feature (記住:一旦打了Release分支以後不要從Develop分支上合併新的改動到Release分支)
發佈Release分支時,合併Release到Master和Develop, 同時在Master分支上打個Tag記住Release版本號,而後能夠刪除Release分支了。
minor版本發佈
major版本發佈
hotfix
分支分支名 hotfix/*
hotfix分支基於Master分支建立,開發完後須要合併回Master和Develop分支,同時在Master上打一個tag
hotfix修復分支
support
分支GitFlow沒有真正涵蓋
support
分支,若是須要同時維護多個主要版本,則必不可少。 您也可使用support
分支來支持minor
版本。 若是您只是支持major
,命名support/<major>.x
,minor版本爲support/<major>.<minor>.x
多版本的
git flow
的release
流程只是把master替換爲須要維護的分支。
git flow
工具的使用windows和mac建議使用
sourcetree
客戶端,內置了git flow
流程,具體的使用方法,請自行搜索.固然windows下的git for windows(git bash中)也內置了gitflow-scripts,請參考升級版git-flow-completion完成自動補全功能
若是使用linux,內置了gitflow-scripts(不知道是那個版本),很不負責任的建議使用升級版gitflow-avh.
關於使用git flow工具使用能夠參考如何正確使用Git Flow這篇博客文章
上圖是sourcetree中git flow的菜單
git flow
和standard-version
搭配使用請務必在熟悉
git flow
的基礎上集成使用standard-version
,由於兩個工具的使用不當,會形成衝突。
git flow
流程中standard-version
使用
standard-version
的做用就是生成changelog
更新package.json
和package.lock.json
中的version
字段。因此它在git flow
中使用受git flow
的流程限制。 目前個人經驗是隻能在git flow
的release/*
和hotfix/*
分支中使用。 由於只有這兩個分支涉及到發版流程,而changelog
只有在發版時刻才生成。
git flow
和standard-version
衝突的tag功能
git flow
和standard-version
在使用的過程當中,都有自動打tag
的功能,可是二者都支持跳過tag
階段,因此這也是這兩個工具衝突的地方,建議從二者中選取其一。強烈推薦 standard-version 自動 tag,不推薦使用git flow的tag功能
使用
git flow
自動tag必須保證tag格式standard-version
可以識別,standard-version
使用git-semver-tags解析tag,參考git-semver-tags支持的格式若是standard-version識別tag出現遺漏,會形成生成的
changelog
內容重複。 standard-version默認的tag前綴是v
standard-version
跳過tag
方法
// 方法一: package.json添加配置
{
"standard-version": {
"skip": {
"tag": true
}
}
}
複製代碼
# 方法二:命令行中添加參數
standard-version -r minor --skip.tag
複製代碼
git flow
跳過tag
的方法
# 跳過tag,而且能夠自定義commit message(爲了讓commit message符合約定提交的格式規範)
git flow release finish v0.2.0 -n -m "chore(release): 0.2.0"
複製代碼
standard-version
運行時機
git flow
在release finish
階段是把release/*
分支合併到master
和develop
,因此standard-version
就是要在finish
結束以前運行生成changelog
.
# 1. 模擬一個release流程
git flow release start v0.2.0
# 2. 作一些修改或者commit
git commit -m 'fix(src): 修復問題'
# 3. (可選)若是須要在release/* 分支生成beta測試階段的changelog
npx standard-version -p beta
# 4. release finish 以前
# standard-version不打tag,使用git flow的tag功能
npx standard-version -r v0.2.0
# 5. 正式發佈release,自定義commit message爲了符合約定式提交的格式
git flow release finish v0.2.0 -m "chore(release): 0.2.0"
# 若是你使用了standard-version的tag功能,git flow應該跳過tag
# git flow release finish v0.2.0 -n -m "chore(release): 0.2.0"
複製代碼
hotfix finish
階段和release
很是像是把hotfix/*
分支合併到master
和develop
,可是是否在hotfix
分支生成changelog
還須要自行決定(有衝突的風險)
# 1. 模擬一個hotfix流程
git flow hotfix start v0.2.1
# 2. 作一些修改或者commit
git commit -m 'fix(src): 修復問題'
# 3. finish finish 以前
# standard-version不打tag,使用git flow的tag功能
npx standard-version -r v0.2.1
# patch版本號可使用 patch 替代
# npx standard-version -r patch
# 正式發佈hotfix,自定義commit message爲了符合約定式提交的格式
git flow hotfix finish v0.2.1 -m "chore(release): 0.2.1"
# 若是你使用了standard-version的tag功能,git flow應該跳過tag
# git flow hotfix finish v0.2.0 -n -m "chore(release): 0.2.1"
複製代碼
standard-version
在git flow
不一樣流程階段注意的問題standard-version
在release
流程中注意事項:
release中生成beta版本的changelog
前置條件:
- release 在hotfix以前建立
- hotfix中生成changelog
- release中生成beta版的changelog
release分支的建立時機很重要,
git flow
流程中release在hotfix
以後建立若是建立release分支以後,出現並修復hotfix而且在hotfix生成changelog,
hotfix finish
以後release finish
就會形成release合併到master和develop時出現衝突.解決方案:
release 分支包含
hotfix
內容(release 分支在hotfix以後建立,或者hotfix提取成patch,在release分支上apply)(git flow流程中hotfix是包含在next release中的)
- 若是有更好的方法請告訴我 ~):
standard-version
在hotfix
流程中注意事項:
hotfix
中生成changelog
- release分支在
hotfix finish
以前創建,會出如今release分支同樣的問題
hotfix
分支不生成changelog
- release分支在hotfix finish 以前創建,會形成
hotfix
修復的的日誌沒法出如今changelog中
解決方法:
release 分支包含
hotfix
內容(release 分支在hotfix以後建立,或者hotfix提取成patch,在release分支上apply)
standard-version
不帶參數使用
# 若是直接在分支上,使用
standard-version
複製代碼
若是不指定參數直接使用standard-version
命令,standard-version
會自動分析commit message
類型,若是包含patch就累加patch,有feat就自動累加minor,有break change
就自動生成 major版本號,風險較大,建議指定參數。
工具和流程模型都是根據使用場景,靈活多變的,因此不要侷限於工具和流程模型,實踐出適合本身的流程模型纔是最重要的。