阅读原文请点击
摘要:今天新建项目的时候,发现`rdc`除原有的`分支模式`以外还增加了`master分支开发模式`和`git flow模式`,这是一件非常令人欣喜的事情——毕竟`git flow`是一个流传已久的,大家都普遍接受的开发模式。
引子
今天新建项目的时候,发现rdc除原有的分支模式以外还增加了master分支开发模式和git flow模式,这是一件非常令人欣喜的事情——毕竟git flow是一个流传已久的,大家都普遍接受的开发模式。
于是我就把应用删掉了,改用git flow模式,目前体验很完美。
鉴于很多人可能还不太了解git flow,本文就对此分享一些微小的经验。
前言
你会用git吗?
我相信在座的大多数人都会自信的回答:“会”。
而实际上,大家可能从来没有考虑过自己的用法是否真的科学,真的健壮,尤其是项目越来越大,人数越来越多,周期越来越长的时候。
其中,典型的有以下几个问题:
当我开发某个功能到一半的时候,PM突然给我安排了一个新的紧急任务,我该怎么开始这个任务,而不影响现在的?
当我代码写好了的时候,如何发布?
当我发布后,代码出问题了,如何快速修复?
以上的情况,还要求修复后,还要包含之后开发的所有代码?
大部分开发人员使用git的时候,基本只使用两个甚至一个分支,所以下面的这些理念,显然是打开了一扇新世界的大门了。
方案
显然,不光代码有代码规范,代码的管理和协同同样需要一个清晰的流程和规范,由此,行业内的通用解决方案是Git Flow。
怎么样,眼花缭乱吧,不过我可以给你个建议:把头左转90度,别着急骂....这是office picture,并非我画的。
在上面这幅图上,最上面的一行,代表分支,它们分别是
|名称|解释
|-|-
|master|这个分支最近发布到生产环境的代码,最近发布的Release, 这个分支只能从其他分支合并,不能在这个分支直接修改
|Develop|这个分支是我们是我们的主开发分支,包含所有要发布到下一个Release的代码,这个主要合并与其他分支,比如Feature分支
|Feature|这个分支主要是用来开发一个新的功能,一旦开发完成,我们合并回Develop分支进入下一个Release
|Release|当你需要一个发布一个新Release的时候,我们基于Develop分支创建一个Release分支,完成Release后,我们合并到Master和Develop分支
|Hotfix|当我们在Production发现新的Bug时候,我们需要创建一个Hotfix, 完成Hotfix后,我们合并回Master和Develop分支,所以Hotfix的改动会进入下一个Release.
实现细则
master分支
在master分枝上工作,我们需要遵循一个基本原则,所有在master分支上的commit应该tag.
feature分支
feature分支做完后,必须合并回develop分支, 合并完分支后一般会删点这个feature分支,但是我们也可以保留
开始一个新的功能的开发
git checkout -bsome-featuredevelop# Optionally,pushbranch toorigin:gitpush-uoriginsome-feature# 做一些改动 gitstatusgit addsome-filegit commit
开发完成
git pullorigindevelopgit checkout developgit merge --no-ffsome-featuregitpushorigindevelopgit branch -dsome-feature# If you pushed branch toorigin:gitpushorigin--deletesome-feature
release分支
分支名 release/*
release分支基于develop分支创建,打完release分支后,我们可以在这个release分支上测试,修改bug等。同时,其它开发人员可以基于开发新的feature,一旦打了release分支之后不要从develop分支上合并新的改动到Release分支
发布release分支时,合并release到master和develop, 同时在master分支上打个tag记住release版本号,然后可以删除release分支了(当然,你可以选择不删除)。
开始release
git checkout -brelease-0.1.0develop# Optional: Bumpversionnumber,commit#Preparerelease,commit
完成release
git checkoutmastergitmerge --no-ff release-0.1.0git pushgit checkout developgit merge --no-ff release-0.1.0git pushgit branch -d release-0.1.0# If you pushed branch to origin:git push origin --delete release-0.1.0gittag-av0.1.0mastergitpush --tags
hotfix
分支名 hotfix/*
hotfix分支基于master分支创建,开发完后需要合并回master和develop分支,同时在master上打一个tag
开始hotfix
git checkout -b hotfix-0.1.1master
完成hotfix
git checkoutmastergitmerge --no-ff hotfix-0.1.1git pushgit checkout developgit merge --no-ff hotfix-0.1.1git pushgit branch -d hotfix-0.1.1gittag-av0.1.1mastergitpush --tags
工具
如果你能坚持看到这里,我真的为你感到欣喜,这说明你是用心学习的,并且是不畏艰险的,毕竟上面那么长的一大串的代码,可能已经使你感到畏惧。
而显然的是,作为通用的一个解决方案,不可能这么繁琐,那么,唯一的可能是——有!工!具!
平台命令
OS Xbrew install git-flow
Linuxapt-get install git-flow
Windowswget -q -O - --no-check-certificatehttps://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh
IDEAGit Flow Integration
其中还有一大部分是gui的,比较简单,本文就不再赘述了。下面着重介绍下命令行下的使用
初始化: git flow init
开始新Feature: git flow feature start MYFEATURE
Publish一个Feature(也就是push到远程): git flow feature publish MYFEATURE
获取Publish的Feature: git flow feature pull origin MYFEATURE
完成一个Feature: git flow feature finish MYFEATURE
开始一个Release: git flow release start RELEASE [BASE]
Publish一个Release: git flow release publish RELEASE
发布Release: git flow release finish RELEASE 别忘了git push --tags
开始一个Hotfix: git flow hotfix start VERSION [BASENAME]
发布一个Hotfix git flow hotfix finish VERSION
仔细观察,这些命令都是有规矩的,它们大概可以如下图表示