Auto Merge and Cleanup Skill
概述
auto-merge-and-cleanup 是 WeReply 项目 14 步开发流程的最后一步(步骤 14),在 finishing-a-development-branch 完成后强制自动执行。
核心功能
本 skill 自动执行以下 6 个关键操作:
- •检查并提交未提交的更改 - 确保所有本地修改已提交
- •合并分支到 main - 将当前 feature 分支合并到 main 分支
- •推送到远程仓库 - 同步本地 main 分支到远程
- •删除远程分支 - 删除远程的 feature 分支
- •删除本地 worktree - 清理本地 worktree 目录
- •清理临时文件 - 删除任务跟踪文件和临时文件
设计原则
- •自动化优先 - 无需用户手动操作,减少人为错误
- •安全第一 - 合并前检查冲突,失败时保留现场
- •精确清理 - 只删除当前任务创建的分支,不影响其他并行任务
- •完整闭环 - 从开发到合并到清理,形成完整的开发闭环
执行流程
步骤 1:检查未提交的更改
# 检查是否有未提交的更改 git status --porcelain # 如果有未提交的更改,自动提交 if [ -n "$(git status --porcelain)" ]; then git add . git commit -m "chore: auto-commit before merge Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>" fi
目的:确保所有工作都已保存,避免合并时丢失修改。
错误处理:
- •如果提交失败(如 pre-commit hook 失败),停止执行并报告错误
- •用户需要手动修复问题后重新执行
步骤 2:读取当前分支名称
# 从临时文件读取分支名称 BRANCH_NAME=$(cat .claude/temp/current-branch.txt) # 验证分支名称 if [ -z "$BRANCH_NAME" ]; then echo "错误:未找到分支跟踪文件" exit 1 fi
目的:获取当前任务创建的分支名称,确保只删除正确的分支。
安全机制:
- •使用临时文件跟踪分支,避免误删其他任务的分支
- •验证分支名称非空
步骤 3:合并到 main 分支
# 切换到 main 分支 git checkout main # 拉取最新的 main 分支 git pull origin main --rebase # 合并 feature 分支 git merge $BRANCH_NAME --no-ff -m "Merge branch '$BRANCH_NAME' Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>"
目的:将 feature 分支的修改合并到 main 分支。
参数说明:
- •
--no-ff:强制创建合并提交,保留分支历史 - •
--rebase:使用 rebase 模式拉取,保持提交历史整洁
错误处理:
- •如果合并冲突,停止执行并报告冲突文件
- •用户需要手动解决冲突后重新执行
步骤 4:推送到远程仓库
# 推送 main 分支到远程 git push origin main
目的:同步本地 main 分支到远程仓库。
错误处理:
- •如果推送失败(如网络问题、权限问题),停止执行并报告错误
- •用户需要手动推送或修复问题后重新执行
步骤 5:删除远程分支
# 删除远程 feature 分支 git push origin --delete $BRANCH_NAME
目的:清理远程仓库中的 feature 分支。
错误处理:
- •如果远程分支不存在,忽略错误(可能已被删除)
- •如果删除失败(如权限问题),记录警告但继续执行
步骤 6:删除本地 worktree
# 检测 worktree 路径 if [ -d ".worktrees/$BRANCH_NAME" ]; then WORKTREE_PATH=".worktrees/$BRANCH_NAME" elif [ -d "worktrees/$BRANCH_NAME" ]; then WORKTREE_PATH="worktrees/$BRANCH_NAME" else echo "警告:未找到 worktree 目录,跳过删除" WORKTREE_PATH="" fi # 删除 worktree if [ -n "$WORKTREE_PATH" ]; then git worktree remove $WORKTREE_PATH --force fi # 删除本地分支 git branch -D $BRANCH_NAME
目的:清理本地 worktree 目录和分支。
参数说明:
- •
--force:强制删除 worktree,即使有未提交的修改(因为已在步骤 1 提交) - •
-D:强制删除本地分支
错误处理:
- •如果 worktree 不存在,记录警告但继续执行
- •如果删除失败,记录错误但继续执行清理
步骤 7:清理临时文件
# 删除分支跟踪文件 rm -f .claude/temp/current-branch.txt # 删除任务文件(如果存在) rm -f .claude/temp/tasks.json # 删除其他临时文件 rm -f .claude/temp/*.tmp
目的:清理所有任务相关的临时文件。
安全机制:
- •使用
-f参数,即使文件不存在也不报错 - •只删除
.claude/temp/目录下的文件,不影响其他目录
错误处理
合并冲突
场景:main 分支和 feature 分支有冲突的修改。
处理流程:
- •停止自动执行
- •报告冲突文件列表
- •提示用户手动解决冲突:
bash
# 查看冲突文件 git status # 手动编辑冲突文件 # 解决冲突后: git add <冲突文件> git commit -m "Merge branch 'feature/xxx'" # 重新执行 auto-merge-and-cleanup
推送失败
场景:网络问题、权限问题、远程分支被保护等。
处理流程:
- •停止自动执行
- •报告推送失败原因
- •提示用户手动推送:
bash
# 检查网络连接 git remote -v # 手动推送 git push origin main # 重新执行 auto-merge-and-cleanup
分支删除失败
场景:远程分支不存在、权限不足等。
处理流程:
- •记录警告信息
- •继续执行后续步骤(不阻塞流程)
- •提示用户手动删除(如需要):
bash
# 手动删除远程分支 git push origin --delete feature/xxx # 手动删除本地分支 git branch -D feature/xxx
使用示例
正常流程
## 用户完成开发任务 步骤 1-13:正常开发流程 - 创建 worktree - 需求分析 - 编写计划 - TDD 开发 - 测试 - 代码审查 - 生成 changelog - 提交代码 - finishing-a-development-branch ## 步骤 14:自动执行(无需用户操作) AI 自动调用 auto-merge-and-cleanup: 1. ✅ 检查未提交的更改 - 无未提交修改 2. ✅ 读取分支名称 - feature/add-deepseek-api 3. ✅ 合并到 main - 合并成功 4. ✅ 推送到远程 - 推送成功 5. ✅ 删除远程分支 - 删除成功 6. ✅ 删除本地 worktree - 删除成功 7. ✅ 清理临时文件 - 清理成功 ## 结果 - main 分支已更新 - 远程仓库已同步 - feature 分支已删除(远程 + 本地) - worktree 已清理 - 临时文件已删除 用户可以开始下一个任务。
有未提交修改的流程
## 步骤 14:自动执行 AI 自动调用 auto-merge-and-cleanup: 1. ⚠️ 检查未提交的更改 - 发现 3 个文件未提交 - 自动提交:chore: auto-commit before merge 2. ✅ 读取分支名称 - feature/fix-bug-123 3. ✅ 合并到 main - 合并成功 4. ✅ 推送到远程 - 推送成功 5. ✅ 删除远程分支 - 删除成功 6. ✅ 删除本地 worktree - 删除成功 7. ✅ 清理临时文件 - 清理成功 ## 结果 - 未提交的修改已自动提交 - main 分支已更新 - 所有清理工作已完成
合并冲突的流程
## 步骤 14:自动执行 AI 自动调用 auto-merge-and-cleanup: 1. ✅ 检查未提交的更改 - 无未提交修改 2. ✅ 读取分支名称 - feature/refactor-service 3. ❌ 合并到 main - 合并冲突 ## 冲突文件 - src/services/deepseek_service.rs - frontend/src/components/AssistantPanel.tsx ## 用户手动解决冲突 ```bash # 查看冲突 git status # 编辑冲突文件 # 解决冲突后: git add src/services/deepseek_service.rs git add frontend/src/components/AssistantPanel.tsx git commit -m "Merge branch 'feature/refactor-service'" # 重新执行 auto-merge-and-cleanup
重新执行
AI 再次调用 auto-merge-and-cleanup:
- •✅ 检查未提交的更改 - 无未提交修改
- •✅ 读取分支名称 - feature/refactor-service
- •✅ 合并到 main - 已合并(跳过)
- •✅ 推送到远程 - 推送成功
- •✅ 删除远程分支 - 删除成功
- •✅ 删除本地 worktree - 删除成功
- •✅ 清理临时文件 - 清理成功
--- ## 安全机制 ### 1. 分支跟踪 使用 `.claude/temp/current-branch.txt` 文件跟踪当前任务创建的分支: ```bash # 在 using-git-worktrees 中创建 echo "feature/add-new-feature" > .claude/temp/current-branch.txt # 在 auto-merge-and-cleanup 中读取 BRANCH_NAME=$(cat .claude/temp/current-branch.txt) # 清理后删除 rm -f .claude/temp/current-branch.txt
优势:
- •精确跟踪当前任务的分支
- •避免误删其他并行任务的分支
- •支持多任务并行开发
2. 合并前检查
在合并前执行多项检查:
# 检查分支是否存在 git rev-parse --verify $BRANCH_NAME # 检查 main 分支是否是最新的 git fetch origin main git diff main origin/main # 检查是否有未提交的修改 git status --porcelain
3. 失败回滚
如果合并失败,保留现场供用户手动处理:
# 合并失败时不自动回滚 # 保留冲突状态,让用户解决 # 用户可以选择: # 1. 解决冲突后继续 # 2. 放弃合并:git merge --abort
4. 强制执行
本 skill 是 14 步流程的强制步骤,不可跳过:
- •
executionOrder: "mandatory-after-step-13" - •
autoLoad: true - •
priority: "critical"
原因:
- •确保分支及时合并,避免长期分支
- •自动清理临时文件,保持项目整洁
- •形成完整的开发闭环
与其他 Skills 的集成
前置 Skill
- •
using-git-worktrees (步骤 1)
- •创建 worktree 和 feature 分支
- •写入分支跟踪文件:
.claude/temp/current-branch.txt
- •
finishing-a-development-branch (步骤 13)
- •完成开发工作
- •提供 PR/合并/继续开发选项
- •如果用户选择"合并",触发 auto-merge-and-cleanup
后续 Skill
无(本 skill 是最后一步)
相关 Skill
- •
changelog-generator (步骤 11)
- •生成 CHANGELOG.md
- •本 skill 会将 changelog 一起合并到 main
- •
commit (步骤 12)
- •提交代码到 feature 分支
- •本 skill 会将所有提交合并到 main
配置选项
合并策略
默认使用 --no-ff 合并策略,可在 .claude/config.json 中配置:
{
"autoMergeCleanup": {
"mergeStrategy": "no-ff", // "no-ff" | "ff-only" | "squash"
"deleteBranch": true, // 是否删除分支
"deleteWorktree": true, // 是否删除 worktree
"cleanupTempFiles": true // 是否清理临时文件
}
}
推送选项
默认推送到 origin main,可配置:
{
"autoMergeCleanup": {
"remote": "origin", // 远程仓库名称
"mainBranch": "main" // 主分支名称
}
}
常见问题
Q1: 如果我不想自动合并怎么办?
A: 本 skill 是强制执行的,不可跳过。如果你想手动控制合并时机,可以:
- •在步骤 13 (finishing-a-development-branch) 选择"继续开发"
- •完成所有工作后,手动执行合并
- •然后手动调用 auto-merge-and-cleanup 清理
Q2: 如果合并冲突怎么办?
A:
- •本 skill 会停止执行并报告冲突文件
- •你需要手动解决冲突
- •解决后重新执行 auto-merge-and-cleanup
Q3: 如果我有多个并行任务怎么办?
A:
- •本 skill 使用
.claude/temp/current-branch.txt跟踪当前任务的分支 - •只会删除当前任务创建的分支
- •不会影响其他并行任务的分支
Q4: 如果推送失败怎么办?
A:
- •检查网络连接
- •检查远程仓库权限
- •手动推送:
git push origin main - •重新执行 auto-merge-and-cleanup
Q5: 如果我想保留 feature 分支怎么办?
A:
- •本 skill 会自动删除 feature 分支
- •如果你想保留,可以在执行前手动备份:
bash
git branch feature/xxx-backup feature/xxx
测试
使用 test-workflow.sh 脚本测试完整流程:
# 运行测试 bash .claude/skills/auto-merge-and-cleanup/test-workflow.sh # 测试内容: # 1. 创建测试分支 # 2. 模拟开发工作 # 3. 执行 auto-merge-and-cleanup # 4. 验证合并结果 # 5. 验证分支删除 # 6. 验证临时文件清理
总结
auto-merge-and-cleanup 是 WeReply 项目 14 步开发流程的最后一步,负责:
✅ 自动合并 feature 分支到 main ✅ 同步远程仓库 ✅ 删除远程和本地分支 ✅ 清理 worktree 目录 ✅ 清理临时文件 ✅ 形成完整的开发闭环
核心优势:
- •自动化:无需手动操作
- •安全:合并前检查,失败时保留现场
- •精确:只删除当前任务的分支
- •完整:从开发到合并到清理,一气呵成
强制执行:
- •不可跳过
- •自动触发
- •确保项目整洁