关于 inherit
inherit 是一项用于将父分支更新合并到当前分支的开发 Skill,也可按指定顺序同步依赖分支栈。它仅使用 Git,遇到冲突时停止并交由用户处理。
主要功能
- 01检测或指定父分支
- 02将父分支合并到当前分支
- 03按顺序级联更新依赖分支
- 04支持跳过推送
- 05冲突时停止并报告
适用场景
- 01将主分支更新合并到当前分支
- 02同步一组依赖分支
- 03在暂不推送时本地合并更新
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ camacho/ ai-skills --skill inherit安装后在 Claude Code 中输入/inherit确认已加载。
详细介绍
inherit
思维模型:“我是子分支。我想要父分支已有的内容。”
将当前分支(以及可选的后代分支)更新到与其父分支一致。这是 /ship(向目标分支推送)和 /isolate(从父分支派生新子分支)的入站对应操作。
适用场景
- 当前分支相对于其基分支已过时。
- 一组相互依赖的分支需要将父分支的最新提交逐层传递下来。
- 在无法使用
wt、git-trim、gh的 Web 会话或精简环境中。
不要使用此操作向上游发送更改——那应使用 /ship。也不要用它创建新分支——那应使用 /isolate。
为什么使用 merge,而不是 rebase
自主模式的 git-rewrite-guard.sh 会阻止 git rebase、--amend、reset --hard 和 push --force*。从基分支同步时,merge 也是并行工作树社区的标准做法——不会破坏历史,能与分支栈配合使用,无需强制推送,并且在共享检出中安全。此技能中始终使用 git merge,绝不使用 git rebase。
约束
- 只使用纯 git。merge 步骤中不要使用
wt、git-trim或gh。可在 Web 沙盒中运行。 - 对会修改状态的操作,始终使用
git -C <abs-path>。cd不会在不同的 Claude Code Bash 调用之间保留;在会话当前工作目录中直接运行git会操作主工作树。 - 绝不自动解决冲突。由用户负责解决冲突。
输入
| 标志 | 用途 |
|---|---|
--stack | 沿依赖分支栈自下而上逐层执行 merge |
--parent <name> | 覆盖自动检测到的父分支 |
--no-push | 跳过 push 步骤(提交保留在本地) |
CI 宕机信号:与 /ship 使用相同约定——如果用户表示 CI 已宕机,则将每个 git push 替换为 /local-merge。
流程
1. 确定当前分支和仓库根目录
REPO="$(git rev-parse --show-toplevel)"
CURRENT="$(git -C "$REPO" rev-parse --abbrev-ref HEAD)"
预检中止条件:
CURRENT为HEAD(分离状态)→ “没有当前分支——请先检出一个分支。”- 工作树有未提交更改(
git -C "$REPO" status --porcelain非空)→ “继承前请先提交或暂存本地更改。”
2. 检测父分支(除非已传入 --parent)
PARENT=$(git -C "$REPO" reflog show HEAD --pretty=format:'%gs' \
| grep -m1 '^branch: Created from ' \
| sed -E 's/^branch: Created from //; s|^origin/||')
PARENT="${PARENT:-main}"
grep -m1会选取最新的 “Created from” 记录——这就是实际的派生点。- 去掉前导的
origin/,以便使用分支名称。 - 如果 reflog 为空(Web 会话、新克隆、通过 fetch 创建的分支),则回退到
main。告知用户这是回退值,以便他们通过--parent修正。 - 解析后若
PARENT == CURRENT→ “当前已在父分支上;无需继承任何内容。”
修改前输出:Detected parent: <PARENT> (current: <CURRENT>). Inheriting from origin/<PARENT>.
3. 获取父分支
git -C "$REPO" fetch origin "$PARENT"
如果 fetch 失败(离线、引用缺失、父分支已在 origin 上删除):原样显示错误。不要静默改用其他分支。
4. 将父分支合并到当前分支
git -C "$REPO" merge --no-edit "origin/$PARENT"
结果:
- 无冲突(实际合并或快进) → 继续。
- 无操作(已是最新状态) → 明确说明,并跳过 push。
- 存在冲突 → 停止,显示
git status,列出冲突路径,并将控制权交还给用户。不要尝试自动解决。
5. 沿分支栈逐层处理(仅当使用 --stack 时)
“依赖分支”是指以 CURRENT 为祖先的本地分支。用户会在使用 --stack 后提供候选分支集合(或在命令中直接列出名称);不要默默猜测——如果用户没有列出分支,只询问一次。
顺序:自下而上,先父后子。 使用成对的 git merge-base --is-ancestor 确定拓扑顺序——每一步从剩余集合中选择一个不是任何其他剩余分支祖先的分支。该分支就是下一个要处理的分支:
# B is downstream of A iff A is an ancestor of B
git -C "$REPO" merge-base --is-ancestor "$A" "$B" # exit 0 = yes
按此顺序处理每个分支时,合并其链上的直接父分支(前一个已处理的分支),而不是再次合并 origin/main。逐层传递的目的就在于父分支已吸收 main 的更改,现在由子分支吸收更新后的父分支:
PREV="$CURRENT"
for child in "${ordered[@]}"; do
git -C "$REPO" checkout "$child"
git -C "$REPO" merge --no-edit "$PREV" # stop on conflict
PREV="$child"
done
git -C "$REPO" checkout "$CURRENT"
发生冲突时:停止逐层处理。报告发生阻塞的分支和冲突路径。不要跳过该分支继续处理。
6. 推送(如果 CI 不可用,则执行 /local-merge)
对于每个收到提交的分支(CURRENT 以及所有级联子分支):
git -C "$REPO" push origin "$BRANCH"
如果用户已表示 CI 不可用:对每个分支调用 /local-merge。
如果传入了 --no-push:完全跳过;告知用户这些分支有尚待发布的本地合并提交。
如果推送被拒绝(远程已更新):不要强制推送。报告拒绝情况;由用户决定是否重新运行 /inherit。
7. 报告
简明总结,不要写成段落:
Inherited from <PARENT> into:
- <CURRENT> (merge <sha>, pushed)
- <child-1> (merge <sha>, pushed)
发生冲突时:
Inherit halted on <branch>: conflicts in <files>. Resolve, commit, then re-run /inherit.
快速参考
| 步骤 | 命令 |
|---|---|
| 检测父分支 | git reflog show HEAD --pretty=format:'%gs' | grep -m1 '^branch: Created from' |
| 获取 | git -C "$REPO" fetch origin "$PARENT" |
| 合并进来 | git -C "$REPO" merge --no-edit "origin/$PARENT" |
| 分支栈顺序 | 使用 git merge-base --is-ancestor <a> <b> 两两检查,从根分支开始 |
| 推送 | git -C "$REPO" push origin <branch> |
| CI 不可用 | 对每个分支执行 /local-merge |
失败模式——明确应对
| 合理化说辞 | 应对 |
|---|---|
| “变基更干净——我就直接变基到 main 上” | 禁止。 在自主模式下,改写保护会阻止此操作。请使用合并。 |
| “reflog 是空的,我来根据分支名称模式猜测” | 回退到 main。告知用户。不要根据命名推断。 |
| “整理好变基后,我就强制推送” | 禁止。 此技能中不得使用 --force、--force-with-lease 或 --amend。 |
“我会用 git pull --rebase” | 与 git rebase 一样禁止。请使用普通的 git merge。 |
“我会用 wt sync / git-trim” | 仅使用纯 Git——这些二进制文件在 Web 会话中不可用。 |
| “分支栈顺序无关紧要,我可以按任意顺序合并” | 从下往上合并(先合并靠近根分支的分支),这样每个子分支都能看到更新后的父分支。 |
| “我会跳过推送” | 除非 CI 不可用或适用 --no-push,否则推送每个已更新的分支。 |
“冲突?我用 -X theirs 自动解决” | 绝不允许。 冲突应由用户解决。停止并报告。 |
危险信号——停止
- 即将输入
git rebase、--amend、reset --hard或--force→ 用错技能了。 - 父分支检测悄然返回空结果,且未回退到
main。 - 沿分支栈自顶向下合并(最后合并最靠近父分支的分支)→ 调整顺序。
- 在非主工作树中,从会话当前工作目录运行不带
-C的git。 - 修改 Git 操作以外的文件——此技能仅执行纯 Git 操作。
配套技能
/isolate— 从父分支分叉出一个新的子分支。/inherit(此技能)— 将父分支拉取到子分支。向内同步。/ship— 将子分支推送到目标分支。向外推送。
分支移动的三个方向:分叉、向下同步、向上推送。
调用示例
- “把 main 拉进当前分支” →
/inherit - “从 main 更新我的分支栈” →
/inherit --stack - “从基分支同步,但先别推送” →
/inherit --no-push - “从 develop 而非 main 同步” →
/inherit --parent develop