context-infra 检查与复盘infra.guiming.net · 全内容自包含呈现 · 生成于 2026-07-21 16:28 UTC

Per-TODO Squash(单 TODO 独立 revert)

Z3 全文↑ Z2 条目

术-操作 · 术层 skill 全文

← 返回术层 skill 索引 · 返回方法论区

本页是 <code>rules/skills/bestpractice_per_todo_squash.md</code> 的逐字投影(仅隐私清洗,零改写)。

时点提示:本页是仓内文件 rules/skills/bestpractice_per_todo_squash.md 的逐字投影(仅做隐私清洗:仓库根绝对路径→相对路径、家目录→~/;除此零改写)。若源文件后续有修订,以仓内真源为准。

Skill: Per-TODO Squash(单 TODO 独立 revert)

When to Use

需要把一个 feature/task 分支的变更「按 TODO 粒度」落到 main,使每个 TODO 对应一个独立 squash commit。典型触发:

不需要时(默认行为):feature 分支所有 commit 合成一个 squash,不区分 TODO。继续用不带 flag 的 snapshot_merge.sh <task> <branch>

Prerequisites

调用

tools/git/snapshot_merge.sh --per-todo <task-name> <branch>

不加 --per-todo 时行为完全不变(单一大 squash)。

行为

  1. 读取 main..<branch> 的 commit 列表
  2. 按 commit 消息里的 TODO-ID: trailer 分组;相同 TODO-ID 的 commit 聚到同一组;无 trailer 的 commit 聚到 TODO-ID: none
  3. 分组顺序 = 第一次遇到该 TODO-ID 的 commit 所在位置
  4. 对每组依次在 main 上做一次 git cherry-pick --no-commit + 单次 commit_wrapper.sh 产生一个 squash commit
  5. 每个 squash commit 带 TODO-ID: <id> trailer(或 TODO-ID: none),commit subject 形如 snapshot: <task> todo=T001 (+<n> commits)
  6. feature 分支 + worktree 不删除,继续存活

失败模式

验证

成功后手测:

git log --oneline main..HEAD                # 看到 N 个新 squash
git log -1 --format=%B <squash-sha> | grep 'TODO-ID: T001'
git revert --no-edit <T001-squash>          # 回滚仅 T001

自动化测试:tests/e2e/per_todo_squash_smoke.sh(mktemp 隔离,验证分组 + 独立 revert)

已知局限

相关


← 返回术层 skill 索引 · 返回方法论区