Good Git Commit Message

Aug 18, 2020
·

why good commit

git commit 是当次 committing 更改的简短描述。良好的 commit message 不仅仅有利于与和他人合作,而且能很方便的追踪工作记录。

how to write

commit message 格式

    format: [emoji] <type>(scope): <message>
 
    - emoji:options
 
    - type: require
 
    - scope:require
 
    - message(description):  require

type

  • feat: a new feature
  • fix: a bug fix
  • improvement: an improvement to a current feature
  • docs: documentation only change
  • style: everything related to styling
  • refactor: a code change that is neither a bug fix nor a feature addition
  • test: everything related to testing
  • chore: updating build task, package manager config, etc

scope

  • 当前 commit 影响范围

descript

  • 当前 commit 简短描述

emojis type

one style

  • when adding a file or implementing a feature
  • when fixing a bug or issue
  • when improving code or comments
  • when improving performance
  • when updating docs or readme
  • when dealing with security
  • when updating dependencies or data
  • when a new release was built
  • when refactoring or removing linter warnings
  • when removing code or files

another style

  • [tada] initial commit
  • [Add] when implementing a new feature
  • [Fix] when fixing a bug or issue
  • [Refactor] when refactor/improving code
  • [WIP]
  • [Minor] Some small updates

gitHook

package.json

    "githook": {
      "pre-commit": "lint-staged",
      "commit-msg": "node scripts/verifyCommitMsg.js"
    }

scripts/verifyCommitMsg.js

const chalk = require("chalk")
// const msgPath = process.env.HUSKY_GIT_PARAMS;
const msgPath = process.env.GIT_PARAMS
const msg = require("fs").readFileSync(msgPath, "utf-8").trim()
 
const commitRE =
  /^(v\d+\.\d+\.\d+(-(alpha|beta|rc.\d+))?)|((revert: )?(feat|fix|docs|style|refactor|perf|test|workflow|ci|chore|types)(\(.+\))?!?: .{1,50})/
 
if (!commitRE.test(msg)) {
  console.error(
    `  ${chalk.bgRed.white(" ERROR ")} ${chalk.red(
      `invalid commit message format.`,
    )}\n\n` +
      chalk.red(
        `  Proper commit message format is required for automated changelog generation. Examples:\n\n`,
      ) +
      `    ${chalk.green(`feat(compiler): add 'comments' option`)}\n` +
      `    ${chalk.green(`fix(menu): handle events on blur (close #28)`)}\n\n` +
      chalk.red(`  See .gitlab/commit-convention.md for more details.\n`),
  )
  process.exit(1)
}

tools

commitizen

gitmoji-cli

references