git分支管理策略
概述
git flow工作流
Git的特色之一就是可以灵活的建立分支,因为有分支的存在,才构成了多工作流的特色。
同时因为其灵活性,也应运而生出分支杂乱的问题,像下图这样:
为了解决杂乱的工作流,而产生的分支管理策略
分支
长生命周期分支
- 主分支Master
有且仅有一个,用于发布版本,每个版本发布需打tag
tag名为 <版本号>_<发布时间>
建议使用–no-ff参数
- 开发分支Develop
日常开发分支
短生命周期分支
- 功能分支
为了开发某个功能从dev分支分出来
开发完成后要合并入dev分支
采用fearure-的命名方式
使用后应该删除
- 预发布分支
在发布正式版本之前用于测试
从dev分支分离出来,测试没问题后分别合并进master及dev分支
如发现BUG,从分支分离出fix分支,修复问题后分别合并进该分支及dev分支
采用release-命名方式
使用后应该删除
- 修复BUG分支
修复线上BUG分支
从master分支分离出来,修复BUG后分别合并进master及dev分支并打好tag
采用fix-[tag]命名方式
使用后应该删除
commit message
示例:
1 | git commit -m 'feat(index): 完成sayhello需求开发' |
- 作用
- 显示上次发布后的变动
1 | git log <last tag> HEAD --pretty=format:%s |
- 可以过滤某些commit(比如文档改动),便于快速查找信息
1 | git log <last release> HEAD --grep feature |
- 可以直接从commit生成Change log
- 格式
1 | <type>(<scope>): <subject> |
任何一行都不得超过72个字符,为了避免自动换行影响美观。
- 参数说明
- type(必需)用于说明 commit 的类别
feat: 新功能(feature)
fix: 修补bug
docs: 文档(documentation)
style: 格式(不影响代码运行的变动)
refactor: 重构(即不是新增功能,也不是修改bug的代码变动)
test: 增加测试
chore: 构建过程或辅助工具的变动
- scope(可选)用于说明 commit 影响的范围
- subject(必需)commit 目的的简短描述
- 工具
1) Commitizen
一个撰写合格 Commit message 的工具。
- 全局安装
1 | npm install -g commitizen |
- 在项目中初始化
1 | commitizen init cz-conventional-changelog --save --save-exact |
git commit命令,一律改为使用git cz
2) validate-commit-msg
校验commit是否符合规范
3) conventional-changelog
生成 Change log 的工具
- 全局安装
1 | npm install -g conventional-changelog-cli |
- 在项目中生成上次发布以来的log
1 | conventional-changelog -p angular -i CHANGELOG.md -w |
- 生成所有发布的change log
1 | conventional-changelog -p angular -i CHANGELOG.md -w -r 0 |
git使用技巧
- 别名
1 | git config alias.co checkout |
之后直接使用git ad \ git co 即可
- 超级log
1 | git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" |
应用场景
开发新功能
- 自dev分支新建分支feature-sayhello分支
1 | git checkout dev |
- 开发完成后合并到dev分支,合并前需要先pull远程分支代码,并且在预合并分支处理冲突后再合并
1 | git checkout dev |
- 自dev分支创建release-v1.0分支,提交测试
1 | git checkout -b release-v1.0 |
- 测试通过后分别合并至dev分支及master分支,合并前需要先pull远程分支代码,并且预合并分支处理冲突后再合并
1 | git checkout dev |
- 在master分支打上tag
1 | git tag v1.0_21.2.3 |
- 删除开发分支
1 | git branch -D feature-sayhello |
修复线上问题
- 自master分支新建fixbug分支,指向出问题的tag
1 | git checkout master |
- 修复问题并测试通过后分别合并至dev及master分支,合并前需要先pull远程分支代码,并且预合并分支处理冲突后再合并
1 | git checkout dev |
- 在master分支打上tag
1 | git tag v1.3_21.2.2 -m 'fixbug:修复线上问题' |
- 删除fixbug分支
1 | git branch -D fixbug-v1.0 |
线上回退至指定tag
- 切换至master分支
1 | git checkout master |
- 指针定向至指定tag
1 | git reset --hard v1.4_21.2.2 |
- 强制推送回滚
1 | git push --force origin master |
日常上下班
- 下班前commit更改并push至远程
1 | git add . |
- 上班第一件事pull远程dev分支,并合并到自己的开发分支
1 | git checkout dev |
说明
–no-ff参数说明
- 未使用–no-ff参数
- 使用–no-ff参数
三大git分支管理策略
- Git Flow是 Vincent Driessen 2010 年发布出来的他自己的分支管理模型,属于强流程性,使用度非常高,比较适合开发技术能力中等的团队作战。
- GitHub Flow 是大型程序员交友社区 GitHub 制定并使用的工作流模型,由 scott chacon 在 2011 年 8月 31 号正式发布。
- 只有一个长期分支 master ,而且 master 分支上的代码,永远是可发布状态,一般 master 会设置 protected 分支保护,只有有权限的人才能推送代码到 master 分支。
- 如果有新功能开发,可以从 master 分支上检出新分支。
- 在本地分支提交代码,并且保证按时向远程仓库推送。
- 当你需要反馈或者帮助,或者你想合并分支时,可以发起一个 pull request。
- 当 review 或者讨论通过后,代码会合并到目标分支。
- 一旦合并到 master 分支,应该立即发布。
- GitLab Flow是 GitLab 的 CEO Sytse Sijbrandij 在 2014 年 9月 29 正式发布出来的。
标签
列出所有tag
1 | git tag |
新建一个tag在当前commit
1 | git tag [tag] |
新建一个tag在指定commit
1 | git tag [tag] [commit] |
删除本地tag
1 | git tag -d [tag] |
删除远程tag
1 | git push origin :refs/tags/[tagName] |
查看tag信息
1 | git show [tag] |
提交指定tag
1 | git push [remote] [tag] |
提交所有tag
1 | git push [remote] --tags |
新建一个分支,指向某个tag
1 | git checkout -b [branch] [tag] |
延申阅读
Git操作指南: 企业级项目分支管理流程 - SourceTree Mac 版
git 三大分支管理策略