7.6 KiB
7.6 KiB
split-commit
将当前未提交改动拆分为多个原子提交。不调用脚本,严格按本文件执行,并与 COMMIT_CONVENTION.md 一致。
0. 前置检查
0.1 清理临时文件
若存在上次残留的 msg.txt,先删除:
rm -f msg.txt
0.2 读取规范(硬门槛)
执行前先读取并遵守 COMMIT_CONVENTION.md。若下列任一条件不满足,不得提交:
- 提交头必须是
<type>(<scope>): <subject>或<type>: <subject> type必须在允许集合:feat|fix|art|audio|scene|yarn|perf|refactor|style|docs|build|chore|testscope仅在单一模块改动时填写;多模块/全局改动可省略subject必须中文、动词开头、不超过 50 字、不加句号- 一次提交只做一件事(One commit, one purpose)
1. 保护分支检查
检测当前是否在保护分支。保护分支列表按以下优先级获取:
- 检查
AGENTS.md、.cursor/rules/中是否有「保护分支」规则 - 检查
.git/config中branch.protected配置 - 默认保护分支:
master,main,develop
- 若当前不在保护分支:直接进入第 2 节
- 若在保护分支,给出选项:
- [A] 创建 feature 分支后继续拆分(推荐)
- [B] 转移到新分支后压成单提交,不拆分
- [C] 取消
执行细则:
- A:
git stash push --include-untracked->git checkout -b <branch>->git stash pop - B:同上切新分支后,仅一次
git add -A+ 一次提交(使用msg.txt) - C:停止,恢复原始状态
2. 盘点变更
在仓库根执行:
git status- 确认整体状态git diff --stat- 查看改动文件统计git diff- 查看详细改动内容git diff --cached- 查看已暂存的改动
目的:确认全部改动、识别 staged/unstaged、识别同文件多逻辑。
3. 规则化分组(先分组,后提交)
按"意图一致"分组,不按文件数量分组。
3.1 必须拆分触发条件
满足任一即必须拆:
- 同一组改动可归属多个
type - 同一文件中包含多个独立目的(例如功能 + 重构)
- 涉及多个核心 scope 且可独立提交
- 资源替换与代码逻辑混在同一组
3.2 分组优先级
- 先按变更目的区分:功能/修复/重构/测试/文档/资源
- 再按模块 scope 细分:
blockpuzzle、dialog、scene-mgmt等 - 同文件多逻辑必须标注
git add -p
3.3 最小拆分原则
避免过度拆分导致提交历史碎片化。以下情况可以合并:
- 同一功能的多文件改动(如新增脚本 + 对应 Prefab)
- 同一模块的多个 Bug 修复(如修复同一脚本的 3 个边界问题)
4. type/scope 决策规则
4.1 type 选择顺序
- 修复已有缺陷 ->
fix - 新增或增强行为 ->
feat - 纯美术资源替换 ->
art - 纯音频资源替换 ->
audio - 纯场景/Prefab 布局与参数调整 ->
scene - 纯 Yarn 文本/分支脚本 ->
yarn - 其余按规范:
perf|refactor|style|docs|build|chore|test
4.2 scope 规则
- 单模块改动:使用对应 scope(如
blockpuzzle、fix-system、timeline-kit) - 跨模块或全局改动:省略 scope(如
chore: ...)
5. Unity 常见改动速查(type/scope 建议)
| 改动类型 | 推荐 type | scope 选择 |
|---|---|---|
Assets/Scripts/MiniGame/BlockPuzzle/ 逻辑修复 |
fix |
blockpuzzle |
Assets/Scripts/MiniGame/BlockPuzzle/ 新交互/新规则 |
feat |
blockpuzzle |
| 动画、贴图、模型、Spine 资源替换 | art |
对应系统 scope 或省略 |
| 音效、BGM、FMOD 资源调整 | audio |
audio-kit 或省略 |
.unity 灯光/后处理/镜头参数调整 |
scene |
对应玩法 scope 或省略 |
| Yarn 文本与分支改动 | yarn |
dialog |
| 仅测试代码改动 | test |
对应模块 scope |
6. 生成拆分方案并展示(必须含依据)
先产出表格,再等待用户确认。每一行必须包含:
- 顺序
- 文件集合
- 变更目的
type/scope/subject- 选择依据(为什么是这个 type/scope)
- 暂存方式(
git add或git add -p)
示例:
| 顺序 | 文件 | 变更目的 | 提交头 | 依据 | 方式 |
|---|---|---|---|---|---|
| 1 | Assets/Scripts/MiniGame/BlockPuzzle/Class/ShapeDragger.cs |
修复拖拽边界判定 | fix(blockpuzzle): 修复方块拖拽越界判定错误 |
已有行为修复,单模块 | git add -p |
| 2 | Assets/Prefabs/BlockPuzzle/*.prefab |
调整拼图视觉资源 | art(blockpuzzle): 更新方块拼图组件预制体表现 |
纯资源替换 | git add |
7. 提交消息校验(执行前最后守卫)
每组提交前逐条校验:
- 格式:
<type>(<scope>): <subject>或<type>: <subject> type在允许集合scope合法或省略合理subject中文、动词开头、<=50 字、无句号- body/footer 仅在需要时添加:
- 需要解释原因/影响时加 body
- 关联 issue 或破坏性变更时加 footer
任一不通过:先改消息,不执行 commit。
8. 用户确认后执行
先询问:是否按该拆分执行?[Y 执行 / n 取消 / 提出调整]
用户确认后逐组执行:
- 按方案
git add或git add -p - 复查本组暂存:
git diff --cached --stat+git diff --cached - 使用
msg.txt提交(见第 10 节) - 提交后检查工作区状态:
git status
失败处理机制
- 若
git add -p中用户跳过关键 hunk:暂停执行,提示剩余改动如何处理 - 若提交失败(如 pre-commit hook 拒绝):
- 显示失败原因
- 询问:[R] 重试 / [S] 跳过本组 / [A] 中止全部
- 若选择中止,确保工作区恢复到执行前状态
9. 全部完成后的结果校验与回放
全部提交结束后必须输出:
git log --oneline -<N>(N=本次新增提交数)- 回放清单(每条提交是否符合规范):
- type 是否合法
- scope 是否合理
- subject 是否满足中文动词开头规则
- 若发现不合规,明确说明并询问是否修正(
git commit --amend或git rebase -i)
10. 中文提交消息写入方式(固定)
PowerShell 5.1 下 git commit -m "中文" 可能乱码。统一使用:
# 1. 在仓库根写 UTF-8 编码 msg.txt
echo "feat(blockpuzzle): 添加方块旋转功能" > msg.txt
# 2. 使用文件提交
git commit -F msg.txt
# 3. 删除临时文件
rm -f msg.txt
11. 关于 Pre-commit Hooks
若项目配置了 pre-commit hook(如 husky、lint-staged):
- 每次提交都会触发 hook 检查
- 若 hook 执行较慢(如运行全量测试),拆分提交会变慢
- 如需跳过 hook(不推荐,仅在紧急修复时):
git commit -F msg.txt --no-verify - 警告:跳过 hook 可能引入未检查的问题,后续 CI 可能失败
12. 工作目录
所有命令必须在仓库根执行。
13. 快速参考:常见场景处理
场景 A:同文件包含功能和重构
# 先提交功能改动
git add -p <file> # 只选择功能相关的 hunk
git commit -F msg.txt # feat: ...
# 再提交重构
git add -p <file> # 选择重构相关的 hunk
git commit -F msg.txt # refactor: ...
场景 B:误操作后的恢复
# 若某次提交后发现错误,撤销最后一次提交但保留改动
git reset --soft HEAD~1
# 然后重新分组提交
# 若需要完全放弃本次拆分的所有提交(谨慎使用)
git reset --hard ORIG_HEAD
场景 C:中途取消
# 若在第 8 步中途需要取消
git reset HEAD # 取消暂存
git checkout -- . # 恢复工作区(会丢失未提交改动,谨慎)
rm -f msg.txt # 清理临时文件