现在开发的源代码管理工具,基本都是基于git的。代码提交的日志,有很多的格式。都按照自己喜好提交,比较的混乱。能否有一个git提交的规范呢?本文将从git提交规范切入,实现一个规范化git提交。
git提交现状
截取了一段代码提交日志。一眼望去,这都是啥?确实,在多人协作,或查看修改日志的时候,完全不知道都做了什么。
那么git提交规范的好处都有哪些?
为什么需要git提交规范
-
首先,提交规范可以提高团队协作的效率。
在多人协调开发时,如果每个人的提交信息都符合规范,那么其他人可以更容易地理解代码的变化,从而更好地理解提交的内容,这将大大提高团队的协作效率。
-
其次,提交规范可以帮助代码审查者更有效地理解代码修改内容。
规范的提交信息可以使代码审查者更快地理解修改后的内容,从而减轻其审查负担,这将有助于提高代码的质量。
-
再次,规范的提交信息可以方便代码的返回。
当需要返回代码到特定版本时,合理标准的Git提交信息可以很容易地找到相应的版本,并快速恢复代码。这将对团队的开发效率产生积极的影响。
-
此外,提交规范还可以记录项目开发过程,方便后期维护和追溯。
清晰的提交注释可以使团队更好地了解代码的修改历史和项目的发展方向,有助于后期对项目的维护和改进。
因此,git提交规范是比较重要,且容易忽略的内容。
git提交规范
提交格式规范
约定 commit
的提交格式规范,包含Header
,Body
(可选) 和 Footer
(可选)。
html
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
Header
type
用于说明 'commit' 的类别,主要包含以下类型
type | 说明 |
---|---|
feat | 新功能 |
fix | 修复BUG |
docs | 文档更新 |
style | 样式更新 |
refactor | 重构 |
test | 增加测试内容 |
chore | 构建过程或辅助工具的变动 |
scope
用于说明 commit
影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。
subject
是 commit
目的的简短描述,不超过50个字符。
这样就形成了第一行commit
内容
shell
feat(新增视图层):添加登录页面
或
shell
feat:添加登录页面
一般来说,我们这样提交就够了。但是,如果有更多功能描述,就需要Body
(可选) 和 Footer
(可选)了。
Body
Body
部分是对本次 commit
的详细描述,可以分成多行。
shell
feat(新增视图层):添加登录页面
- 支持自动登录
登录页面,新增链接参数解析,如果链接中包含from=auto,则表示进行自动登录
Footer
主要是在 不兼容变动
和 关闭 Issue
时进行使用。
基于以上规范,我们在进行git提交的时候,就可以按规范进行提交。但是,有个好的工具,可以让规范更好的执行。
下面引入commitizen
实现以上commit
信息的生成
commitizen
Commitizen
是一个用于撰写Git
提交信息的工具。它可以帮助开发人员遵循一个规范,以便更容易地阅读和维护Git仓库历史记录。Commitizen
采用了一个交互式的命令行界面,引导你逐步填写必要的数据,从而生成符合规范的Git
提交信息。
环境配置
shell
npm install -g commitizen
接下来,要安装cz-conventional-changelog
,其中,包含以上规则
shell
commitizen init cz-conventional-changelog --save --save-exact
配置package.json
文件,添加如下内容
json
"config": {
"commitizen": {
"path": "cz-conventional-changelog"
}
}
如何使用
基本用法
shell
➜ project git:(main) ✗ git add .
shell
➜ project git:(main) ✗ npx cz
cz-cli@4.3.0, cz-conventional-changelog@3.3.0
? Select the type of change that you're committing: (Use arrow keys)
❯ feat: A new feature
fix: A bug fix
docs: Documentation only changes
style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
refactor: A code change that neither fixes a bug nor adds a feature
perf: A code change that improves performance
test: Adding missing tests or correcting existing tests
(Move up and down to reveal more choices)
添加commit
信息
vbnet
? Select the type of change that you're committing: fix: A bug fix
? What is the scope of this change (e.g. component or file name): (press enter to skip) name
? Write a short, imperative tense description of the change (max 89 chars):
(4) desc
? Provide a longer description of the change: (press enter to skip)
long
? Are there any breaking changes? No
? Does this change affect any open issues? No
显示log信息如下:
scss
fix(name): desc
long
自定义
由于我们公司需要将需求和代码进行关联,因此,需要在commit
的时候,将用户故事ID作为content
的一部分。主要格式是需求ID
+ 提交类型
+ 提交内容
。这个和默认格式不同,就需要自定义
xml
<featID><type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
这里直接修改commitizen
中的path
,不使用cz-conventional-changelog
json
"config": {
"commitizen": {
"path": "./cz-conventional-changelog"
}
}
然后,在根目录,添加cz-conventional-changelog.js
文件
php
var map = require('lodash.map');
var longest = require('longest');
function prompter(cz, commit) {
let types = {
"feat": {
"description": "A new feature",
"title": "Features"
},
"fix": {
"description": "A bug fix",
"title": "Bug Fixes"
},
"docs": {
"description": "Documentation only changes",
"title": "Documentation"
},
"style": {
"description": "Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)",
"title": "Styles"
},
"refactor": {
"description": "A code change that neither fixes a bug nor adds a feature",
"title": "Code Refactoring"
},
"test": {
"description": "Adding missing tests or correcting existing tests",
"title": "Tests"
},
"chore": {
"description": "Other changes that don't modify src or test files",
"title": "Chores"
},
}
var length = longest(Object.keys(types)).length + 1;
var choices = map(types, function (type, key) {
return {
name: (key + ':').padEnd(length) + ' ' + type.description,
value: key
};
});
cz.prompt([{
type: 'commitID',
name: 'hook',
message: 'Write a commitID \n',
}, {
type: 'list',
name: 'type',
message: "Select the type of change that you're committing:",
choices: choices
},
{
type: 'input',
name: 'scope',
message: 'What is the scope of this change (e.g. component or file name): (press enter to skip)',
},
{
type: 'input',
name: 'subject',
message: 'Write a short, imperative tense description of the change'
},
{
type: 'input',
name: 'body',
message: 'Write a body \n'
},
{
type: 'input',
name: 'footer',
message: 'Write a footer \n'
},
]).then(answers => {
const {
hook,
type,
scope,
subject,
body,
footer
} = answers
const message = `
${hook}:${type}(${scope}):${subject}
${body}
${footer}
`
commit(message)
})
}
module.exports = {
prompter
}
这里主要是借用了cz-conventional-changelog
,这样就形成了一个简易的git
提交规范