关于 resolve-git-conflicts
用于在命令行中解决 Git 冲突的技能,会比较 base、ours 和 theirs,并验证已暂存的更改。它会暂停合并、变基或 cherry-pick,交由人工审核,而不会自动继续。
主要功能
- 01检查冲突背景和相关提交
- 02比较 base、ours 和 theirs
- 03以最小改动解决冲突
- 04运行可用的构建和测试
- 05暂存更改并停止等待审核
适用场景
- 01解决合并过程中的冲突
- 02处理变基或 cherry-pick 冲突
- 03准备经过验证、待审核的冲突解决方案
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ tenfyzhong/ skills-hub --skill resolve-git-conflicts安装后在 Claude Code 中输入/resolve-git-conflicts确认已加载。
详细介绍
解决 Git 冲突
概述
在命令行中端到端解决 Git 冲突。分析 base/ours/theirs,决定保留或合并哪些更改,验证代码能否正常工作,然后在提交或继续操作前停下来等待人工审查。
快速开始
git status -sbgit diff --name-only --diff-filter=U- 对每个文件,检查 base/ours/theirs:
git show :1:PATH、git show :2:PATH、git show :3:PATH - 编辑文件,清除所有冲突标记,然后运行
git add PATH - 如果仓库提供构建/测试命令,请运行
- 停下来等待审查。不要运行
git commit、git merge --continue、git rebase --continue或git cherry-pick --continue
工作流
- 了解冲突发生的原因。
使用
git status -sb和git log --oneline --decorate -n 20确定当前操作和相互冲突的提交。 - 分析所有版本。
使用
git show :1:PATH(base)、:2:(ours)、:3:(theirs)。使用git diff --ours PATH和git diff --theirs PATH查看各自的意图。 - 明确选择,解决冲突。
移除冲突标记,根据决策框架选择
ours、theirs或合并结果。优先采用保留原意的最小改动。不要让用户编辑;直接应用更改,并在回复中说明理由。 - 验证代码能否正常工作。 如果项目定义了构建/测试/lint 命令,请运行。如果没有,请运行可用的最小冒烟测试。
- 移交审查。
更改暂存并通过验证后即停止。不要运行
git commit、git merge --continue、git rebase --continue或git cherry-pick --continue。提供简短的决策摘要和涉及文件清单,以便审查。
决策框架
不要默认选择 ours 或 theirs。根据证据逐个文件决定。
选择前请回答以下问题:
- 哪个版本与当前 API 和使用位置相符?
- 哪个版本符合最近一次重构或提交的意图?
- 哪个版本有测试覆盖,或能修复失败的测试?
- 哪个版本移除了已弃用的代码或引用?
- 合并两边是否会导致重复或行为不一致?
说明:
- 在 merge 中,
ours是当前分支,theirs是合并进来的分支。 - 在 rebase 或 cherry-pick 中,
ours是正在应用到的分支,theirs是正在应用的提交。 - 如果仍无法判断,请选择风险最低的更改,并说明所依据的假设。
命令
| 目标 | 命令 |
|---|---|
| 列出冲突文件 | git diff --name-only --diff-filter=U |
| 查找冲突标记 | `rg -n "<<<<<<< |
| 显示 base/ours/theirs | git show :1:PATH、git show :2:PATH、git show :3:PATH |
| 比较 ours 与文件 | git diff --ours PATH |
| 比较 theirs 与文件 | git diff --theirs PATH |
| 快速接受 ours/theirs | git checkout --ours PATH、git checkout --theirs PATH |
| 暂存解决结果 | git add PATH |
如果无法使用 rg,请使用 grep -n "<<<<<<<\\|======\\|>>>>>>>" PATH。
示例
冲突:
function formatUser(user) {
<<<<<<< HEAD
return `${user.name} <${user.email}>`;
=======
return `${user.displayName} <${user.email}>`;
>>>>>>> feature/use-display-name
}
解决结果(使用新字段,并保留回退逻辑):
function formatUser(user) {
const name = user.displayName ?? user.name;
return `${name} <${user.email}>`;
}
理由:功能分支引入了 displayName,但现有调用方可能仍会填入 name。
常见错误
- 在移交审查前继续 merge/rebase/cherry-pick。
- 在所有操作中都把
ours和theirs理解为固定代表“我的分支”和“对方的分支”。 - 在文件中留下冲突标记或未完全解决的代码块。
- 未检查 base 和使用上下文就自动接受一方的更改。
评论
支持 Markdown