Git FLow是什么
Git Flow是構建在Git之上的一個組織軟件開發活動的模型,也是軟件開發過程中一種成功的分支管理策略。它的核心思想是利用成功的分支管理策略,管理軟件的開發過程。
2010年5月,nvie 在他的“A successful Git branching model”一文中,介紹了這種模型,并將其命名為Git Flow。而且,他還為這種分支策略開發了一套Git擴展工具,我們可以在Git中,使用專屬的分支管理命令操作分支。
因此,Git Flow 是一種軟件開發模型,由一種分支管理策略,和一套與之配套的Git擴展工具組成。
下面這張圖,形象的展示了Git Flow的全貌:
Git Flow中的分支
根據Git Flow的思想,開發人員需要合理的利用Git的分支功能,來管理軟件的開發流程。因此,Git FLow模型定義了五種標準的分支,并且讓它們各司其職,分別是:master分支,develop分支,feature分支,hotfix分支和release分支。
這五種分支又可分為兩大類:主要分支和輔助分支。主要分支,包括master分支和develop分支。輔助分支,包括feature分支,hotfix分支和release分支。
實質上,Git Flow就是要求開發者使用這五種標準的分支管理軟件開發流程
。
主要分支
主要分支只用于與軟件測試、部署、發布相關的活動,不會涉及任何的軟件開發活動。主要分支會一直存在,是所有其他分支的源頭,也是它們最終的歸宿。
-
master
master分支上存放的應該是隨時可供在生產環境中部署的代碼(Production Ready state)。它是源頭中的源頭,歸宿中的歸宿。它只用于新版本的發布,不涉及一切與軟件開發、測試、部署有關的操作。 -
develop
develop分支fork自master分支,主要用于開發工作。開發新功能時,從develop分支拉出feature分支。新功能開發完成后,再把feature分支合并到develop分支。可見,develop分支是一個承上啟下的分支。
輔助分支
輔助分支主要用于具體的軟件開發工作,包括新功能的開發、Bug修復和發布前的準備工作。輔助分支不是一直存在的,當它們被合并到主要分支后,會被刪除掉。
-
feature
開發者不能直接在master分支和develop分支上做開發工作,這樣可能會污染軟件的版本庫。Git Flow要求從develop分支上引出一條feature分支,專門做具體的開發工作。每個開發者都可以從develop分支上引出自己的feature分支,并且這個feature分支是開發者私有的,可以不必提交到版本庫中。開發完成后,把所有的feature分支都合并到develop分支上,然后把feature分支刪掉。如果新功能被砍掉了,也可以直接刪掉feature分支。
-
hotfix
當線上產品遇到了嚴重Bug,或者發現了緊急的缺陷,不得不立即修復時,就可以從master分支引出一條hotfix分支。問題解決后,再把hotfix分支合并到master分支和develop分支,最后刪除掉這個hotfix分支。
這樣做的好處是使Bug修復與新功能開發完全分離開,保證開發工作不受到影響。
-
release
當新功能開發完,代碼都合并到develop分支后,就可以為新版本發布做準備了。但是如果這時有新的開發任務到來,或者又有新的分支需要合并,而此時的develop分支又沒有準備好合并到master分支時,那么就可以從develop分支引出一條release分支作為過渡。在release分支上,完成發布前的準備工作,然后合并到master分支和develop分支,最后刪除release。
release分支可以使develop分支解放出來,盡早的投入到下一版本的開發中。
Git FLow的使用方式
-
使用原生的Git命令
Git Flow本質上就是對git分支的利用,所以用原生的git分支命令就可以操作。-
創建分支
從當前分支上引出新的分支git branch branch_name
-
切換分支
git checkout branch_name
-
創建并切換分支
git checkout -b branch_name
-
合并分支
把其他分支合并到當前分支git merge --no-ff -m "comment" branch_name
-
刪除分支
-
要想刪除一個分支,必須在已經合并了那個分支的分支上執行刪除操作。
git branch -d banch_name
-
強制刪除一個分支
git branch -D branch_name
-
-
查看所有分支
git branch
-
如果本地沒有遠程倉庫的某個分支,把遠程分支拉取到本地,并且建立連接
git checkout -b branch_name orign/branch_name
-
從遠程分支更新本地分支
git pull
-
推送分支到遠程分支
把本地分支的更新推送到遠程分支(需要先建立連接);或者在遠程倉庫?沒有此分支時,把本地分支?推送到遠程倉庫git push origin branch_name
-
使本地分支與遠程分支建立連接
git branch --set-upstream branch_name origin/branch_name
-
-
刪除遠程倉庫的分支
git push origin --delete branch_name
-
使用 nvie 開發的Git Flow工具
nvie為Git Flow提供了一套命令行工具,使用它可以更方便的操作Git Flow.-
初始化Git Flow
git flow init
- 在一個git倉庫中初始化git flow,會彈出一系列提示信息,跟著做就行了。
- 在一個非git倉庫的文件夾中初始化,會創默認建好需要的分支,沒有任何提示
-
創建feature/release/hotfix/support分支
初始化Git Flow會自動創建/指定主要分支,但輔助分支需要開發者手動創建。-
查看/創建/完成feature分支
git flow feature git flow feature start feature_branch_name git flow feature finish feature_branch_name
start命令,會創建一個新的feature分支;finish命令,會自動合并feature分支到develop分支和master分支,并刪除feature分支。
-
push/pull一個feature分支到遠程倉庫
git flow feature publish feature_branch_name git flow feature pull origin feature_branch_name
其他分支 - hotfix/release/support分支的操作與feature分支基本相同,直接去參考官方文檔吧。
-
-
參考文獻:
撤銷更改
git checkout -- file 在加入到暫存區之前,遺棄修改
git reset HEAD file 在提交之前,遺棄暫存區的更改
git reset --hard HEAD^ 回退到上一版本
git reset --hard commit_id 回退到指定的版本
操作文件
git mv file newfile 重命名,文件名不區分大小寫
git rm file 刪除文件
git remote rename repo new_repo 重命名遠程倉庫