Git Flow
Git Flow工作流通过为功能开发、发布准备和维护分配独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。
模型全貌
分支模型
Git Flow模型中定义了主分支和辅助分支两类分支。其中主分支用于组织与软件开发、部署相关的活动;辅助分支组织为了解决特定的问题而进行的各种开发活动。
主分支
主分支是所有开发活动的核心分支。所有的开发活动产生的输出物最终都会反映到主分支的代码中。主分支分为master分支和develop分支。
- master: master 分支为主分支不能直接push代码,也是新功能拉取的分支,分支有着每次功能上线的tag;在初始化git仓库的时候就会创建
- develop: develop分支是保存当前最新开发成果的分支。通常这个分支上的代码也是可进行每日夜间发布的代码(Nightly build)
辅助分支
辅助分支是用于组织解决特定问题的各种软件开发活动的分支。辅助分支主要用于组织软件新功能的并行开发、简化新功能开发代码的跟踪、辅助完成版本发布工作以及对生产代码的缺陷进行紧急修复工作。这些分支与主分支不同,通常只会在有限的时间范围内存在。
- feature: 开发人员新功能开发分支
- hotfix: hotfix为线上代码的热更新,比如配置文件的修改或者极小的功能修改。
- release:线上代码对应分支【不能直接push代码】
- bugfix: 是对重大bug的修改,修改完成后,需要合并到qa分支进行测试,整个流程与develop 的流程一致
feature分支
feature分支(有时也可以被叫做“topic分支”)通常是在开发一项新的软件功能的时候使用,这个分支上的代码变更最终合并回develop分支或者干脆被抛弃掉(例如实验性且效果不好的代码变更)。
feature 分支以develop分支为起点,是开发者直接更改代码发送提交的分支。
开发流程:
- 从develop分支创建feature分支
- 从feature分支中实现目标功能
- 通过Github 向develop发送pull request
- 接受其他开发者审核后,将Pull Request合并至develop分支
使用规范:
- feature分支的命名可以使用除master,develop,release-,hotfix-之外的任何名称
release分支
release分支是为发布新的产品版本而设计的。在这个分支上的代码允许做小的缺陷修正、准备发布版本所需的各项说明信息(版本号、发布时间、编译时间等等)。通过在release分支上进行这些工作可以让develop分支空闲出来以接受新的feature分支上的代码提交,进入新的软件开发迭代周期。
当develop分支上的代码已经包含了所有即将发布的版本中所计划包含的软件功能,并且已通过所有测试时,我们就可以考虑准备创建release分支了。而所有在当前即将发布的版本之外的业务需求一定要确保不能混到release分支之内(避免由此引入一些不可控的系统缺陷)。
成功的派生了release分支,并被赋予版本号之后,develop分支就可以为“下一个版本”服务了。所谓的“下一个版本”是在当前即将发布的版本之后发布的版本。版本号的命名可以依据项目定义的版本号命名规则进行。
使用规范:
- 可以从develop分支派生
- 必须合并回develop分支和master分支
- 分支命名惯例:release-*
hotfix分支
除了是计划外创建的以外,hotfix分支与release分支十分相似:都可以产生一个新的可供在生产环境部署的软件版本。
当生产环境中的软件遇到了异常情况或者发现了严重到必须立即修复的软件缺陷的时候,就需要从master分支上指定的TAG版本派生hotfix分支来组织代码的紧急修复工作。
这样做的显而易见的好处是不会打断正在进行的develop分支的开发工作,能够让团队中负责新功能开发的人与负责代码紧急修复的人并行的开展工作。
使用规范:
- 可以从master分支派生
- 必须合并回master分支和develop分支
- 分支命名惯例:hotfix-*
HubFlow
HubFlow是适用于Git的GitFlow工具。它将您需要执行的大部分步骤转换为单行命令。
安装HubFlow
第一次安装HubFlow工具非常简单:
git clone https://github.com/datasift/gitflow
cd gitflow
sudo ./install.sh
HubFlow的使用
可以先使用 git hf help 查看基本命令
usage: git hf <subcommand>
Available subcommands are:
init Initialize a new git repo with support for the branching model.
feature Manage your feature branches.
release Manage your release branches.
hotfix Manage your hotfix branches.
push Push the changes from your current branch (plus any new tags) back upstream.
pull Pull upstream changes down into your master, develop, and current branches.
update Pull upstream changes down into your master and develop branches.
version Shows version information.
Try 'git hf <subcommand> help' for details.
- 先把远程代码线拉到本地
git clone git@gitlab.tenddata.com:hao.zhang/hubflow-demo.git
- 初始化项目:
git hf init
- 创建开发功能分支
git hf feature start newFeature
- 当feature分支创建后,进行代码开发。可以正常使用git命令
git commit -m '添加xxx功能模块'
git push
- 当feature功能完成后,关闭feature分支并且合并到develop分支
git hf feature finish newFeature
Fetching origin
warning: empty strings as pathspecs will be made invalid in upcoming releases. please use . instead if you meant to match all paths
To gitlab.tenddata.com:hao.zhang/hubflow-demo.git
- [deleted] feature/newFeature
Switched to branch 'develop'
Your branch is up-to-date with 'origin/develop'.
Deleted branch feature/newFeature (was a2c4df3).
Summary of actions:
- The latest changes from 'origin' were merged into 'master' and 'develop'
- The feature branch 'feature/newFeature' was merged into 'develop'
- Feature branch 'feature/newFeature' has been removed
- Feature branch 'origin/feature/newFeature' has been removed
- You are now on branch 'develop'
- 当所有的feature都完成后,准备发布新的产品版本可以开始release分支
git hf release start release-0.0.1
- 当 release-0.0.1 版本已经在继承测试环境测试完毕后,可以更新生产后。就可以关闭该分支并且推送到master分支
git hf release finish release-0.0.1
Fetching origin
Fetching origin
warning: empty strings as pathspecs will be made invalid in upcoming releases. please use . instead if you meant to match all paths
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
Deleted branch release/release-0.0.1 (was a2c4df3).
Everything up-to-date
Everything up-to-date
Counting objects: 1, done.
Writing objects: 100% (1/1), 183 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To gitlab.tenddata.com:hao.zhang/hubflow-demo.git
* [new tag] release-0.0.1 -> release-0.0.1
To gitlab.tenddata.com:hao.zhang/hubflow-demo.git
- [deleted] release/release-0.0.1
Summary of actions:
- Latest objects have been fetched from 'origin'
- Release branch has been merged into 'master'
- The release was tagged 'release-0.0.1'
- Tag 'release-0.0.1' has been back-merged into 'develop'
- Branch 'master' has been back-merged into 'develop'
- Release branch 'release/release-0.0.1' has been deleted
- 'develop', 'master' and tags have been pushed to 'origin'
- Release branch 'release/release-0.0.1' in 'origin' has been deleted.
以上是正常流程。
如果对某个分支命令不熟悉。可以使用
git hf xxx help 来进行查看帮助文档