gitflow实践
git 概念原理
git 包含三种状态:
- 已暂存 (staged)
- 已修改 (modified)
- 已提交 (committed)
git 版本控制系统(VCS)
git 版本号 (x.y.z)
- X = 主版本号 (重大升级, 不同主版本的库之间是不兼容的)
- Y = 次版本号 (增量升级,增加一些新的接口但保留原有接口.高版本号的库向后兼容低版本的库)
- Z = 维护版本号 (仅修复 Bug) (修改错误,改进性能等,不添加新接口,也不更改接口.在主版本和次版本相同的前提下,不同维护版本之间完全兼容)
git 分支管理(gitflow)
gitflow 部署安装
部署安装 gitflow 工具(https://github.com/nvie/gitflow)
curl -sS https://github.com/nvie/gitflow/blob/develop/contrib/gitflow-installer.sh | bash
SourceTree 支持 gitflow 工作流
gitflow 分支说明
- production(master) 分支[master, master-enshi, master-enshi]
当需要固话某个固定版本的时候(独立设置 production 分支 (master-enshi-v1, master-enshi-v2)[固化版本]
发布分支, 这个分支为最近发布到生产环境的代码分支, 这个分支只能从其他分支合并(hotfix 分支, release 分支)所有在 master 分支上的 commit 应该打 tag
- develop 分支[develop]
主开发分支, 包含所有要发布到下一个 release 的代码. - feature 分支(?)[feature-*]
这个分支主要用来开发新的功能, 一旦开发完成, 我们就将它合并到 develop 分支, 合并完分支后一般会删掉这个 feature 分支.也可以保留.
- release 分支(?)[release-*]
当你需要发布一个新版本的时候, 我们基于 develop 分支创建一个 release 分支,完成 release (测试, 修改Bug) 之后合并到 master 分支和 develop 分支, 同时在 master 分支上打个 tag 记住 release 版本号,然后可以删除 release 分支.
- hotfix 分支(临时分支)[hotfix-*]
我们需要基于 master 分支创建一个 新的hotfix 分支,进行 bug 修复, 完成 hotfix 后,合并回 master 分支和 develop 分支
, 同时在 master 上打一个 版本.
gitflow 代码示例
a. 创建develop分支
git branch develop
git push -u origin develop
- b. 开始新Feature开发
git checkout -b some-feature develop # -b 依据 develop 创建一个新分支
# Optionally, push branch to origin:
git push -u origin some-feature
# 做一些改动
git status
git add some-file
git commit
- c. 完成Feature
git pull origin develop
git checkout develop
git merge --no-ff some-feature
git push origin develop
git branch -d some-feature
# If you pushed branch to origin:
git push origin --delete some-feature
- d. 开始Release
git checkout -b release-0.1.0 develop
# Optional: Bump version number, commit
# Prepare release, commit
- e. 完成Release
git checkout master
git merge --no-ff release-0.1.0
git push
git checkout develop
git merge --no-ff release-0.1.0
git push
git branch -d release-0.1.0
# If you pushed branch to origin:
git push origin --delete release-0.1.0
git tag -a v0.1.0 master
git push --tags
- f. 开始Hotfix
git checkout -b hotfix-0.1.1 master
- g. 完成Hotfix
git checkout master
git merge --no-ff hotfix-0.1.1
git push
git checkout develop
git merge --no-ff hotfix-0.1.1
git push
git branch -d hotfix-0.1.1
git tag -a v0.1.1 master
git push --tags
gitflow 工具
安装
mac
brew install git-flow
Debian/Linux
apt-get install git-flow
图解 gitflow 的使用
gitflow 命令与 git 命令的对应
git commit 规范
单个 commit 解决单个问题
commit 的格式
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
<BLANK LINE>
<revert>
格式示例
fix(route): 404 页面跳转不正确
主体内容
Closes #123, #245, #992
commit 格式详解
Header (必填)
Header部分只有一行,包括三个字段:type
(必需)、scope
(可选)和subject
(必需)。
- type (必填)
用于说明 commit 的类别,只允许使用下面7个标识。
feat
fix
需要添加到 change log 中, 其他的视情况而定.
feat: 新功能,新特性(feature)
fix: 修复bug
docs: 文档(documentation)
style: 代码格式修改(比较小的代码变动, 功能保持不变)
test: 测试用例修改,或增加测试代码
refactor:代码重构,内部处理逻辑/算法逻辑发生较大改变.(即不是新增功能,也不是修改bug的代码变动)
chore: 构建过程或辅助工具的变动, 比如构建流程, 依赖管理等.(无法判断的提交推荐用这个)
- scope (按需填写,可不填)
用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。 - Subject (必填)
提交代码的简短描述, 建议不超过 50 个字符.
- 以动词开头,使用第一人称现在时,比如change,而不是changed或changes
- 第一个字母小写
- 结尾不加句号(.)
Body (按需填写,可不填)
Body 部分是对本次 commit 的详细描述,可以分成多行。下面是一个范例
More detailed explanatory text, if necessary. Wrap it to
about 72 characters or so.
Further paragraphs come after blank lines.
- Bullet points are okay, too
- Use a hanging indent
Footer (按需填写,可不填)
Footer 部分只用于两种情况:
- 不兼容变动(以 BREAKING CHANGE 开头)
BREAKING CHANGE
isolate scope bindings definition has changed.
To migrate the code follow the example below:
Before:
scope: {
myAttr: 'attribute',
}
After:
scope: {
myAttr: '@',
}
The removed `inject` wasn't generaly useful for directives so there should be no code using it.
- 关闭 Issue
Closes #123, #245, #992
Revert (按需填写,可不填)
如果当前 commit 用于撤销以前的 commit,则必须以revert:
开头,后面跟着被撤销 Commit 的 Header。
revert: feat(pencil): add 'graphiteWidth' option
This reverts commit 667ecc1654a317a13331b17617d973392f415f02.
Body部分的格式是固定的,必须写成
This reverts commit <hash>.
,其中的hash
是被撤销 commit 的 SHA 标识符。
如果当前 commit 与被撤销的 commit,在同一个发布(release)里面,那么它们都不会出现在 Change log 里面。如果两者在不同的发布,那么当前 commit,会出现在 Change log 的Reverts
小标题下面。
commit 示例
fix(影响范围): 获取用户邮箱不正确
feat: 增加路由跳转错误页面
fix(影响范围): 获取用户邮箱不正确
主体内容
Closes #123, #245, #992
git 日常操作
将本地分支与远程指定分支关联(手动建立关联),远程分支在前,本地分支在后
git branch --set-upstream-to origin/dev dev
git 使用手册
config
查看 git 的配置
-l # 罗列 git 的本地配置