mcpField
I
inherit

inherit

github.com/camacho开发346 次安装
代码仓库

关于 inherit

inherit 是一项用于将父分支更新合并到当前分支的开发 Skill,也可按指定顺序同步依赖分支栈。它仅使用 Git,遇到冲突时停止并交由用户处理。

主要功能

  1. 01检测或指定父分支
  2. 02将父分支合并到当前分支
  3. 03按顺序级联更新依赖分支
  4. 04支持跳过推送
  5. 05冲突时停止并报告

适用场景

  1. 01将主分支更新合并到当前分支
  2. 02同步一组依赖分支
  3. 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

评论

支持 Markdown