赞
踩
大咖好呀,我是恋喵大鲤鱼。
Git 是一个免费开源的分布式版本控制系统,由 Linux 之父 Linus Torvalds 于 2005 年开发,最初的目的用于管理 Linux 内核的开发。
因其高效的性能、便捷的分支管理、免费开源等优秀特性,一经推出,很快在全球范围内得到广泛使用,成为最流行的版本控制系统,没有之一。
当我们使用 Git 对代码进行版本管理时,经常需要将变更推送至远端。每次提交变更时,我们需要书写 Commit Message 描述此次变更的内容。
Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交。
git commit -m "hello world"
上面代码的 -m 参数,就是用来指定 Commit message 的。
如果一行不够,可以只执行 git commit,就会跳出文本编辑器,让你写多行。
基本上,你写什么都行。但是,一般来说,Commit Message 应该清晰明了,说明本次提交的目的。
下面是来自 Github 的开源项目 Commit Message 示例。
提交变更时,填写规范的 Commit Message,可以带来诸多好处。
比如使用下面的命令可以查看上次发布到当前 HEAD(最新提交)之间的提交日志,每个 Commit 占据一行。只看行首,就知道某次 Commit 的目的。
git log <last_release_commit> HEAD --pretty=format:%s
last_release_commit 为上次发布的提交的哈希值或分支名。
可以过滤某些 Commit(比如文档改动),如使用下面的命令仅仅显示新增加的功能。
git log <last_release_commit> HEAD --grep feat
Change Log 是发布新版本时,用来说明与上一个版本差异的文档。规范的 Commit Message 可以使用一些工具和服务(如GitHub、GitLab)自动生成 CHANGELOG 文档。
清晰的 Commit Message 可以帮助代码审查者了解提交目的,从而加速 Code Review 过程。
良好的 Commit Message 可以帮助开发人员快速定位和理解问题,从而提高代码的可维护性。
规范的提交消息可以帮助项目管理者更好地跟踪开发进度、问题修复情况和特定功能的实现。
总之,规范的提交消息不仅是良好的开发实践,还有助于项目的可维护性、协作效率和代码质量的提升。
如果日常开发中缺少对 Commit Message 的约束,随意填写,会降低 Commit Message 的可读性与作用,随之将会带来一些问题。
请看下面的提交信息。如果你想合并它们,无法得知哪些内容是添加的,哪些是修改的,它们分别做了什么或者你为什么需要这些提交。如果你想在历史记录中搜索某些内容,那么上述糟糕情况同样会遇到。你向下滚动提交历史,乌七八糟,很难找到有用的信息。
cd3e27a contact page
aee9d0d comments
eac95e5 list of online users, some other changes because of server
fae5636 little edit
所以规范 Commit Message 在系统开发时显得非常重要,尤其是在多人协作开发大型系统时。
为了让提交消息便于理解,更有意义,我们应该使用规范的格式书写提交信息。
目前社区较流行的方案是 Conventional Commits(约定式提交),它受到了 Angular 提交约定的启发,并在很大程度上以其为依据。
约定式提交是在提交消息之上的轻量级约定。它为创建提交历史提供了一套简单的规则。这使得编写基于规范的自动化工具变得更容易。在提交信息中描述新特性、Bug 修复和破坏性变更,这个约定与 SemVer 相吻合。
约定式提交规定每个提交消息由三个部分组成:Header,Body 和 Footer。
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
其中,Header 是必需的,Body 和 Footer 可以省略。
Header 又可细分为类型、范围和描述,其中作用域是可选的。
type 表示变更的类型,可以参考 @commitlint/config-conventional 中推荐的 11 个类型。
feat:新增功能(feature)
fix:修复 Bug
docs:用于更新文档、注释或帮助文档。
style:调整代码样式(不影响功能)。如修改命名风格,变量初始化方式等。
refactor:代码重构(不影响功能)。如移动函数位置,拆分代码到不同源码文件等。
test:添加或修改测试代码
ci:与持续集成有关
build:与编译构建相关的变更
revert:恢复之前的提交
perf:性能优化
chore:与特性或 Bug 无关且不修改 Src 或 Test 文件,如构建过程或辅助工具的变更
注意,以上类型仅是推荐,不是强制限制。除此之外,约定式提交的灵活性也允许你的团队使用自己的类型,并随着时间的推移更改这些类型。
optional scope 表示可选的变更范围,可以是文件路径、模块名等。如果变更涉及多个范围,可以使用 “*” 或 “all”。
feat(lang): add polish language
注意:如果发生破坏性变更,可以在<type>[optional scope]
后面添加一个感叹号 !。
feat(product)!: send an email to the customer when a product is shipped
description 用于简明扼要地描述修改内容。
可选的主体是对本次提交的详细描述,可以分成多行。
可选的脚注可以用来关联需求或缺陷,比如 JIRA Story 和 Github Issue。
一个关联多个 Issue 完整的 Conventional Commits 提交示例:
fix(api): fix foo to enable bar
This fixes the broken behavior of the component XXX. Before this fix foo wasn't enabled at all, behavior changes from <old> to <new>
Refs: #123, #245, #992
如果存在不兼容变动,也可以在 Footer 中进行说明,必须以 BREAKING CHANGE 开头,冒号后跟破坏性变更的提交说明。
feat: allow provided config object to extend other configs
BREAKING CHANGE: `extends` key in config file is now used for extending other config files
(1)Header 中的类型应该使用小写还是大写?
大小写都可以,但最好是一致的。
(2)如果提交的变更符合多种类型该如何操作?
回退并尽可能创建多次提交。约定式提交的好处之一是能够促使我们做出更有组织的提交和 PR。
(3)约定式提交和 SemVer 有什么关联呢?
fix 类型提交应当对应到 PATCH 版本。feat 类型提交应该对应到 MINOR 版本。带有 BREAKING CHANGE 的提交不管类型如何,都应该对应到 MAJOR 版本。
(4)约定式提交规范中如何处理还原(revert)提交?
还原提交(Reverting)会比较复杂:你还原的是多个提交吗?如果你还原了一个功能模块,下次发布的应该是补丁吗?
约定式提交不能明确的定义还原行为。所以我们把这个问题留给工具开发者, 基于“类型”和“脚注”的灵活性来开发他们自己的还原处理逻辑。
一种建议是使用 revert 类型,并使用一个页脚来引用正在被恢复的提交哈希值。
revert: let us never again speak of the noodle incident
Refs: 676104e, a215868
Commitizen 是一个撰写合格 Commit message 的工具。
借助 Commitizen 提供的 git cz 命令替代我们的 git commit 命令,可以帮助我们书写合格的 Commit Message。
全局安装命令如下:
npm intall -g commitizen
安装完 commitizen 后我们还需要为其指定一个适配器(Adapter)。
在 Commitizen 中,不同的项目可能会使用不同的提交消息规范,例如 Angular 的规范、ESLint 的规范等。为了支持这些不同的规范,Commitizen 提供了各种适配器(Adapters),每个适配器都用于将不同的提交消息规范适配到 Commitizen 的格式。
例如使用 cz-conventional-changelog 适配器,使其支持 Angular 的 Commit message 格式。
commitizen init cz-conventional-changelog --save --save-exact
安装完成后,凡是用到 git commit 命令,一律改为使用 git cz。这时,就会以交互的方式,按照一步一步的提示书写符合 Angular 提交约定的 Commit message。
除了遵循约定式提交,还可以根据团队或项目的需要制定自己的提交消息规范。重要的是保持一致性,并确保提交消息清晰、有意义,并包含足够的上下文信息。
此外,还可以使用工具和插件来帮助规范化提交消息,如使用 Git 提交模板、提交钩子(Commit Hooks)或自动化提交消息验证工具(Commitlint)等。
无论使用何种规范,编写规范的提交消息都有助于提高代码库的可读性、可维护性和协作效率。
如果您喜欢这篇文章,欢迎关注微信公众号“恋喵大鲤鱼”了解最新精彩内容。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。