打造git提交规范

现在开发的源代码管理工具,基本都是基于git的。代码提交的日志,有很多的格式。都按照自己喜好提交,比较的混乱。能否有一个git提交的规范呢?本文将从git提交规范切入,实现一个规范化git提交。

git提交现状

截取了一段代码提交日志。一眼望去,这都是啥?确实,在多人协作,或查看修改日志的时候,完全不知道都做了什么。

那么git提交规范的好处都有哪些?

为什么需要git提交规范

  • 首先,提交规范可以提高团队协作的效率。

    在多人协调开发时,如果每个人的提交信息都符合规范,那么其他人可以更容易地理解代码的变化,从而更好地理解提交的内容,这将大大提高团队的协作效率。

  • 其次,提交规范可以帮助代码审查者更有效地理解代码修改内容。

    规范的提交信息可以使代码审查者更快地理解修改后的内容,从而减轻其审查负担,这将有助于提高代码的质量。

  • 再次,规范的提交信息可以方便代码的返回。

    当需要返回代码到特定版本时,合理标准的Git提交信息可以很容易地找到相应的版本,并快速恢复代码。这将对团队的开发效率产生积极的影响。

  • 此外,提交规范还可以记录项目开发过程,方便后期维护和追溯。

    清晰的提交注释可以使团队更好地了解代码的修改历史和项目的发展方向,有助于后期对项目的维护和改进。

因此,git提交规范是比较重要,且容易忽略的内容。

git提交规范

提交格式规范

约定 commit的提交格式规范,包含HeaderBody(可选) 和 Footer(可选)。

html 复制代码
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>

type用于说明 'commit' 的类别,主要包含以下类型

type 说明
feat 新功能
fix 修复BUG
docs 文档更新
style 样式更新
refactor 重构
test 增加测试内容
chore 构建过程或辅助工具的变动

scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。

subjectcommit 目的的简短描述,不超过50个字符。

这样就形成了第一行commit内容

shell 复制代码
    feat(新增视图层):添加登录页面

shell 复制代码
    feat:添加登录页面

一般来说,我们这样提交就够了。但是,如果有更多功能描述,就需要Body(可选) 和 Footer(可选)了。

Body

Body 部分是对本次 commit 的详细描述,可以分成多行。

shell 复制代码
    feat(新增视图层):添加登录页面
    - 支持自动登录
      登录页面,新增链接参数解析,如果链接中包含from=auto,则表示进行自动登录

主要是在 不兼容变动关闭 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提交规范

相关推荐
和你一起去月球7 小时前
TypeScript - 函数(下)
javascript·git·typescript
我不是程序猿儿8 小时前
【GIT】TortoiseGit的变基(Rebase)操作
git
yyycqupt14 小时前
git使用(一)
git
Kkooe18 小时前
GitLab|数据迁移
运维·服务器·git
Beekeeper&&P...19 小时前
git bash是什么,git是什么,git中的暂存区是什么,git中的本地仓库是什么,git中工作目录指的是什么
开发语言·git·bash
Stara05111 天前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi
lsswear1 天前
GIT 操作
git
勋勋勋勋小勋勋1 天前
git分支合并某一次提交
git
PandaCave1 天前
git常用命令以及注意事项总结
git