git 是目前最流行的源代码管理工具,Git 的确可以在各个方面做很多事情,然而任然存在采用何种分支管理的问题,Git 分支管理并没有普遍适用的最佳做法,只有对每个团队和项目而言最适合的工作流。
git 的操作还是有一定复杂度的,错误的操作影响也比较大,异步小心就会导致部分代码丢失,还很难查到具体出问题的时间点和功能点。
我们采用的是 git-flow 流程,包含 4 类分支,分别是 master、develop、新功能分支(feature)和 hotfix。
新建仓库
在 github 中创建一个新的仓库,只有一个 master 分支
新建分支
每次开发新功能,都应该从当前主开发分支新建一个功能分支。
1 | git checkout -b feature-wz-qx |
提交分支
模块开发差不多,提交代码
1 | git status |
关于 commit 完整的 log 由 类别(必须) 简短描述(必须) 详细描述(可选) 三部分组成:
- 类别
- add 增加
- fix 修复 bug
- change 修改
- del 移除
- refactor 代码重构
- docs 文档
eg:
1 | git commit -m 'add xxxxx' |
如果增加详细描述,具体内容前空一行,兼容 Markdown。
还可以可以配合 gitmoji 强化信息可读性。
合并提交记录
为了避免太多的 commit 而造成版本控制的混乱,通常我们推荐将这些 commit 合并成一个。假如我们提交了四次记录。
1 | commit 14c69cf825c17bd3e48154994e6f722db251fcfb |
如何把四次合并到一起,并且只保留 最后一次 的 Git message 呢?推荐 git rebase 进行合并操作。
合并最后四个
1 | git rebase -i HEAD~4 |
git 会打开一个互动界面,方便用户对历史提交进行修改
1 | pick 969161b add first |
我们需要把前面的 pick 改为 squash 这样:
1 | pick 969161b add first |
完成后,使用 :wq 保存并退出。这个时候则需要在下一步中对这 4 条 commit 信息进行修改和保存(如果 fixup 的话,则直接丢弃其它记录,省去下一步操作):
1 | # This is a combinatin of 4 commits. |
使用 :wq 后,通过 git log 可以看到仅剩一条 commit 记录:
1 | commit c2391a59bf51240a60ab4c8455b251cff1ec3cdd |
rebase 的风险:
当待合并 commit 记录中杂糅着他人的 commit 记录,此时就不可以再对这部分 commit 记录做合并操作。
但只要新开分支且保持分支独立开发,杂糅的情况就不存在。
推送到仓库
1 | git push origin feature-wz-qx |
提交 Merge Request 申请
请求相关同学从你的 feature-wz-qx 合并分支
- 提交 Merge Request:
通过「+Create Merge Request」按钮创建一个 Merge Request;
- 指定「Assignee」:
指定需要 review 你代码的同学,禁止指定自己;
- 更改「Target branch」:
改变为需要合并进去的目标分支;
- 设置合并后删除被合并分支的选项:
勾选「Remove source branch when merge request is accepted.」选项,在合并完成后删除源分支,控制分支总数量;
- 提交合并请求
完成上述设置后,相关同学将会收到邮件通知,此时可进入 GitLab 进行 code review。如果发现问题则对问题代码进行点评并拒绝关闭申请,反之则通过合并申请。
修复 Bug
发现 bug 了,从 develop 分支上新建分支
1 | git checkout -b hotfix/xxx develop |
改完推送到仓库后提交 Merge Request 申请
减少冲突
从我们的工作流程上来说,代码合并导致的问题,一般都发生在特性、修复分支合并到 master 或者 develop 的时候,因为这个时候开始,才是真正与其他分支汇合,不同的改动会发生冲突。而且合并没法完全避免,我们只能去思考如何减少合并冲突。
- 合理的分工,人员职责划分尽量清晰,减少互相之间的交叉,减少多个人同时改动同一份代码的几率
- 合适的合并工具
- 合并后的代码检查
- 公共代码改动,要通知各使用方变化点
- code review