前言
版本控制指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是工程化管理里至关重要的一个环节
代码管理方法
代码管理和版本控制是现代软件开发中至关重要的一环。代码管理包括对代码的组织、存储、维护、共享和发布,而版本控制则是用来记录和管理不同版本的代码库以及相应的修改历史,同时也能够协助多人协同工作。在本文中,我将介绍一些流行的代码管理工具和方法。
GitHub
GitHub是目前最受欢迎的代码托管平台之一。它提供了广泛的功能,包括版本控制、问题追踪、协作和部署等。以下是GitHub的主要优缺点:
优点:社区活跃、稳定性和安全性高、多种集成工具,助力开发效率提升
缺点:私有代码需付费、团队管理权限受限、访问速度慢
Gitlab
GitLab是一款开源的代码托管平台,可以自己搭建在私有服务器上,也可以使用GitLab官方提供的托管服务。以下是GitLab的主要优缺点:
优点:私有代码存储无限制、灵活的团队和权限管理、一体化工具集成度高
缺点:社区规模相对较小
Gitee
Gitee是中国开发者社区中较为知名的代码托管平台。它提供了与GitHub和GitLab类似的功能,以下是Gitee的主要优缺点:
优点:高速稳定、完善的国内化支持、大量的中国用户和项目
缺点:全球化用户群体较小
提交规范
根据业务场景和团队规模选定代码管理方法后,需要规范化的 Git 提交信息 ,才能让协作更顺畅,而业界主要参考 Conventional Commits 规范。
Conventional Commits (约定式提交规范),是目前使用最广泛的提交规范,其主要受 AngularJS规范 的启发。
每次提交,Commit Msessage 都包括三个部分:Header,Body 和 Footer
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
其中,Header 是必需的,Body 和 Footer 可以省略
Header部分只有一行,包括三个字段:type(必需)、scope(可选)和subject(必需)
注意:每次提交都必须使用 type 字段,它由一个名词组成,如 feat 或 fix ,其后接一个可选的作用域字段,以及一个必要的冒号(英文半角)和空格。
type:用来标识 commit 的类型,必须是以下类型中的一个
- feat: 新功能
- fix: bug 修复
- style: 不影响代码功能的变动(如删除空格,格式化,缺少分号等)
- refactor: 代码重构(不包括 bug 修复、功能新增)
- build: 添加或修改构建配置、第三方依赖(如 webpack、gulp、npm)
- docs: 文档发生修改
- chore: 除上述之外的修改
可选
- ci: 添加或修改CI 配置、脚本(如 Travis,Jenkins,GitLab CI)
- test: 添加或修改测试用例
- pref: 性能优化
- revert: 回滚某个更早之前的提交
scope:用来标识改动所影响的范围,视项目而定
subject:改动的简短描述,一般不超过 50 字符长度
分支管理模式
在项目开发的过程中,选择一个合适的分支模式来管理代码十分重要,通常需要根据项目自身的业务特点和团队规模来选择合适的分支模式。常见的分支模式主要有TBD、Git-Flow、GitHub-Flow及GitLab-Flow。
TBD
TBD(Trunk-Based Development)的中文名称为主干开发模式。在该模式下,开发人员在一个分支上进行协作开发,只保留一条长期稳定的开发分支,并且不允许新建任何长期存在的开发分支,任何代码的变更都更新到主干(master)分支上,当需要发布时,根据版本号拉一个release分支,通过merge或者cherry-pick将代码提交到对应的发布分支上。
Git-Flow
在实际项目的开发维护中,需求在构建初期被切分成多个子需求,各个子需求的成果都需要经过测试,具备可视、可集成和可运行使用的特征,这就是敏捷开发。由于团队需要协作完成某一功能需求或者分别完成不同的功能需求,因此根据不同的功能需求创建对应开发分支的模式应运而生,其中最具有代表性的就是Git-Flow模式。
GitHub-Flow
GitHub-Flow是简化版的Git-Flow,它更加轻量,仅保留了master和feature分支,是一种以部署为中心的分支管理模式,通过简单的功能和规则,持续、高速、安全地进行部署。
Gitlab-Flow
GitLab-Flow与GitHub-Flow在开发流程上的区别并不大,只是GitLab-Flow将pull request改成了merge request,而merge request的用法与pull request类似,都可以作为CR的沟通方式。两者最大的区别体现在发布流程上,GitLab-Flow引入了对应生产环境的production分支和对应预发环境的pre-production分支。
Git Hook
和其他版本控制系统一样,Git也能在特定的重要动作发生时触发自定义脚本。有两组这样的钩子:客户端和服务器端。客户端钩子由诸如提交和合并这样的操作调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。
客户端
pre-commit:在提交commit message前运行。用于检查即将提交的快照,可用于做一些提交前的规范检测
prepare-commit-msg:在commit message提交后,被保存之前运行,一般结合模板使用,动态插入信息
commit-msg:可用此钩子在提交通过前验证项目状态或提交信息
post-commit:整个提交过程完成后运行。不接收任何参数,一般用于提交通知,触发一些自定义行为。
pre-push:在git push运行时更新了远程引用但尚未传送对象时被调用
服务器端
pre-receive:在处理来自客户端的推送时,该钩子最先被调用
update:update脚本和pre-receive脚本十分相似,不同之处在于它会为每一个准备更新的分支各运行一次
post-receive:在整个过程完结以后运行,可以用来更新其他系统服务或者通知用户
相关工具
commitizen
commitizen是一个格式化commit message的工具,通过npm即可快速安装它。在完成配置提交commit message时,使用git cz来代替git commit,输入git cz后会出现命令行选项,通过流程化的引导自动生成符合格式的commitmessage。
husky
husky是一个开源社区的Git Hook工具,属于前端工程化搭建中必不可少的部分。它可以让开发人员更加便捷快速地使用Git Hook,通过npm即可安装。当开发人员进行commit或push时,可以使用它来运行测试、lint提交消息、lint代码。husky目前支持所有的Git Hook。
commitlint
commitlint是一个用于检测commit message的开源工具,它具有非常丰富的社区生态,可以帮助开发人员有效管理commit message,通过npm即可安装。
总结
软件工程没有银弹,只有了解了这些知识点,在实际工作中才可能根据自身的业务特点和团队规模来选择适合的方案。分支模式没有绝对好的模式,只有适合的模式。如果上述分支模式都无法满足业务的实际需求,那么可以根据的业务特点和团队规模来定义分支模式,实际上大多数公司和项目团队的分支模式都是上述4种分支模式的变种。
参考
逐梦科技圈,探索新边界。专注前端工程化、全栈、跨端、可视化等领域,一起分享、交流职场上那些好玩的事, 欢迎关注公众号【前端连环话】