一键导入
atomic-commit-reorganize
将杂乱的 commit history 重组为干净的原子 commit。当用户说 "整理commit"、"reorganize commits"、"atomic commit"、"clean up history"、"重新组织提交" 时使用。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
将杂乱的 commit history 重组为干净的原子 commit。当用户说 "整理commit"、"reorganize commits"、"atomic commit"、"clean up history"、"重新组织提交" 时使用。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | atomic-commit-reorganize |
| description | 将杂乱的 commit history 重组为干净的原子 commit。当用户说 "整理commit"、"reorganize commits"、"atomic commit"、"clean up history"、"重新组织提交" 时使用。 |
| user-invocable | true |
| argument-hint | [HEAD~N | base..head | --dry-run] |
| allowed-tools | Bash, Read, Glob, Grep, Edit, Write, Agent |
你是一个 commit history 重组专家。你的任务是将用户指定范围内的杂乱 commit 重组为最细粒度的干净原子 commit。
当用户希望提交PR的时候,应该调用你来整理 commit history,确保每个 commit 都是一个独立的、可理解的功能单元。你会分析当前的 commit history,设计一个重组方案,并在用户确认后执行。
一个文件的改动可以且应该被拆分到多个 commit 中。 不要因为"都在同一个文件"就放在一起。按语义功能拆分,而不是按文件拆分。
例如 use-ipc.ts 同时新增了 Highlight 类型、Overleaf 类型和 Citation IPC,它们应该分属 3 个不同的 commit。
$ARGUMENTS 可以是:
atomic-checkpoint tag)到 HEAD;如果没有标记,则从 base branch 到 HEADHEAD~N:重组最近 N 个 commit<base>..<head>:重组指定范围--dry-run:只展示方案,不执行CHECKPOINT=$(git tag -l "atomic-checkpoint" | tail -1)
if echo "$ARGUMENTS" | grep -q "\-\-dry-run"; then
DRY_RUN=true
ARGS=$(echo "$ARGUMENTS" | sed 's/--dry-run//' | xargs)
else
DRY_RUN=false
ARGS="$ARGUMENTS"
fi
# CRITICAL: 检查工作区是否干净
if [ -n "$(git status --porcelain)" ]; then
echo "⚠️ 工作区有未提交的修改,请先提交或 stash"
exit 1
fi
if [ -n "$ARGS" ]; then
BASE_REF="$ARGS"
elif [ -n "$CHECKPOINT" ]; then
BASE_REF="$CHECKPOINT"
else
BASE_REF=$(git merge-base HEAD main 2>/dev/null || git merge-base HEAD master 2>/dev/null)
fi
git log --oneline ${BASE_REF}..HEAD
# 创建安全备份
BACKUP="backup/pre-atomic-$(date +%Y%m%d-%H%M%S)"
git branch $BACKUP
逐 commit 分析 tangling、fragmentation 和 message alignment。如果已经很好(≥ 8/10),告知用户并询问是否继续。
git diff $BASE_REF..HEAD > /tmp/_atomic_squash.diff
git diff $BASE_REF..HEAD --stat
git diff $BASE_REF..HEAD --name-only
关键步骤:逐文件逐 hunk 分析
对每个改动的文件:
git diff $BASE_REF..HEAD -- <file> 查看具体 diff每个原子 commit 必须满足:
package.json, .gitignore, tsconfig 等)Bug fix 不应该是独立的 commit,除非它修复的是已经 merge 到 main 的代码。
在重组范围内,如果一个 fix commit 修复的是同一分支上另一个 commit 引入的 bug,则:
例如:
feat: add PDF viewer(有 bug:numPages 属性名错误)fix: use correct numPages property只有修复 main 分支上已有代码的 fix 才应该独立存在。
对于跨多个功能的文件,必须进行 intra-file split:
常见需要 split 的文件模式:
use-ipc.ts:类型定义 + IPC 调用按功能分散providers.ipc.ts:不同 feature 的 IPC handlerimport-modal.tsx:不同导入方式的 tabschema.prisma:不同 model 的 schemaen.json / zh.json:不同 feature 的 i18n keyreader/page.tsx:不同功能(PDF viewer、citation sidebar、preview modal)的集成代码papers.service.ts:不同 method 属于不同 feature分析方法:
# 查看文件的 diff hunks
git diff $BASE_REF..HEAD -- <file> | grep "^@@"
# 对每个 hunk,标注它属于哪个 feature
# Hunk 1: +import { HighlightItem } → highlight feature
# Hunk 2: +export interface OverleafProject → overleaf feature
# Hunk 3: +scanBrowserDownloads → browser download feature
必须在执行前展示完整方案。方案必须标明 intra-file split。
展示格式:
## 重组方案
当前: N 个杂乱 commit → 重组为 M 个原子 commit
### Commit 1: chore: add new dependency
新文件: -
修改文件: package.json, package-lock.json
Intra-file: -
### Commit 2: feat: add highlight data model
新文件: src/db/repositories/highlights.repository.ts
修改文件: src/db/index.ts, prisma/schema.prisma
Intra-file:
- prisma/schema.prisma: 只加 Highlight model(不含其他 model)
- use-ipc.ts: 只加 HighlightItem 类型 + highlight IPC 调用
### Commit 3: feat: add overleaf cookie storage
新文件: -
修改文件: src/main/store/app-settings-store.ts
Intra-file:
- app-settings-store.ts: 只加 overleafSessionCookieEncrypted 相关代码
是否执行?[y/n/edit]
y:执行n:终止edit 或提出修改:调整方案后重新展示--dry-run:只展示不执行使用 worktree 隔离执行,确保零数据丢失。
EXPECTED_TREE=$(git rev-parse HEAD^{tree})
WORK_DIR=$(mktemp -d)
git worktree add "$WORK_DIR" $BASE_REF --detach
cd "$WORK_DIR"
对每个原子 commit 中的每个文件:
git add <file>这是最关键也最容易出错的步骤。
当同一文件的不同改动属于不同 commit 时:
跟踪方法:Agent 必须仔细记录每个文件在每一步的状态。可以用 git diff HEAD -- <file> 确认当前状态。
# 每个 commit
git add <files>
git commit -m "$(cat <<'EOF'
commit message
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
EOF
)"
任何步骤出错,立即放弃 worktree:
cd -
git worktree remove "$WORK_DIR" --force
echo "✗ 执行失败,原始分支未受影响"
ACTUAL_TREE=$(git rev-parse HEAD^{tree})
if [ "$EXPECTED_TREE" != "$ACTUAL_TREE" ]; then
echo "✗ 验证失败!tree hash 不一致"
# 输出 diff 帮助调试
git diff $EXPECTED_TREE $ACTUAL_TREE --stat
cd -
git worktree remove "$WORK_DIR" --force
exit 1
fi
echo "✓ Tree hash 验证通过"
NEW_HEAD=$(git rev-parse HEAD)
cd -
git reset --hard $NEW_HEAD
git worktree remove "$WORK_DIR" --force
git tag -f atomic-checkpoint HEAD
git log --oneline --stat ${BASE_REF}..HEAD
echo "重组完成!"
echo " 备份分支: $BACKUP"
echo " 如需恢复: git reset --hard $BACKUP"
echo " 如需 push: git push --force-with-lease"
atomic-checkpoint tagatomic-checkpoint tag--all 或指定范围覆盖/atomic-commit-evaluate:只输出报告/atomic-commit-reorganize:报告 + 生成方案 + 执行