# Gitflow 工作流程
* 它是git工作流程的抽象概念;
* 它適合具有預定發布周期的項目;
* 它不會添加超出功能分支工作流程所需的任何新概念或命令;
* 相反,它為不同的分支分配非常具體的角色,并定義它們應該如何以及何時進行交互;
* 除功能分支外,它還使用獨立的分支來準備,維護和記錄版本;
* 當然,您仍可以充分利用功能分支工作流程的所有優勢:拉取請求,隔離實驗和更有效的協作;
* 除了抽象的Gitflow Workflow想法之外,還有一個更有形的git-flow工具集,它與Git集成以提供專門的Gitflow Git命令行工具擴展。
### gitflow工具集:
macOS安裝: `$ brew install git-flow`
windows安裝:需下載,https://git-scm.com/download/win
使用gitflow工具: `$ git flow init`
* * * * *
### 如何運行的?
#### 開發分支(develop)和主分支(master)
利用兩個分支來記錄項目歷史:開發分支和主分支。
主分支(master)存儲正式發布歷史,而開發分支(develop)則用作功能(feature)的集成分支。
使用版本號標記(tag)主分支(master)中的所有提交也是很方便的。

圖1:開發分支與主分支
操作步驟:
從主分支(master)擴展一個空的新分支,命名為開發分支(develop)。然后推送到服務器。
```bash
$ git branch develop
$ git push -u origin develop
```
在已有的倉庫中執行 `$git flow init` ,將會自動創建開發分支(develop)。
如果是全新的倉庫,會同時創建主分支(master)和開發分支(develop)。
```bash
$ git flow init
Initialized empty Git repository in ~/project/.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/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
$ git branch
* develop
master
```
* * * * *
### 功能分支(feature)
功能分支(feature)應該從開發分支(develop)拉取,并在開發完成后推送回開發分支。
功能分支(feature)不應該與主分支(master)直接交互。

圖2:功能分支(feature)
每個新的功能分支都應該創建自最新的開發分支。
#### 1、創建功能分支
* 不使用git-flow擴展:
```bash
$ git checkout develop
$ git checkout -b feature-branch
```
* 使用git-flow擴展:
```bash
$ git flow feature start feature-branch
```
#### 2、完成功能分支
* 不使用git-flow擴展:
```bash
$ git checkout develop
$ git merge feature-branch
```
* 使用git-flow擴展:
```bash
$ git flow feature finish feature-branch
```
* * * * *
### 發布分支(release)

圖3:發布分支(release)
當開發分支中積累了一定的發布功能,或者臨近預定的發布日期時,我們可以從開發分支中分離出一個發布分支。
創建此分支將啟動下一個發布周期,此時開始發布分支不應再添加任何新功能,只能做一些錯誤修復,文檔生成或其他面向發布的任務。
一旦準備好發布,發布分支就會合并到主服務器并標記版本號。
此外,它應該合并回到開發分支中,以同步發布分支創建以來可能已經取得的進展。
使用專用分支準備發布使一個團隊可以完善當前版本,而另一個團隊繼續為下一個版本開發功能。
它還創建了明確定義的開發階段(例如,很容易說,“本周我們正在為版本4.0做準備”,并且實際上在存儲庫的結構中看到它)。
發布分支是另一種簡單的分支操作。與功能分支一樣,發布分支基于開發分支。
#### 創建發布分支
可以使用以下方法創建新的發布分支。
* 不使用git-flow擴展:
```bash
$ git checkout develop
$ git checkout -b release/0.1.0
```
* 使用git-flow擴展:
```bash
$ git flow release start 0.1.0
Switched to a new branch 'release/0.1.0'
```
#### 完成發布分支
使用以下方法完成發布分支:
* 不使用git-flow擴展:
```bash
$ git checkout develop
$ git merge release/0.1.0
```
* 使用git-flow擴展:
```bash
$ git checkout master
$ git checkout merge release/0.1.0
$ git flow release finish '0.1.0'
```
* * * * *
### 緊急修復分支(hotfix)

圖4:緊急修復分支(hotfix)
緊急修復分支基于主分支(master),用于快速發布產品補丁。此分支是唯一直接從主分支(master)分離出來的分支。
緊急修復分支完成后應該馬上合并回主分支,并合并到開發分支(develop)或者發布分支(release)。
然后,主分支應該馬上被打上新的版本號tag。
通過專門的緊急修復開發,您的團隊可以解決問題,而無需中斷工作流的其余部分或等待下一個發布周期。
您可以將維護分支/緊急修復分支視為直接與主分支(master)一起工作的臨時發布分支。
可以使用以下方法創建緊急修復分支:
* 不使用git-flow擴展:
```bash
$ git checkout master
$ git checkout -b hotfix_branch
```
* 使用git-flow擴展:
```bash
$ git flow hotfix start hotfix_branch
```
如同結束發布分支(release)一樣,我們應該將緊急修復分支(hotfix)合并回主分支(master)和開發分支(develop)。
```bash
$ git checkout master
$ git merge hotfix_branch
$ git checkout develop
$ git merge hotfix_branch
$ git branch -D hotfix_branch //刪除本地和遠程分支
```
或者使用git-flow擴展:
```bash
$ git flow hotfix finish hotfix_branch
```
* * * * *
### 示例代碼
#### 功能分支完整示例:
假設有一個包含主分支(master)的倉庫:
```bash
$ git checkout master
$ git checkout -b develop
$ git checkout -b feature_branch
// 在feature_branch分支上進行新功能開發工作...
// ...
// 完成新功能開發
$ git checkout develop
$ git merge feature_branch
$ git checkout master
$ git merge develop
$ git branch -d feature_branch // 刪除本地功能分支;若要同時刪除遠程,參數改成-D
```
在功能開發(feature)和發布開發(release)流程之間,緊急修復流程示例如下:
```bash
// 新建緊急修復分支
$ git checkout master
$ git checkout -b hotfix_branch
// 緊急修復bug
// ...
// 修復完成
// 合并到開發分支
$ git checkout develop
$ git merge hotfix_branch
// 合并到主分支
$ git checkout master
$ git merge hotfix_branch
// 刪除緊急修復分支
$ git branch -d hotfix_branch // 參數-D,同時刪除本地和遠程分支
```
### 總結
gitflow整體流程:
1. 開發分支(develop)創建自主分支(master);
2. 發布分支(release)創建自開發分支(develop);
3. 功能分支(feature)創建自開發分支(develop);
4. 功能分支(feature)開發完成后,合并回開發分支(develop);
5. 發布分支(release)完成后,合并回開發分支(develop)和主分支(master);
6. 若主分支(master)發現問題需要修復,從主分支(master)創建緊急修復分支(hotfix);
7. 緊急修復(hotfix)完成后,合并回開發分支(develop)和主分支(master);