為什麼使用 Git-flow 工作流
聯想樂窗專案組-前端組 張晉佩整理
內容摘自網上,如有侵權,聯絡刪除
Git-flow 工作流介紹
主要內容
本文主要分主要包括以下幾個部分的內容
- 集中式工作流
- 功能分支工作流
- 功能分支工作流的問題
- git flow 的分支模型介紹
- git flow 的工作方式
- git flow 的操作命令
- smartgit 中使用 git flow
- 命令列使用 git flow
集中式工作流
所有的功能開發與修改都在 master 分支上進行的。開發者開始先克隆中央倉庫。在自己的專案拷貝中像SVN一樣的編輯檔案和提交修改;但修改是存在本地的,和中央倉庫是完全隔離的。開發者可以把和上游的同步延後到一個方便時間點。
在開發者提交自己功能修改到中央庫前,需要先fetch在中央庫的新增提交,rebase自己提交到中央庫提交歷史之上。
這樣做的意思是在說,
我要把自己的修改加到別人已經完成的修改上。
最終的結果是一個完美的線性歷史。 如果本地修改和上游提交有衝突,Git 會暫停 rebase 過程,給你手動解決衝突的機會。
功能分支工作流
功能分支工作流以集中式工作流為基礎,不同的是為各個新功能分配一個專門的分支來開發。功能分支工作流背後的核心思路是所有的功能開發應該在一個專門的分支,而不是在 master 分支上。
這個隔離可以方便多個開發者在各自的功能上開發而不會弄亂主幹程式碼。
功能分支應該有個有描述性的名字,比如animated-menu-items或issue-#1061,這樣可以讓分支有個清楚且高聚焦的用途。
功能分支工作流的問題
git的branch非常的強大,但是git本身並沒有對如何管理branch做出建議. 多人在同一倉庫下,程式碼的
協作問題會越來越突出. 首先來看看我們之前專案的分支。
我們的問題:
分支眾多,命名混亂有的分支用於測試,有的用於程式碼合併,有的分支已經被廢棄,時間久了無法瞭解分支的具體用途。
混亂瘋狂的分支合併操作,多個分支互相合並,出現問題難以回滾。
混亂的分支
瘋狂的合併
git flow 分支模型的介紹
Gitflow工作流是經典模型,體現了工作流的經驗和精髓。隨著專案過程複雜化,會感受到這個工作流中深思熟慮和威力!
Gitflow工作流沒有用超出功能分支工作流的概念和命令,而是為不同的分支分配一個很明確的角色,並定義分支之間如何和什麼時候進行互動。
master分支
最為穩定功能比較完整的隨時可釋出的程式碼,即程式碼開發完成,經過測試,沒有明顯的bug,才能合併到 master 中。請注意永遠不要在 master 分支上直接開發和提交程式碼,以確保 master 上的程式碼一直可用;
develop分支
用作平時開發的主分支,並一直存在,永遠是功能最新最全的分支,包含所有要釋出 到下一個 release 的程式碼,主要用於合併其他分支,比如 feature 分支; 如果修改程式碼,新建 feature 分支修改完再合併到 develop 分支。所有的 feature、release 分支都是從 develop 分支上拉的。
feature分支
這個分支主要是用來開發新的功能,一旦開發完成,通過測試沒問題(這個測試,測試新功能沒問題),我們合併回develop 分支進入下一個 release 。
release分支
用於釋出準備的專門分支。當開發進行到一定程度,或者說快到了既定的釋出日,可以釋出時,建立一個 release 分支並指定版本號(可以在 finish 的時候新增)。開發人員可以對 release 分支上的程式碼進行集中測試和修改bug。(這個測試,測試新功能與已有的功能是否有衝突,相容性)全部完成經過測試沒有問題後,將 release 分支上的程式碼合併到 master 分支和 develop 分支。
hotfix分支
用於修復線上程式碼的bug。從 master 分支上拉。完成 hotfix 後,打上 tag 我們合併回 master 和 develop 分支。
注意事項:
- 所有開發分支從 develop 分支拉。
- 所有 hotfix 分支從 master 拉。
- 所有在 master 上的提交都必要要有 tag,方便回滾。
- 只要有合併到 master 分支的操作,都需要和 develop 分支合併下,保證同步。
- master 和 develop 分支是主要分支,主要分支每種型別只能有一個,派生分支每個型別可以同時存 在多個。
git flow 的工作方式
初始化分支
預設會初始化 master develop 兩個主幹分支。如果已有了不同分支,初始化的時候,可能需要手動指定 master 分支 跟 develop 分支。
開發分支 feature
- 分支的名稱都是以 feature/*-20170323 打頭,不需要做修改
- 基於develop分支,可以有多個特徵分支進行開發
- feature分支做完後,必須合併回develop 分支,合併完分支後一般會刪除這個 feature 分支(也就是 finish 一般由測試進行,或者經過測試允許),也可以視情況保留
釋出分支 release
- 分支名稱以 release/*-20170323 打頭
- release分支基於develop建立; 一旦建立了release分支,不能在從 develop 分支合併新的改動到 release 分支,可以基於release分支進行測試和bug修改,測試不用在另外建立用於測試的分支。
- release 釋出的時候,合併到 master 和 develop 分支,同時打tag,視情況刪除release分支,通常應該刪除掉
維護分支 hotfix
- 分支名稱以 hotfix/* 開頭
- hotfix 分支基於 master 分支建立,開發完畢後合併到 master 和 develop 分支,同時建立 tag
- 這是唯一可以直接從 master 分支 fork出來的分支。
git flow 操作命令
安裝
brew install git-flow(mac)
apt-get install git-flow(ubuntu)
使用概覽
初始化git flow
- 初始化
git flow init
feature分支相關操作
建立新的feature分支
git flow feature start 分支名稱
推送feature分支到遠端
git flow feature publish 分支名稱
- 獲取feature分支
git flow feature pull origin 分支名稱
- 完成feature
git flow feature finish 分支名稱
release分支相關操作
- 建立release分支
git flow release start 分支名稱 [base]
這裡的base代表是基於那個feature分支建立的release分支
推送release分支
git flow release publish 分支名稱
完成一個release分支
git flow release finish 分支名稱
hotfix 分支操作類似
smartgit 使用 git flow
smart git配置
啟用smart git
採用full配置
feature分支操作
配置完成之後,我們看到master和develop這兩個主分支已經建立成功.
按照規範建立feature分支名稱
可以同時有多個feature分支
完成feature分支
刪除原有的feature分支
release分支操作
建立release分支
finish release分支
如果不勾選第一項 和 第四項 在第三步的時候需要手動合併 master
準備釋出
hotfix分支操作
hotfix的建立操作同上
finish hotfix分支
同理,不勾選第一項 和 最後一項 需要手動將修改merge 回 develop
命令列使用git flow
建立develop分支
git branch develop
git push -u origin develop
開始新feature開發
git checkout -b 分支名稱 develop
# 推送到遠端 可選
git push -u origin 分支名稱
3、完成feature
git pull origin develop
git checkout develop
git merge --no-ff 分支名稱 // develop 合併 feature
git push origin develop
git branch -d 分支名稱 //刪除分支
git push origin --delete 分支名稱 // 刪除遠端分支
建立release分支
git checkout -b 分支名稱 develop // 從develop分支建立 release 分支
完成release分支
// 合併 release 分支到 master
git checkout master
git merge --no-ff 分支名稱
git push
// 合併 release 分支 到 develop
git checkout develop
git merge --no-ff 分支名稱
git push
// 刪除 release 分支
git branch -d 分支名稱
git push origin --delete 遠端分支名稱
建立hotfix分支
git checkout -b 分支名稱 master
完成hotfix分支
git checkout master
git merge --no-ff 分支名稱
git push
git checkout develop
git merge --no-ff 分支名稱
git push
git branch -d 分支名稱
git tag -a tag tag名稱 master
git push --tags