【研发规范】Git 提交(commit)、CodeReview规范

news/2025/9/30 11:46:12/文章来源:https://www.cnblogs.com/neolshu/p/19120615

本文将分为三个部分:

  1. 为什么需要提交规范?
  2. 提交规范详解(核心内容)
  3. 与 Code Review 流程的结合

1. 为什么需要提交规范?

在 Code Review 前,如果提交的代码杂乱无章,审查者会非常痛苦:

  • 理解成本高:审查者需要花费大量时间猜测这个提交到底做了什么为什么这么做
  • 范围不明确:一个提交里混杂了多个功能的修改,难以聚焦审查。
  • 历史追溯困难:混乱的提交信息使得日后排查问题、生成变更日志(Changelog)变得几乎不可能。

良好的提交规范旨在解决这些问题,它的核心目标是:让每一次提交都是一个逻辑独立、意图明确、易于理解的故事单元。


2. 提交规范详解

一份优秀的提交(Commit)主要由两部分组成:

  1. 提交信息
  2. 提交内容(代码变更集)

A. 提交信息规范

提交信息是写给未来维护者(包括你自己) 的说明文档。一个常见的规范格式是:

<类型>[可选 范围]: <主题>[空行][正文][空行][脚注]

举例说明:

feat(auth): add login with GitHub OAuth- Add new `GithubOAuthProvider` class implementing the OAuth flow.
- Extend `User` model to include `oauth_provider` and `oauth_id` fields.
- Add unit tests for the new provider.Closes #123
BREAKING CHANGE: The `User.login()` method now returns a Promise.

逐部分解析:

  1. 类型(Type): 说明本次提交的性质。常用类型包括:

    • feat: 新功能。
    • fix: 修复 bug。
    • docs: 仅文档更改。
    • style: 不影响代码逻辑的格式修改(如空格、分号)。
    • refactor: 既不是新功能也不是 bug 修复的代码重构。
    • perf: 性能优化。
    • test: 增加或修改测试用例。
    • chore: 构建过程或辅助工具的变动(如更新依赖)。
  2. 范围(Scope,可选): 说明本次提交影响的模块或组件。例如 (auth), (user-api), (ui-component)。这让审查者能快速定位受影响的核心区域。

  3. 主题(Subject): 对本次更改的简短描述

    • 规范:使用祈使句、现在时(如 "add", 而不是 "added" 或 "adds");首字母不需大写;结尾不加句号。
    • 长度:建议在50个字符以内。
  4. 正文(Body,可选): 详细说明做了什么为什么这么做,而不是怎么做的(代码本身展示了怎么做)。

    • 与之前的代码有何不同?
    • 为什么这个解决方案是合理的? (尤其是对于复杂的逻辑)
    • 是否有其他考虑过的方案?
    • 每行长度建议在72个字符以内。
  5. 脚注(Footer,可选): 用于存放元数据。

    • 关闭 IssueCloses #123, Fixes #456
    • 破坏性变更:如果本次提交是不兼容的变更,必须用 BREAKING CHANGE: 开头,并描述变更详情和迁移指南。

B. 提交内容规范

比提交信息更重要的是提交的内容本身。核心原则是:原子提交

  • 一个提交只做一件事

    • 正确示例:提交A只实现新功能,提交B只重构相关代码,提交C只修改文档。
    • 错误示例:一个提交里既修复了bug,又重构了代码,还顺手格式化了文件。
  • 为什么原子提交重要?

    • 易于审查:审查者可以轻松理解一个小的、逻辑完整的变更。
    • 易于回滚:如果某个功能引入问题,可以安全地回滚单个提交,而不会影响其他修改。
    • 易于定位问题:使用 git bisect 等工具时,原子提交能快速定位引入问题的具体变更。

3. 与 Code Review 流程的结合

提交规范是 Code Review 的前置条件。一个理想的流程如下:

场景:为购物车添加商品数量验证功能

步骤 1: 创建功能分支

git checkout -b feature/add-cart-quantity-validation

步骤 2: 进行原子开发与提交

  • 提交 1: 添加验证逻辑

    # 假设你修改了 shopping_cart.py
    git add shopping_cart.py
    git commit -m "feat(cart): add quantity validation for items- Validate that item quantity is a positive integer.
    - Throw `InvalidQuantityError` if validation fails.
    - Add relevant unit tests for valid and invalid cases."
    
  • 提交 2: 更新 API 文档

    # 假设你更新了 api_docs.md
    git add api_docs.md
    git commit -m "docs(api): update cart endpoint docs with quantity rulesDocument the new validation rule for the `quantity` field in the
    `POST /cart/items` endpoint."
    

步骤 3: 推送到远程并发起 Pull Request (PR) / Merge Request (MR)
此时,你的 PR 中将包含两个清晰、独立的提交。审查者可以:

  1. 快速浏览提交历史,了解工作内容。
  2. 分别审查每个提交,重点关注核心逻辑(第一个提交)和文档(第二个提交)。
  3. 如果发现文档有问题,可以直接评论在第二个提交上,而不会影响第一个提交的讨论。

步骤 4: 根据审查意见修改
审查者建议在验证逻辑中加入上限检查。

  • 不要直接提交,而是使用 git commit --amendgit rebase -i修正上一个相关的提交,保持历史整洁。
# 修改 shopping_cart.py 文件,添加上限检查
git add shopping_cart.py
git commit --amend # 这会将修改合并到 "feat(cart): add quantity validation..." 这个提交中
# 在打开的编辑器中,更新提交信息(如果需要的话):
# feat(cart): add quantity validation for items
#
# - Validate that item quantity is a positive integer between 1-99.
# - Throw `InvalidQuantityError` if validation fails.
# - Add relevant unit tests for valid and invalid cases.

步骤 5: 推送更新
由于修改了历史,需要强制推送(在功能分支上通常是安全的):

git push -f origin feature/add-cart-quantity-validation

PR/MR 会自动更新,审查者看到的是整理后最清晰的提交历史。

总结:优秀提交规范的核心价值

规范要点 对 Code Review 的好处 反面案例的坏处
清晰的提交信息 审查者秒懂提交意图,降低沟通成本。 fix a bug, 审查者需要猜是什么bug。
原子提交 审查小而精的代码块,思路不被打断,容易发现深层问题。 一个提交修改20个文件,混杂功能、修复、格式,审查如同大海捞针。
逻辑独立的变更集 可以按提交逐个审查、通过甚至回滚。 代码耦合严重,审查一个功能必须理解所有无关改动。

工具推荐

  • commitizen: 一个交互式工具,帮助你生成符合规范(如 Angular Convention)的提交信息。
  • husky + commitlint: 在 Git 提交时自动检查提交信息格式,确保规范被遵守。

遵循良好的提交规范,不仅是对审查者的尊重,更是对项目未来可维护性的投资,也是每一位专业工程师应具备的基本素养。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCIE 各个管脚的作用是什么?

REQ-CLK PCIe REQ-CLK GPIO(Request Clock GPIO) 是在某些 SoC 或平台上用于 控制 PCIe 参考时钟(REFCLK)请求/使能 的信号,通常与 CLKREQ#(Clock Request) 功能相关。它的作用主要体现在 低功耗管理 和 链路唤…

移动端网站没有icpwin2008做的网站打不开

1.Normalizer&#xff08;归一化&#xff09;&#xff08;更加推荐使用&#xff09; 优点&#xff1a;将每个样本向量的欧几里德长度缩放为1&#xff0c;适用于计算样本之间的相似性。 缺点&#xff1a;只对每个样本的特征进行缩放&#xff0c;不保留原始数据的分布形状。 公式…

Windows 11 局域网打印机共享设置

🎈遵照本教程设置完成后,可实现电脑无密码共享本地打印机。点击图片可放大! I. 同一网络和工作组 为使打印机共享成功,需确保要访问的计算机都在“同一网络”和“同一工作组”。找到 Windows 徽标,打开[设置],在…

DailyPaper-2025-9-29

失踪人口回归,才识浅薄啥也不懂勿喷LongLive: Real-time Interactive Long Video Generation https://arxiv.org/abs/2509.22622LongLive is a frame-level autoregressive framework for real-time and interactive …

MySQL版本选择

MySQL版本选择我们使用的MySQL8.0+和5.7+都是LTS版本,8.4+也已成为最新的一个LTS版本。 MySQL 8.4.x 延续了 8.0 系列的性能优化和安全性改进,包括JSON 表支持、窗口函数等新特性,同时修复了此前版本的安全漏洞和兼…

gpd winmax2 fedora42 睡眠秒唤醒问题

最近入了gpd win max2 2025 8840u款学习机(bushi),到手就刷了fedora 42 和野蛮学习系统(bushi),fedora42下遇到睡眠秒唤醒的问题。这个问题在我之前的8845hs处理器的笔记本上面也有,但情况跟gpd这个还不一样,接…

国企人力资源管理系统怎么选?内行人推荐这8款,功能、服务双保障

摘要:新一轮国企改革对HR管理提更高要求,传统系统难满足合规、干部管理、信创等需求。本文测评红海云、用友等8款主流国企人力资源管理系统,分析优劣,还给出选型避坑与落地建议,助力国企HR数字化转型。本文属于深…

无锡网站建设网百度广告联盟看广告赚钱

第 一 部分 高级篇 第 1 章 Explain 查看执行计划 在 clickhouse 20.6 版本之前要查看 SQL 语句的执行计划需要设置日志级别为 trace 才能可以看到&#xff0c;并且只能真正执行 sql&#xff0c;在执行日志里面查看。在 20.6 版本引入了原生的执行计划的语法。在 20.6.3 版本成…

巩义网站建设联系电话泉州专业网站设计技术公司

有时候想要对比跨度几十个commits之前的代码区别&#xff0c;想直接使用github的用户界面。可以直接在官网操作。 示例 首先要创建一个旧commit的branch。进入该旧的commit&#xff0c;然后输入branch名字即可。 然后在项目网址后面加上compare即可对比旧的branch和新的bran…

linux查询磁盘空间,查询指定目录的空间 df命令

linux查询磁盘空间,查询指定目录的空间 df命令linux查询磁盘空间,查询指定目录的空间 命令格式: df -h:以人类可读格式(GB/MB/KB)显示空间信息 jenkins启动失败,可能是磁盘空间不足,查询指定目录的空间验证磁盘空…

东莞网站推广模式音乐推广公司

AI是一门入门简单&#xff0c;但想深入却很难的学科&#xff0c;这也是为什么AI高端人才一直非常紧缺的重要原因。在AI领域技术领域&#xff0c;我们可以说机器学习功底决定了一个人的上限也不为过。为什么&#xff1f;机器学习就像物理学中的数学&#xff0c;如果你对数学没有…

轻松规划房贷:用好公积金贷款,让梦想之家触手可及

在现代生活中,买房是许多人追求的重要目标之一。公积金贷款因其利率较低、政策支持而备受青睐,但如何准确计算月供、利息和还款周期,却让不少人感到头疼。今天,我们来聊聊如何高效规划公积金贷款,并分享一个实用工…

做彩票网站要多大服务器高密哪里做网站

首先&#xff0c;我们先弄明白拼多多场景推广的展示以及扣费规则&#xff1a;排名规则&#xff1a;综合排名商品质量分广告出价。商品质量分点击率转化率销量交易额。扣费规则&#xff1a;扣费&#xff08;下一位的出价*下一位的商品素材点击率&#xff09;/自己的商品素材点击…

唐河网站建设wordpress官方模板下载

文章目录 一些开发中遇到的SQL问题1. sql报11090错误,原因可能是以下错误&#xff0c;在&#xff1f;占位符后有一个空格2. 占位符&#xff1f;的位置不能是表名&#xff0c;否则会无法进行预编译3. mysql中desc是关键字&#xff0c;如果字段名称为desc会报错4. 数据库中时间格…

milvus使用的etcd空间整理

环境说明: docker compose部署的ETCD1.查看etcd容器情况[root@localhost milvus]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS …

设计素材网站图案免费低价建设网站

【.NET Core】Linq查询运算符&#xff08;二&#xff09; 文章目录 【.NET Core】Linq查询运算符&#xff08;二&#xff09;一、概述二、生成运算2.1 DefaultIfEmpty2.2 Empty2.3 Range2.4 Repeat 三、相等运算3.1 SequenceEqual 四、元素运算4.1 ElementAt4.2 ElementAtOrDef…

网站备案截图宁波易企网做的网站

Axious的请求与响应 1.什么是Axious Axious是一个开源的可以用在浏览器和Node.js的异步通信框架&#xff0c;它的主要作用就是实现AJAX异步通信&#xff0c;其功能特点如下&#xff1a; 从浏览器中创建XMLHttpRequests ~从node.js创建Http请求 支持PromiseAPI 拦截请求和…

k8s使用的etcd空间清理

1.查看当前k8s的情况[root@master snap]# kubectl get pods -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE …

MyBatis 与 JPA 的核心对比

------------------------------------------------------------------------------------------- 一、MyBatis 中 Mapper 注解与 XML 方式在处理复杂业务逻辑时的核心差异 复杂业务逻辑通常涉及 动态 SQL(多条件拼接…

完整教程:Redis 提供了两种主要的持久化机制:RDB 和 AOF

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …