我理解的Git Flow
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 重命名远程仓库