mcpField
R
resolve-backport-conflicts

resolve-backport-conflicts

github.com/frappe开发159494 次安装2 天前更新
代码仓库

关于 resolve-backport-conflicts

用于处理仓库中 Mergify 回移拉取请求冲突的技能,指导检出请求、仅在目标分支应用原始改动、验证结果,并汇报已推送的解决方案。

主要功能

  1. 01检出拉取请求并查看来源
  2. 02检查冲突标记与暂存改动
  3. 03在目标分支应用预期改动
  4. 04验证差异与仓库状态
  5. 05提交、推送并清理标签

适用场景

  1. 01解决 Mergify 回移冲突
  2. 02避免将源分支无关改动带入回移
  3. 03检查冲突标记和最终差异
  4. 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. 解决每个冲突
  1. 阅读冲突周围的代码,直到了解它在此分支上的作用。
  2. 以目标分支一侧为起点。它展示了发布分支当前包含的内容。
  3. 在这一侧基础上应用原始拉取请求的更改。
  4. 删除原始拉取请求差异中不包含的所有行。
  5. 删除三行标记。

第 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. 总结

向用户报告以下内容:

  1. 回移植拉取请求和原始拉取请求。
  2. 每个发生冲突的文件,以及一行冲突解决方式说明。
  3. 每项作为无关内容而删除的更改,以及删除原因。
  4. 每项无法解决的冲突。
  5. 已推送提交的 sha。

陈述事实。如果某项解决方案带有主观判断,请明确说明。

评论

支持 Markdown