认识工作流
git工作流,即 git 仓库单人/多人操作时所遵守的一种流程模式。
常见的工作流分支
分支 | 功能 |
---|---|
master | 主干分支,一般用于集合所有发布版本 |
develop/dev | 开发分支,用户集合所有在开发中的版本 |
release | 待发布版本分支,集合当前版本所有需求 |
feature | 每个需求需要在自己的 featrure 分支中开发 |
hotfix | 来自发布后出现的 bug 需要从 master 拉取 hotfix 分支进行修复,修复完毕合并回 master 与 develop 分支 |
公司现有的工作流分析
小程序项目
小程序项目现有的工作流程较为明确
- [master] 分支负责集合发布 release 分支,堡垒环境测试通过后可直接上线
- [release + 发布日期] 分支作为每个版本的需求集合分支,堡垒及之前的测试环境都可使用
- [featrue] 分支暂时没有统一分支格式,单个需求开发,开发完毕后合并到 release 分支
- [hotfix] 分支暂时没有统一分支格式
h5 项目
h5 页面项目工作流理解简单,只有 master 和 feature 的分支配合
更简单的个人负责的项目
一条 master 分支搞定一切
多人合作中应注意到的事情
多人项目做多了,会暴露很多问题,有些人可能注意到但工作完就忘记,有些是埋头开发不管其他
branch 命名
这里主要提及的就是 feature 和 hotfix 的分支命名,由于缺少命名规范,大家对命名都有自己的理解,eg: 弱引导需求
1. feat-weakGuide
2. feature-weakGuide
3. feat/weakGuide
4. feat_weakGuide
5. weak-guide
个人目前使用 1 的格式,前前东家内的格式为[分支类型]-[发布版本]-[功能名]
进行约束,查看 branch list 会直观查询到自己寻找的分支
feat-0930-xxxx
feat-1028-weakGuide
feat-1030-yyyy
当然,搭配成团队适合,大家都能接受的规范才是好规范
commit 规范
建议直接看阮一峰的 commit message 与 change log,这里简单介绍下 commit message 的 header 部分
header 就是我们常用的 commitlog,git commit -m '这里是 header'
header 规范由三个部分组成 [type]([scope]): [subject]
,例如
git commit -m 'feat(robShare): 新增任意行活动入口;样式优化;bug修复'
type 类型
一般为以下几种类型
名称 描述 feat 新功能/需求(feature) fix 修复了 bug style 样式调整,不影响代码逻辑 pref 优化,可能是代码格式化,或代码优化 docs 文档 … … scope 范围
这是个可选项,用于方便代码审查时直观了解到这个 commit 的作用范围
比如,这次需求主要在 robShare 页面里的修改,但只看 subject 不能直接了解到是哪个文件夹/页面,这时, scope 就是很有必要的
fix(common/util): xxx工具函数调整
subject
这就没什么具体的规范了,已直观、概括为主,可用分号隔离不同的描述
commit message 的客户端工具
网上有很多对于提交信息的约束工具,我的个人项目一般都是用 husky + commitlint
- husky 是一个 githook工具,在 package.json 中配置 git hooks 用于处理各个阶段的问题
- commitlint 用于 commit message 的格式校验
简单配置如下:
package.json
"husky": {
"hooks": {
"commit-msg": "commitlint --config .commitlintrc.js -E HUSKY_GIT_PARAMS"
}
}
commitlintrc.js
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [
2,
'always',
['build', 'ci', 'chore', 'feat', 'docs', 'fix', 'perf', 'refactor', 'style', 'notes', 'wip', 'version'],
],
},
};
git操作 常见/可能 会遇到的问题
git add 后想撤销
编辑器的 git 控制台可以操作撤回,或者使用
git reset HEAD
命令git commit 后想撤回
- 找到想撤回的 commitid,获取其前一版本的 commitid
git reset --hard <commitid>
git commmit 后发现开发的分支错了
- 获取这次修改提交的 commitid
- 切换到需要正确的分支
git cherry-pick <commitid>
- 可以转移多个提交
git cherry-pick <commitid A> <commitid B>
压缩本地开发的 commit
本地开发可能由于各种情况,会出现一个分支有多个无用的 commit
hash a wip: 没写完 hash b wip: 还没写完 hash c wip: 就快写完了
如果当前分支直接合并在 release 上,会使得分支树 log 很多,并且代码审核时很费劲,尽量保证每次合并分支,只有一次有效 commit。
所以我们需要对本地的 commmit 进行压缩
git rebase -i <commitid c> ----- 会出现以下场景 pick [hash a] wip: 没写完 pick [hash b] wip: 还没写完 pick [hash c] wip: 就快写完了 ----- 除了顶部第一个 commit 不修改之外,剩下的 pick 改为 squash | s pick [hash a] wip: 没写完 s [hash b] wip: 还没写完 s [hash c] wip: 就快写完了 ----- 保存退出后,需要填写压缩后的 commit message,修改后保存退出
如此就合并了许多无特殊意义的 commit
压缩后后悔了,怎么撤销
这里要了解下
git reflog
可以查看 git 的所有操作记录,其内所有的 commitid 都是可以进行回滚的分支重命名
在需要改名的分支下
git branch -m <newname>
修改 commit message
git commit --amend
…
以上都是为了方便团队协同和提升个人开发规范性,各种命令若是有 GUI 可以替代的话,可以选择自己更方便的操作。