使用 git-flow 自動化你的 git 工作流
- 2019 年 11 月 25 日
- 筆記
介紹一下
git flow
分支模型相信大家或多或少都聽過,先放張圖鎮樓:

上面的圖看不懂沒關係(我也不懂==),今天講的是根據這個分支模型開發的 git-flow
命令行工具。只需要記住幾個簡單的命令,就能在工作中慢慢理解和應用這個分支模型~
安裝 git-flow
我們選擇比較流行的 avh 版本 gitflow-avh
下面以 Mac OS X 為例,安裝命令:
$ brew install git-flow-avh
初始化 Git 倉庫
下面針對一個只有 README.md
的文件夾執行以下命令,有條件的小夥伴可以跟着操作一下,加深記憶。
$ git flow init Initialized empty Git repository in /Users/savokiss/demos/gitflow/.git/ No branches exist yet. Base branches must be created now. Branch name for production releases: [master] Branch name for "next release" development: [develop] How to name your supporting branch prefixes? Feature branches? [feature/] Bugfix branches? [bugfix/] Release branches? [release/] Hotfix branches? [hotfix/] Support branches? [support/] Version tag prefix? [] v Hooks and filters directory? [/Users/savokiss/demos/gitflow/.git/hooks]
可以看到 git flow init
命令會要求你選擇兩個主分支,以及多個功能分支的前綴,我們都使用默認值,而版本號 Tag 前綴使用 v
需要說明的是,git-flow
其實只是一系列 git 命令的組合,init
命令除了會新建分支,不會做其他額外的操作。所以如果以後你不再使用 git-flow
,也不需要做任何變更。
注意上面的 init
操作完成,會自動幫我們切到 develop
分支
Feature 功能分支
假設我們需要新建一個功能分支 auth
來做登錄功能的開發。讓我們先切到 master
分支:
$ git checkout master
然後開始新的功能分支,控制台輸出如下:
$ git flow feature start auth Switched to a new branch 'feature/auth' Summary of actions: - A new branch 'feature/auth' was created, based on 'develop' - You are now on branch 'feature/auth' Now, start committing on your feature. When done, use: git flow feature finish auth
可以看到我們是在 master
分支上執行的命令,但是 feature/auth
分支卻是基於 develop
切出的,因為根據上面的分支模型,所有的功能分支都應該從 develop
分支切出。這也就是 git-flow
的好處,你可以不用在意當前所在的分支,它會自動幫你保證沒有切錯分支~
接下來我們來修改一下 README.md
,添加一句話 登錄功能已經完成!
,然後提交。
然後再執行完成命令,控制台輸出如下:
$ git flow feature finish auth Switched to branch 'develop' Updating e69b22c..f7f48e2 Fast-forward # gitflow | 0 README.md | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 # gitflow create mode 100644 README.md Deleted branch feature/auth (was f7f48e2). Summary of actions: - The feature branch 'feature/auth' was merged into 'develop' - Feature branch 'feature/auth' has been locally deleted - You are now on branch 'develop'
從輸出可以看出:
feature/auth
分支被合併到了develop
分支中。feature/auth
分支被刪除了- 自動切換到了
develop
分支
而在 1 中 git-flow 內部使用如下命令
git merge --no-ff feature/auth
來進行合併,關於--no-ff
參數,簡單來說,可以更好地保留 feature 歷史記錄,感興趣的小夥伴可以自行查閱相關資料哈
Release 版本發佈
通常情況下,我們會使用基於 semver 的語義化版本規範來管理軟件發佈。
git-flow
也支持創建 release
分支。下面我們來發佈一個 0.1.0
版本:
$ git flow release start 0.1.0 Switched to a new branch 'release/0.1.0' Summary of actions: - A new branch 'release/0.1.0' was created, based on 'develop' - You are now on branch 'release/0.1.0' Follow-up actions: - Bump the version number now! - Start committing last-minute fixes in preparing your release - When done, run: git flow release finish '0.1.0'
可以看出,該命令自動基於 develop
切出了 release/0.1.0
分支。 然後提示你在此分支上進行如下操作:
- 修改軟件版本號
- 進行針對此版本的 bug 修復
在正常的開發流程中,提測後的 bug 修復階段就可以在這個 release/0.1.0
分支上做,然後等測試通過後,就可以標記版本發佈完成:
$ git flow release finish 0.1.0 Switched to branch 'master' Switched to branch 'develop' Already up to date! Merge made by the 'recursive' strategy. Deleted branch release/0.1.0 (was f7f48e2). Summary of actions: - Release branch 'release/0.1.0' has been merged into 'master' - The release was tagged 'v0.1.0' - Release tag 'v0.1.0' has been back-merged into 'develop' - Release branch 'release/0.1.0' has been locally deleted - You are now on branch 'develop'
可以看到,當你 finish
了一個 release
,git-flow
內部執行了以下操作:
release/0.1.0
分支被合併到master
和develop
v0.1.0
標籤被打在master
上release/0.1.0
分支被刪除- 當前切換到了
develop
分支
Hotfix 生產熱修復
由於 master
分支一直反映了線上生產環境的狀況,所以如果要進行生產熱修復,就需要從 master
分支切出,下面假如我們線上的 banner
有一個 bug:
$ git flow hotfix start banner Switched to a new branch 'hotfix/banner' Summary of actions: - A new branch 'hotfix/banner' was created, based on 'master' - You are now on branch 'hotfix/banner' Follow-up actions: - Start committing your hot fixes - Bump the version number now! - When done, run: git flow hotfix finish 'banner'
上面可以看出,從 master
切出了一個 hotfix/banner
分支, 接下來你可以在該分支進行生產 bug 修復的提交以及版本號的變更。
需要注意的是:
hotfix
分支和release
分支比較像,唯一的區別是hotfix
分支是基於master
切出的。
我們先修改一下 README.md
文件並提交,然後完成 bug 修復:
$ git flow hotfix finish banner Switched to branch 'develop' Deleted branch hotfix/banner (was c6da343). Summary of actions: - Hotfix branch 'hotfix/banner' has been merged into 'master' - The hotfix was tagged 'vbanner' - Hotfix tag 'vbanner' has been back-merged into 'develop' - Hotfix branch 'hotfix/banner' has been locally deleted - You are now on branch 'develop'
上面完成了:
hotfix/banner
分支被合併到master
和develop
- 這個熱更新被自動打上標籤
vbanner
(由於我們前面設置標籤前綴為 v) hotfix/banner
分支被刪除- 目前切換到分支
develop
由於我沒有關聯遠端
origin
,所以這裡只會提示本地分支被刪除,如果關聯後遠端分支也會被刪除。
完了
上面我們體驗了 git-flow
的基本操作流程。為了方便演示,我是基於一個空項目操作的,實際上也可以針對一個開發了很久的 git 倉庫來進行 git flow init
,它會讓你選擇已經存在的分支作為 生產分支
和 開發分支
以及輸入相應的前綴,其餘不會做任何多餘的操作。
另外 Sourcetree
是一個好用免費的 Git 圖形化客戶端,同時支持 Windows
和 Mac
,並且內置了 git-flow
工具,感興趣的小夥伴也可以嘗試一下~
如果想了解更多,可以參見文末的鏈接,其中有個 cheatsheet
也可以快速熟悉 git flow 命令。
相信有了 git-flow
這個工具,在做分支管理的時候可以相對無痛一點~
參考鏈接
- git-flow avh 版
- semver 語義化版本規範
- Using git-flow to automate your git branching workflow
- git-flow 工作流程
- git-flow cheatsheet 中文版