<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Commitizen on Tuan's Blog</title><link>https://blog.cloudorz.com/tags/commitizen/</link><description>Recent content in Commitizen on Tuan's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>mt</copyright><lastBuildDate>Sun, 01 Nov 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://blog.cloudorz.com/tags/commitizen/index.xml" rel="self" type="application/rss+xml"/><item><title>如何正确地书写 Git Commit</title><link>https://blog.cloudorz.com/p/how-to-write-git-commit-properly/</link><pubDate>Thu, 18 Apr 2024 14:21:54 +0800</pubDate><guid>https://blog.cloudorz.com/p/how-to-write-git-commit-properly/</guid><description>&lt;img src="https://blog.cloudorz.com/p/how-to-write-git-commit-properly/cover.svg" alt="Featured image of post 如何正确地书写 Git Commit" /&gt;&lt;h2 id="前言"&gt;前言&#10;&lt;/h2&gt;&lt;p&gt;啊 🤔 马上毕业面临找工作 = =，然后上课发呆。突然想起来工作室的一位前辈去腾讯实习期间积累下的一些知识，并传授给了我们。然后就有了这次的博文：如何正确且规范地书写 Git Commit。一直想记在博客里来着。最近一堆没用的破事儿压着我喘不过气。好在这次趁着闲下来，凭借几年前的记忆以及搜集到的知识整理好书写如下。&lt;/p&gt;&#10;&lt;h2 id="git-commit-规范"&gt;Git Commit 规范&#10;&lt;/h2&gt;&lt;p&gt;直接上干货。目前最通用的是 &lt;a class="link" href="https://www.conventionalcommits.org/zh-hans/v1.0.0/" target="_blank" rel="noopener"&#10; &gt;Conventional Commits（约定式提交）&lt;/a&gt; 规范，提交信息的第一行以一个&lt;strong&gt;类型&lt;/strong&gt;开头，常用类型如下：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;类型&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;含义&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;feat&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;引入了新功能或功能改进&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;fix&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;修复 Bug&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;docs&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;文档的变更，如更新文档或添加注释&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;style&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;代码风格的变更，如格式调整、空格和缩进的修改，不涉及功能修改&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;refactor&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;代码重构，既不修复错误也不添加新功能&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;perf&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;性能优化&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;test&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;添加或修改测试&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;build&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;构建系统或外部依赖的变更，如 webpack、npm 依赖&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;ci&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CI 配置文件和脚本的变更，如 GitHub Actions&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;chore&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;其他与构建过程或辅助工具相关的杂项变更，如修改构建脚本、配置文件等&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;revert&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;回滚之前的某次提交&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="为什么要写规范的-git-commit"&gt;为什么要写规范的 Git Commit&#10;&lt;/h2&gt;&lt;p&gt;先说现在存在的痛点。&lt;/p&gt;&#10;&lt;p&gt;拿一个我的反面例子来说：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="反面例子：含糊的提交信息" class="gallery-image" data-flex-basis="7040px" data-flex-grow="2933" height="36" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.cloudorz.com/p/how-to-write-git-commit-properly/junk-commit-msg.png" srcset="https://blog.cloudorz.com/p/how-to-write-git-commit-properly/junk-commit-msg_hu_9d8c523d4efe57e2.png 800w, https://blog.cloudorz.com/p/how-to-write-git-commit-properly/junk-commit-msg.png 1056w" width="1056"&gt;&lt;/p&gt;&#10;&lt;p&gt;文档：为一些代码增加了一些文档。&lt;/p&gt;&#10;&lt;p&gt;这还算基本合格，至少你还能通过 commit msg 看出大致干了什么。但是有时候我们会遇到更糟糕的情况。&lt;/p&gt;&#10;&lt;p&gt;比如我直接在 &lt;code&gt;GitHub&lt;/code&gt; 上在线编辑某个仓库中的某一段代码，顺带直接 &lt;code&gt;commit&lt;/code&gt;。默认情况下，&lt;code&gt;GitHub&lt;/code&gt; 缺省的 commit message 是 &lt;code&gt;Update xxx&lt;/code&gt;（文件名）。&lt;/p&gt;&#10;&lt;p&gt;刚开始几天可能觉得没什么。等过了几天你就忘了你 &lt;code&gt;update&lt;/code&gt; 了啥。或者堆了一堆 &lt;code&gt;commit&lt;/code&gt;，message 通篇都是 &lt;code&gt;Update xxx&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;痛点来了！！= =&lt;/p&gt;&#10;&lt;p&gt;如果恰好这时候你想让仓库回溯到某个版本，你就会发现前面提到的痛点：你根本不知道你 &lt;code&gt;update&lt;/code&gt; 了啥。这时候你就会后悔当初为什么不写一个规范的 commit message 来规避这个问题。&lt;/p&gt;&#10;&lt;h2 id="git-commit-规范的好处"&gt;Git Commit 规范的好处&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;有助于团队协作，提升团队效率。&lt;/li&gt;&#10;&lt;li&gt;有助于代码的维护、追踪、回滚、审查、发布、迭代、管理、规范、整洁、可读性、可维护性、可扩展性、可测试性、可靠性、稳定性、安全性、性能、质量、效率、可用性。（让 ChatGPT 帮我想了一些词）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;说点实在的：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;git log --oneline&lt;/code&gt; 扫一眼就知道每次提交干了什么；&lt;/li&gt;&#10;&lt;li&gt;想找某次修复，&lt;code&gt;git log --grep &amp;quot;^fix&amp;quot;&lt;/code&gt; 就能筛出来；&lt;/li&gt;&#10;&lt;li&gt;工具可以根据 &lt;code&gt;feat&lt;/code&gt; / &lt;code&gt;fix&lt;/code&gt; / &lt;code&gt;BREAKING CHANGE&lt;/code&gt; 自动生成 CHANGELOG、自动决定版本号。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-commit-规范的实践"&gt;Git Commit 规范的实践&#10;&lt;/h2&gt;&lt;h3 id="完整格式"&gt;完整格式&#10;&lt;/h3&gt;&lt;p&gt;一条完整的提交信息分为三部分：&lt;strong&gt;标题（header）&lt;/strong&gt;、&lt;strong&gt;正文（body）&lt;/strong&gt; 和 &lt;strong&gt;脚注（footer）&lt;/strong&gt;，之间用空行隔开：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;type&amp;gt;(&amp;lt;scope&amp;gt;): &amp;lt;subject&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;body&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;footer&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;img alt="一条规范提交信息的结构" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.cloudorz.com/p/how-to-write-git-commit-properly/commit-anatomy.svg"&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;type&lt;/strong&gt;：上面表格里的类型，必填；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;scope&lt;/strong&gt;：影响范围，可选，比如模块名 &lt;code&gt;auth&lt;/code&gt;、&lt;code&gt;api&lt;/code&gt;、&lt;code&gt;ui&lt;/code&gt;；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;subject&lt;/strong&gt;：一句话说明做了什么，必填。建议用祈使句、首字母小写、结尾不加句号，标题整行控制在 50 个字符左右；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;body&lt;/strong&gt;：可选，说明&lt;strong&gt;为什么&lt;/strong&gt;改、改了什么，每行 72 个字符左右换行；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;footer&lt;/strong&gt;：可选，用于关联 Issue（&lt;code&gt;Closes #123&lt;/code&gt;）或声明不兼容变更（&lt;code&gt;BREAKING CHANGE: ...&lt;/code&gt;）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="几个例子"&gt;几个例子&#10;&lt;/h3&gt;&lt;p&gt;只有标题的小改动：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docs: fix typo in README&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;带范围和正文：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;feat(auth): support login with GitHub OAuth&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Users can now sign in with their GitHub account.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The access token is stored in an HttpOnly cookie.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Closes #42&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;不兼容变更，在类型后加 &lt;code&gt;!&lt;/code&gt;，并在脚注中说明：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;feat(api)!: remove v1 endpoints&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BREAKING CHANGE: /api/v1/* has been removed, use /api/v2/* instead.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="写错了怎么办"&gt;写错了怎么办&#10;&lt;/h3&gt;&lt;p&gt;最近一次提交还没推送的话，直接修改：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit --amend&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;要改更早的提交，用交互式变基，把对应行的 &lt;code&gt;pick&lt;/code&gt; 改成 &lt;code&gt;reword&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git rebase -i HEAD~3&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;已经推送到公共分支的提交不要随便改写历史，否则会给协作者带来麻烦。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="一次提交只做一件事"&gt;一次提交只做一件事&#10;&lt;/h3&gt;&lt;p&gt;规范的提交信息的前提是规范的提交：修 Bug 和加功能分开提交，格式化代码单独提交。如果一次改动里混了多件事，可以用 &lt;code&gt;git add -p&lt;/code&gt; 按块暂存，分几次提交。&lt;/p&gt;&#10;&lt;h2 id="git-commit-规范的工具"&gt;Git Commit 规范的工具&#10;&lt;/h2&gt;&lt;p&gt;靠自觉总有忘的时候，交给工具来约束更靠谱。下面的工具都基于 Node.js，适用于任何语言的项目（只要装了 Node.js 即可）。&lt;/p&gt;&#10;&lt;h3 id="commitizen交互式填写"&gt;Commitizen：交互式填写&#10;&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/commitizen/cz-cli" target="_blank" rel="noopener"&#10; &gt;Commitizen&lt;/a&gt; 用问答的方式引导你填写 type、scope、subject，不用记格式：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g commitizen&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;commitizen init cz-conventional-changelog --save-dev --save-exact&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;之后用 &lt;code&gt;git cz&lt;/code&gt; 代替 &lt;code&gt;git commit&lt;/code&gt; 即可。&lt;/p&gt;&#10;&lt;h3 id="commitlint--husky提交时自动检查"&gt;commitlint + husky：提交时自动检查&#10;&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://commitlint.js.org/" target="_blank" rel="noopener"&#10; &gt;commitlint&lt;/a&gt; 负责检查提交信息是否符合规范，&lt;a class="link" href="https://typicode.github.io/husky/" target="_blank" rel="noopener"&#10; &gt;husky&lt;/a&gt; 负责在 &lt;code&gt;commit-msg&lt;/code&gt; 钩子里调用它：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装 commitlint 和约定式提交的规则集&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --save-dev @commitlint/cli @commitlint/config-conventional&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;export default { extends: [&amp;#39;@commitlint/config-conventional&amp;#39;] };&amp;#34;&lt;/span&gt; &amp;gt; commitlint.config.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装 husky 并添加 commit-msg 钩子&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install --save-dev husky&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx husky init&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;npx --no -- commitlint --edit \$1&amp;#34;&lt;/span&gt; &amp;gt; .husky/commit-msg&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;配置好以后，不规范的提交会被直接拦下来：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="commitlint 拦截不规范的提交" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.cloudorz.com/p/how-to-write-git-commit-properly/commitlint-terminal.svg"&gt;&lt;/p&gt;&#10;&lt;h3 id="编辑器插件"&gt;编辑器插件&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;VS Code：&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=vivaxy.vscode-conventional-commits" target="_blank" rel="noopener"&#10; &gt;Conventional Commits&lt;/a&gt; 插件，在源代码管理面板里一步步选择类型和范围；&lt;/li&gt;&#10;&lt;li&gt;JetBrains 系列 IDE：插件市场搜索 &lt;em&gt;Conventional Commit&lt;/em&gt;。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="总结"&gt;总结&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;标题用 &lt;code&gt;type(scope): subject&lt;/code&gt;，一眼看出改了什么；&lt;/li&gt;&#10;&lt;li&gt;正文写清楚&lt;strong&gt;为什么&lt;/strong&gt;改；&lt;/li&gt;&#10;&lt;li&gt;一次提交只做一件事；&lt;/li&gt;&#10;&lt;li&gt;用 commitlint + husky 兜底，团队里就不会再出现满屏的 &lt;code&gt;Update xxx&lt;/code&gt; 了。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="参考"&gt;参考&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://www.conventionalcommits.org/zh-hans/v1.0.0/" target="_blank" rel="noopener"&#10; &gt;Conventional Commits 1.0.0（中文）&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://commitlint.js.org/" target="_blank" rel="noopener"&#10; &gt;commitlint 官方文档&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/angular/angular/blob/main/CONTRIBUTING.md#commit" target="_blank" rel="noopener"&#10; &gt;Angular 提交信息规范&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>