Conventional Commits 与 Semantic Versioning

共 21 题
#

1. Conventional Commits 1.0.0 的结构中<type>[optional scope]: <description>

A type 是可选字段,description 才是必填的
B `feat` 和 `fix` 是唯一会直接影响 SemVer 版本号的类型 ✓ 正确答案
C scope 用方括号包裹并紧跟 type 之后
D description 必须使用大写字母开头
#

2. Conventional Commits 的 BREAKING CHANGE 标记中! 后缀或正文 footer

A 必须在 body 中写 BREAKING CHANGE footer,`!` 无效
B `!` 后缀和 footer 中的 BREAKING CHANGE 都会触发 MAJOR 版本升级 ✓ 正确答案
C `!` 后缀只能用在 body 中,不能用在 header
D BREAKING CHANGE 只影响 PATCH 版本号
#

3. Conventional Commits 的 release-please、semantic-release 自动化生成 CHANGELOG

A release-please 直接发布到 npm,不经过 PR 审核
B 两者都通过解析提交历史中的 feat/fix/BREAKING CHANGE 来推算版本号 ✓ 正确答案
C semantic-release 从不生成 CHANGELOG
D 两者都依赖人工手动填写版本号
#

4. Conventional Commits 的 commitlint 配置(@commitlint/config-conventional)

A @commitlint/config-conventional 只能用于前端项目
B commitlint 通过 extends 配置引入 @commitlint/config-conventional 规则集 ✓ 正确答案
C commitlint 无法校验 header 长度
D commitlint 会在 push 时自动生成 CHANGELOG
#

5. Conventional Commits 与 git message 的 lint(commitlint、commitizen)协同

A commitizen 负责校验,commitlint 负责引导书写
B commitizen 引导书写规范消息,commitlint 在提交时校验拦截 ✓ 正确答案
C 两者功能完全相同,可任选其一
D commitizen 用于生成 CHANGELOG
#

6. Conventional Commits 与 squash merge 的协同

A squash merge 会跳过 Conventional Commits 校验
B squash merge 后每次提交都保留在历史中
C squash merge 后所有提交被合并,PR 标题成为提交消息 ✓ 正确答案
D 使用 squash merge 就不需要配置 commitlint
#

7. Conventional Commits 在 git hook(commit-msg)的强制门禁

A commit-msg hook 在 push 时执行
B commit-msg hook 只能校验代码格式
C commit-msg hook 在提交落盘前执行,校验失败会阻止提交 ✓ 正确答案
D commit-msg hook 无法访问提交消息文件
#

8. Conventional Commits 的"type"语义边界中 feat vs fix、refactor vs perf

A refactor 会触发 MAJOR 版本升级
B feat 和 fix 都会触发版本号升级,feat 触发 MINOR、fix 触发 PATCH ✓ 正确答案
C fix 触发 MINOR 版本升级
D perf 与 refactor 语义完全相同
#

9. SemVer 2.0.0 的三段式版本中 MAJOR.MINOR.PATCH 的语义定义

A MAJOR 在不兼容 API 变更时递增 ✓ 正确答案
B MINOR 在缺陷修复时递增
C PATCH 在功能新增时递增
D 版本号不反映兼容性
#

10. SemVer 与"hyrum's law"(海拉姆定律)的张力

A Hyrum's Law 说明 SemVer 完全准确
B Hyrum's Law 只影响 PATCH 版本
C Hyrum's Law 说明用户可能依赖未文档化的行为,使 SemVer 的兼容性承诺难以完全兑现 ✓ 正确答案
D Hyrum's Law 与 SemVer 无关
#

11. SemVer 的 0.x.y 语义中初始开发期的不稳定性

A 0.x.y 阶段公共 API 不稳定,任何变更都可能破坏兼容性 ✓ 正确答案
B 0.x.y 中 MAJOR 会递增
C 0.x.y 阶段保证完全向后兼容
D 0.x.y 与 1.x.y 语义完全相同
#

12. SemVer 的 MAJOR 升级条件中不向后兼容的 API 变更

A 任何代码改动都需要递增 MAJOR
B 只新增功能就需要递增 MAJOR
C MAJOR 与兼容性无关
D 删除或重命名公共 API 属于不兼容变更,应递增 MAJOR ✓ 正确答案
#

13. SemVer 的 MINOR 升级条件中向后兼容的功能新增

A 任何破坏性变更都递增 MINOR
B 修复缺陷时递增 MINOR
C 以向后兼容方式新增功能时递增 MINOR ✓ 正确答案
D MINOR 递增不影响 PATCH
#

14. SemVer 的 PATCH 升级条件中向后兼容的 bug 修复

A 新增功能时递增 PATCH
B PATCH 递增会改变 MAJOR
C 任何修改都递增 PATCH
D 向后兼容的缺陷修复时递增 PATCH ✓ 正确答案
#

15. SemVer 的先行版本(pre-release)中 1.0.0-alpha、1.0.0-rc.1 的语义

A pre-release 版本优先级高于正式版本
B 1.0.0-rc.1 与 1.0.0 优先级相同
C pre-release 版本优先级低于对应正式版本 ✓ 正确答案
D 依赖方在 ^1.0.0 下会自动获取 pre-release
#

16. SemVer 与 calendar versioning(CalVer)中 Ubuntu、Chrome 的取舍

A CalVer 强调兼容性语义,SemVer 强调时间
B 两者语义完全相同
C Ubuntu 使用 SemVer
D SemVer 强调兼容性语义,CalVer 强调时间可读性 ✓ 正确答案
#

17. SemVer 的 Cargo 版本约束中^1.2.3、~1.2.3、1.2.* 的差异

A ^1.2.3 允许 < 2.0.0 的所有版本
B Cargo.toml 中写 1.2.3 默认等价于 ^1.2.3 ✓ 正确答案
C ~1.2.3 允许 < 2.0.0 的所有版本
D 1.2.* 允许 < 2.0.0 的所有版本
#

18. Conventional Commits 与 Gitmoji 的取舍

A Gitmoji 是官方规定的标准格式
B 两者完全等价
C Gitmoji 表达灵活但难以被标准工具解析,Conventional Commits 更利于自动化 ✓ 正确答案
D Conventional Commits 不能用于自动化
#

19. Conventional Commits 的 type 自定义扩展(warning、security、deps)

A 任何自定义 type 都会触发 MAJOR 升级
B 自定义 type 默认不触发版本号升级,除非显式配置 ✓ 正确答案
C 规范禁止自定义 type
D 自定义 type 无需在 commitlint 中配置
#

20. SemVer 的 npm 版本范围中^、~、>=、<、1.2.x 的工程语义

A ^1.2.3 允许 >= 1.2.3 且 < 3.0.0
B ~1.2.3 允许 >= 1.2.3 且 < 2.0.0
C 1.2.x 允许 >= 1.2.0 且 < 2.0.0
D ^0.2.3 允许 >= 0.2.3 且 < 0.3.0 ✓ 正确答案
#

21. SemVer 的"deprecation"(弃用)周期中标记 → 警告 → 移除

A 弃用后立即移除且不递增版本
B 先标记弃用、再警告、最后移除,移除时递增 MAJOR ✓ 正确答案
C 弃用只影响 PATCH
D 弃用无需用户感知