首先,Git Flow
並非Git
的替代品,Git Flow
只是把標準的Git
命令用腳本組合了起來,造成比較有效而簡單的命令。html
Git Flow
只是給咱們提供一個更簡便的工做流程命令,而更重要的是咱們須要去學習和理解關於版本控制系統的工做流程,纔能有效的迭代產品,避免混亂。git
而當項目處於一個多人協做的狀態下,工做流程顯得很是之重要。假設當兩個甚至多個開發者同時再開發各自新功能時,若是在同一分支上進行協做時,這必然會產生大量的衝突。而工做流程的作法,就是每一個開發者能夠各自切出一個獨立分支,當各自功能實現而且測試成功後,再自行合併到master
分支中,甚至無需等待其餘功能實現再一塊兒發佈。github
在Git Flow
中,主要的分支有master
、develop
、hotfix
、release
、feature
這五種分支。master
和develop
分支是咱們最多見的分支,它們被稱做長期分支,一直存活在整個工做流程中,而其它的分支大部分會因任務結束而被刪除。web
該分支主要用來存放穩定、隨時能夠上線的版本。shell
這個分支的來源只能從別的分支合併過來,開發者不會直接commit
到這個分支上。markdown
一般咱們也會在這個分支上的提交打上版本號標籤。curl
這個分支主要是全部開發的基礎分支。ide
當要添加功能時,全部功能都是從這個分支切出去的,而功能分支實現後,也都會合並回來這個分支中。oop
當線上產品發生了緊急問題的時候,就會從master
分支中開一個hotfix
分支出來進行修復。gitlab
當hotfix
分支修復完成以後,就會合併到master
分支中,而且也會合併到develop
分支中。
當develop
分支完成需求後,就能夠從develop
分支中開一個release
分支,進行上線前最後的測試。
測試完成後,釋放release
分支將會同時合併到master
以及develop
分支中。
當咱們須要補充功能的時候,就會從develop
分支中開一個feature
分支進行功能開發。
當功能實現後,在將feature
分支合併到develop
分支中,等待最後的測試發佈。
brew install git-flow
複製代碼
若是沒有安裝brew
的話可以使用下列命令進行安裝:
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
複製代碼
先將項目克隆到本地。
git clone <project-url>
複製代碼
初始化Git Flow
。
git flow init
複製代碼
命令行會提示你是否修改Git Flow
提供的默認分支前綴。不一樣場景的分支前綴不一樣,默認狀況下分支前綴是這樣的。
場景 | 分支前綴 |
---|---|
新功能 | feature |
預發佈 | release |
熱修復 | hotfix |
打標籤 | 空 |
Which branch should be used for bringing forth production releases?
- develop
- master
Branch name for production releases: [master]
Which branch should be used for integration of the "next release"?
- develop
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 Flow
命令時就不須要手動增長分支前綴,Git Flow
會幫你加上。
一般狀況下不須要修改默認的命名前綴,只須要加上-d
就能夠跳過修改命名步驟。
git flow init -d
複製代碼
當咱們須要開發一個新功能的時候,此時須要基於develop
分支拉出feature
分支進行開發,即feature
場景的生命週期開始。
一般來講,一種場景的完整生命週期至少包含如下幾種行爲:
新功能開始開發前,需準備好開發分支。
git flow feature start <feature-name>
複製代碼
執行上面命令後,將會在本地建立一個名爲<feature-name>
的分支,並切換到該分支。
並且不管你當前處於哪一個分支,它都會基於本地develop
分支建立的。
上述命令至關於執行了下面的Git
操做。
git checkout -b feature/<feature-name> develop
複製代碼
須要注意的一點是,該分支是基礎本地的
develop
分支建立,因此執行此命令錢通常須要拉取最新的遠程代碼。
在本地開發完成新功能並進行commit
操做後,須要將本地代碼提交到遠程倉庫。
git flow feature publish <feature-name>
複製代碼
該命令主要作了三件事情:
feature/<feature-name>
的遠程分支track
遠程分支git push origin feature/<feature-name>
git push --set-upstream origin feature/<feature-name>
git push origin
複製代碼
當你執行後publish
操做後,後續還須要進行代碼提交的話,只需執行正常的push
命令既可。
git push
複製代碼
當功能開發完畢後就將進入測試階段,此時須要將該分支合併到develop
分支。
git flow feature finish <feature-name>
複製代碼
該命令也主要作了三件事情:
develop
分支develop
分支feature/<feature-name>
分支git checkout develop
git merge feature/<feature-name>
git branch -d feature/<feature-name>
複製代碼
Git Flow
的merge
操做與默認的git merge
操做有些不一樣。
默認狀況下它會檢查本次merge
有多少commit
記錄,若是僅有一條的話採用fast-forward
模式,即只移動HEAD
指針而不會生成提交記錄;若是超過一條commit
的話,這採用no-ff
模式,該模式下則會多生成一條merge
的commit
記錄。
這樣作的好處是當有多條提交記錄時方便進行代碼回退和記錄監察,而只有單條提交記錄的時候則簡化代碼提交記錄從而便於管理。
當finish
操做過程當中,若是merge
發生了衝突,則會終端finish
操做,不會刪除feature/<feature-name>
分支,同時也處於develop
分支上。
當本地衝突解決並commit
後,從新進行finish
操做便可。
另外,finish
指令還支持三個附加參數:
-r
:即merge前先執行rebase
,但即便rebase
後符合fast-forward
條件也不必定會用fast-forward
。-F
:即合併完成連同遠程分支一併刪除。-k
:即保留本地feature
分支,不執行delete
動做。當新功能開發完成後,將進入測試階段,此時須要基於develop
分支拉出release
分支進行集成測試,也有將release
場景做爲預發佈環境進行測試。
在這種狀況下,通常而言release
只有少數改動。
使用start
開啓一個release
場景。
git flow release start <release-name>
複製代碼
該命令會基於本地的develop
分支建立一個release/<release-name>
分支,並切換到這個分支。
須要注意一點是,若是本地還有未
finish
的release
分支的話,將不容許使用start
指令開啓新的release
分支,這一點是對並行發佈的一個限制。
爲了讓其餘協同人員可以看到該分支並一同測試,須要將其發佈出去。
git flow release publish <release-name>
複製代碼
待測試經過後須要發佈正式版:
git flow release finish <release-name>
複製代碼
該命令的動做會比較多,大體是:
git fetch
,拉取最新的代碼master
分支<release-name>
的tag
develop
分支release/<release-name>
分支develop
分支若是merge
產生衝突不會終止流程,只是不會將本地的release
分支刪除。待解決完衝突後需再次執行finish
操做。
finish
只是完成了本地代碼的一系列操做,可以使用下列命令進行推送全部的分支和tag
。
git push origin --all
git push origin --tag
複製代碼
若是在線上發現了bug,須要進行緊急修復的時候,就須要用到了hotfix
場景。
git flow hotfix start <hotfix-name>
複製代碼
該命令將從master
分支建立了一個hotfix/<hotfix-name>
的分支並切換到該分支。
hotfix
沒有publish
命令,由於Git Flow
認爲hotfix
應該是小範圍的改動,不須要其餘協同人員參與。
但本地修改結束並進行commit
操做後,則執行finish
操做。
git flow hotfix finish <hotfix-name>
複製代碼
該命令所作任務與release
基本相同,先拉取代碼,而後將分支合併到master
、develop
分支中,而且打上tag,而後刪除該分支,最後切回develop
分支。
與Git Flow
類似的代碼管理工做流還有Github Flow和[Gitlab Flow][docs.gitlab.com/ee/topics/g…
Github Flow
是簡化版的Git Flow
,它使用了main
和feature
來管理代碼,它只有一個長期分支,就是main
。Gitlab Flow
更關注代碼的持續集成,一個版本須要建立測試環境、預覽環境、生成環境的分支,最後彙總到stable branch
分支用於發佈。