ByteNoteByteNote
级联 PR 拆到三棵树,凭什么 rebase 不互抢
字

字节笔记本

2026年10月9日 · 约 6 分钟读完

级联 PR 拆到三棵树,凭什么 rebase 不互抢

API中转
¥120

级联 PR 拆到三个工作树以后,rebase 先改哪一棵,目录就会先乱。GitHub 官方扩展 github/gh-stack 本轮 API 核到 1642 星、80 个 fork,许可证 MIT,创建 2026-02-06,最近推送 2026-10-09。语言 Go。安装是 gh extension install github/gh-stack,要 GitHub CLI v2.0 以上、Git 2.36 以上。升级走 gh extension upgrade stack。可选再装 gh skill install github/gh-stack。站内旧稿写过栈式提交主路径,这篇只补工作树目录怎么和栈共享,不重写 init 到 submit。

目录写在 Git 公共目录里,通常是 .git/gh-stack 的 JSON,不进提交。所有链接工作树共用这份目录,包括成员、顺序和 PR 元数据。恢复日志也在公共目录。rebase 和 sync 只更新被碰到、并且干净的那棵树的所有者。脏、忙、缺失、或中途换了主人,整次运行停掉,其它树不动。主干不能安全快进时,才可能退到已抓到的远端。这些是 README,不是本轮复现。

共享目录和两棵树

为什么拆树还不互抢

变更会对整个克隆串行上锁,只锁 gh-stack 进程,不管别的 Git 或编辑器。只读查看还能用。暂停的任务必须先继续或中止,才能做下一次变更。恢复永远回到记录里的那棵树,就算 --continue / --abort 是在别处敲的。工具不自动暂存,不创建或删除工作树,也不抢走别人的检出。受影响的树在改写期间要闲着。暂停时只做它指出的冲突编辑和暂存。

检出一条已经在别处打开的分支,会打印路径并拒绝切换。up、down、top、bottom、trunk 以及带目标的检出可以加 --print-path,成功时标准输出只有绝对路径加换行。空闲目标会先在当前树检出。modify 可以跨树:先预检主人,在各自主人里改名,在接收树里拣选或变基。用不上的分支留在起始树,其它树不切换。丢掉或折叠的分支和它们的树还在。最近的幸存分支若属于别处,原来的检出保留,并报告幸存路径。主干只读。

git init --separate-git-dir 的仓库,要靠已有的 core.worktree 回指才能找到主树。链接树如果没有这条回指,只有在必须找主树主人时才会失败,其它树继续。管理目录永远不是检出目标。导航到别人占用的分支会失败。独立栈可以各住一棵链接树,也可以把同一栈的分支拆到多棵树。

bash
gh extension install github/gh-stack
gh extension upgrade stack
gh skill install github/gh-stack

命令名仍是 init、add、checkout、rebase、modify、sync、push、submit、link、merge、view、unstack 或 delete,以及 up / down / top / bottom / trunk / switch、feedback、alias。退出码 0 到 8:成功、泛化失败、不在栈里、变基冲突、接口、参数、歧义、变基进行中、锁。不要在同一个克隆里混用新旧 gh-stack;暂停的操作要在匹配的版本上收尾。旧目录冲突会挡住迁移。push 不是原子的。sync 从不开 PR;非交互的分叉会中止且不推。submit 在所有 PR 都已合并时会开新栈。link 不写本地跟踪,只往栈上加。合并对选中的前缀要么全过要么全不过,不支持绕过合并要求。排队合并可能落到不同组。Windows 上别名不会自动装。升级提示可用 GH_STACK_NO_UPDATE_NOTIFIER=1 关掉。本轮没有代跑这些命令。

安装和命令约束

本机怎么接到这套目录

先保证 gh 和 Git 版本过线,再装扩展。一个克隆只留一个版本。要看别人占用的分支,用带 --print-path 的导航,不要强行 checkout。改写前把相关树收拾干净。冲突暂停就只在报告的那棵树里改。modify 跨树时先看预检,不要手工去偷检出。

读这篇记住四件事。一,目录在公共 .git/gh-stack,多树共享。二,rebase / sync 只碰干净主人,脏就停。三,不自动暂存、不抢检出。四,许可证 MIT,星数 1642。站内旧稿写过栈式 PR 主路径,和这篇工作树约束可以并排,不要并成一篇。Claude Code 的工作树教程是另一条工具链。OnTrack 看的是编码 agent 轨迹,不是 Git 栈,不并进。本轮打开的是仓库 README 和 GitHub API,数字以这两处为准。发布页没有列出带日期的发行资产,升级就走扩展的 upgrade。日榜大仓本轮都已写过,不拿来垫这篇。Pyramid-JiT 今日 HN 新帖只有五星,也不并进。feedback 和 alias 只是辅助入口,别名在 Windows 上还不会自动装。锁只管扩展自己的进程,编辑器里另开的 Git 操作仍可能撞车,改写窗口还是要把相关树闲下来。导航失败时先看打印出来的路径,再决定去哪棵树。独立栈可以各住一棵链接树,同一栈也能拆到多棵树,两种布局都吃同一份公共目录,不要在克隆外另造一份元数据。本轮不把社区转述写进正文。读完先核命令行工具和 Git 版本,再装扩展。

相关文章

分享: