关于 resolve-backport-conflicts
用于处理仓库中 Mergify 回移拉取请求冲突的技能,指导检出请求、仅在目标分支应用原始改动、验证结果,并汇报已推送的解决方案。
主要功能
- 01检出拉取请求并查看来源
- 02检查冲突标记与暂存改动
- 03在目标分支应用预期改动
- 04验证差异与仓库状态
- 05提交、推送并清理标签
适用场景
- 01解决 Mergify 回移冲突
- 02避免将源分支无关改动带入回移
- 03检查冲突标记和最终差异
- 04汇报未解决冲突及推送提交
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ frappe/ skills --skill resolve-backport-conflicts安装后在 Claude Code 中输入/resolve-backport-conflicts确认已加载。
详细介绍
Mergify 如何留下分支
Mergify 使用 cherry-pick 回移植拉取请求。发生 cherry-pick 冲突时,Mergify 会对冲突文件运行 git add,并在未解决冲突的情况下提交。此时分支中会保留原始冲突标记:
<<<<<<< HEAD
content of the target branch, such as version-16-hotfix
=======
content of the commit under backport
>>>>>>> <sha> (commit subject)
HEAD 一侧是目标分支。>>>>>>> 一侧是正在回移植的拉取请求。默认情况下,任何一侧都不会优先胜出。
步骤
1. 检出拉取请求
在拥有该拉取请求的仓库中操作。如果当前目录属于其他仓库,请将正确的仓库克隆到临时目录。
gh pr view <pr-url> --json number,title,body,baseRefName,headRefName,headRepositoryOwner,url
gh pr checkout <pr-url> --force
--force 标志会将过时的本地分支重置为拉取请求的头提交。如果工作树有未提交的更改,请停止并告知用户。不要丢弃用户的工作。
2. 阅读原始拉取请求
Mergify 描述中包含这一行:This is an automatic backport of pull request #<N>。从该行读取编号。如果没有这一行,则从分支名 mergify/bp/<branch>/pr-<N> 中读取编号。
gh pr view <N> --json title,body,url
gh pr diff <N>
此差异说明了回移植的意图。修改任何文件前,请先完整阅读。
3. 查找所有标记
git grep -nE '^(<{7}|={7}|>{7})' -- . || echo "no markers"
git diff HEAD~1 --stat
git log -1 --format=%s
最后一条命令用于确认 HEAD 是 Mergify 的冲突提交。还要查找遗留的 .rej 和 .orig 文件。
4. 解决每个冲突
- 阅读冲突周围的代码,直到了解它在此分支上的作用。
- 以目标分支一侧为起点。它展示了发布分支当前包含的内容。
- 在这一侧基础上应用原始拉取请求的更改。
- 删除原始拉取请求差异中不包含的所有行。
- 删除三行标记。
第 4 步最重要。冲突块会带入源分支后续提交中的无关更改。重命名的辅助函数、新 API 和无关重构都会以这种方式出现。它们都不属于发布分支。
如果回移植需要目标分支中不存在的函数或模块,不要编写替代实现。报告这一缺口,并询问用户如何继续。
Mergify 也会暂存属于其他提交的无冲突代码块。要发现这些内容,请将整个冲突提交与原始拉取请求的差异进行比较。还原不匹配的代码块。
5. 验证
git grep -nE '^(<{7}|={7}|>{7})' -- .
git diff HEAD
第一条命令必须不输出任何内容。阅读第二条命令输出的每一行。比较 git diff HEAD~1 和 gh pr diff <N>。除分支差异外,两份差异必须一致。
如果仓库有代码检查工具或格式化工具,请对已修改的文件运行它。
6. 提交并推送
git add <modified files>
git commit -m "chore: resolve conflict"
git push <remote> HEAD:<headRefName>
选择远程仓库时,将第 1 步中的 headRepositoryOwner 与 git remote -v 的输出进行匹配。Mergify 分支位于上游仓库,而不是复刻仓库。切勿强制推送。
7. 移除 conflicts 标签
cherry-pick 失败时,Mergify 会添加 conflicts 标签。该标签会一直保留,直到有人将其移除。推送成功后,且仅在没有残留标记时,移除该标签:
gh pr edit <pr-url> --remove-label conflicts
如果拉取请求没有该标签,命令会失败。这种失败无妨。如果仍有冲突未解决,请保留该标签。
8. 总结
向用户报告以下内容:
- 回移植拉取请求和原始拉取请求。
- 每个发生冲突的文件,以及一行冲突解决方式说明。
- 每项作为无关内容而删除的更改,以及删除原因。
- 每项无法解决的冲突。
- 已推送提交的 sha。
陈述事实。如果某项解决方案带有主观判断,请明确说明。