🥊

使用 Commitlive 优雅编写 Git Commit Message

Created
Feb 28, 2021 10:20 AM
Tags
git
conventional-commit

功能演示示例

commitlive demo
commitlive demo

重视 Git Commit Message

Git,作为一种处理代码变更的工具,它使用哈希值来区分代码变更
问题在于,哈希值的可读性为 0 ,所以我们在提交 Git Commit 的时候,它会强制要求我们提供 Commit Message,作为对代码变更的可读的描述
然而,这种可读的描述是自由的。而且由于 Commit Message 的目的并不是用来区分代码变更,两个 Commit Message 可能是一模一样,逻辑上是可行的,并没有错
这也导致一些比较哲学的 Commit Message 产生:
bad commit message
bad commit message
社区也一直在提出新的方案来解决这种问题,让每个人都写出好的、具描述性的 Commit Message

一种流行的解决方案

一种自然直观的解决方案就是制定一套规约,让大家都清楚该写什么、不该写什么,保证其一致性 ( consistency )。其中比较流行的规约就是 Conventional Commit :它有统一的模板和关键字,能对对各种 Commit Message 进行分类并显眼地标出重大变更,已经在很多大型的开源项目中使用
它的基本格式如下:
<type>[optional scope]: <description>

[optional body]

[optional footer(s)]
详细的解释请查看官方文档

命令行写 Commit 的痛处

像我这样敲命令成瘾的人,在命令行写 Conventional Commit 更能带给我快乐 !
遗憾的是它十分不方便:
  • 如果要写 [optional body] [optional footer(s)],需要手动换两行,不够直观 ( 理想情况是换一行 )
  • <type> 关键字的含义容易忘记 ( 需要花时间回顾才能想起来 ),命令行没有足够提示,不能立即写出更好更合适的关键字
  • 对 Commit Message 的 lint 检查还需要把它复制粘贴作为 Commitlint 的输入才能检查,对我来说这是十分反人类的设计
最好能出现一个小工具,让我在写 Commit Message 的时候有足够的提示,自动添加换行并且能够做到即时语法检查

Commitlive

遗憾的是现有的 Conventional Commit CLI 工具都很让我失望,没能解决上面的问题,甚至还把它们复杂化了
于是我决定自己开发,这样便有了 commitlive 的诞生
commitlive 通过以下功能解决了上面的痛楚:
  • tab 补全:当你想不起 <type> 和其含义时,按下 tab,我们会补全或给出相应的提示
    • notion image
  • 结构提示:commitlive 会提示你为何以及何时写 <type>[scope]<description>[optional body][optional footer(s)]
    • notion image
  • 即时寻找 GitHub 上的 Issue 和 PR:借用 github cli 实现对 Issue 和 PR 的查找,然后输出其信息
    • notion image
  • 即时 lint:输入的同时它会帮我们 lint 检查当前的 Commit Message,然后输出结果
    • notion image
  • 接近原生:使用 commitlive 的感觉和 git commit 一模一样
  • 专注于输入而非选择:有些 CLI 工具的逻辑是使用方向键选择 <type>,看起来很方便,实际上效率是很低的 ( 如果我要选择排在最后的 <type>,需要不停按方向键 );而 commitlive 只提供一个输入框,按下 tab 会有提示,当用户开始输入内容后再按下 tab,commitlive 会自动补全匹配的内容

上手示例

对已 Staged 的文件进行一次交互式的 commit
npx commitlive 
对改动的所有文件进行一次交互式的 commit
npx commitlive -am
聪明的你一定发现了,它的使用方式和 git commit 一模一样,所以它的学习成本几乎为 0 ,快来用起来吧!
项目地址:
如果此项目恰好也有化解你的痛点,请 star 支持一下,谢谢!