其他
在 GitHub PR 栈/依赖分支链中操作或规划拆分时…
适用于已检出或有多个依赖 PR/分支层,需要用 gh stack 非交互地查看、创建、同步、处理 rebase 冲突、恢复和合并 stacked PR 的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 40/100 ×0.15
适用场景
在 GitHub PR 栈/依赖分支链中特定
解决思路
- 安装扩展:运行 `gh extension install github/gh-stack`。
- 启用冲突解决记忆:运行 `git config rerere.enabled true`。
- 若仓库有多个 remote,运行 `git config remote.pushDefault origin`;否则不要在没有 `--remote <name>` 时运行 `push`、`submit`、`sync`、`rebase`、`link`,因为 `checkout` 和 `trunk` 没有 `--remote` flag,也需要该配置。
- 理解栈输出顺序:`gh stack` 按 trunk-first、从左到右打印;左侧是 bottom,右侧是 top;`auth` 基于 `main` 并先合并,`frontend` 最后合并;`up` 朝顶部远离 trunk,`down` 朝 trunk;基础工作放底部,依赖代码放上方。
- 非交互场景始终传非交互 flags,不要依赖 TTY 检测;管道中命令可能报错或打印静态文本,PTY 中同一命令可能打开提示或全屏 TUI 并阻塞。
- 用 `gh stack view --json`,不要裸跑 `gh stack view`,因为 PTY 下会打开 TUI。
- 用 `gh stack submit --auto`,不要裸跑 `gh stack submit`,因为会为每个新 PR 提示标题。
- 整栈合并用 `gh stack merge <target> --yes`,不要裸跑 `gh stack merge`,必须显式指定目标。
- 用 `gh stack init <branch>...`,不要裸跑 `gh stack init`,因为会提示分支名。
- 用 `gh stack add <branch>`,不要裸跑 `gh stack add`,因为会提示名称,且管道下也会失败。
- 用 `gh stack checkout <target>`,不要裸跑 `gh stack checkout`,因为会打开选择菜单。
- 切换用 `gh stack up` / `down` / `top` / `bottom`,不要用 `gh stack switch`,因为它仅菜单。
- 不要尝试非交互使用 `gh stack modify`,因为它仅 TUI,没有非交互路径。
- `gh stack view --short` 在两种模式下都安全,但面向人类格式化;要解析就用 `--json`。
- 当另一个本地栈已覆盖目标分支时,`checkout <pr>` 不能被强制;先运行 `gh stack unstack --local`,这会保留 GitHub 上的栈,然后重试。
- 开始多部分工作时,在写文件前创建栈;不要先在 trunk 上实现所有关注点再拆分;每个依赖关注点放一层,自底向上。
- 编辑已有栈时,先检出拥有该变更的层再编辑;绝不在当前 top 分支提交较低层的关注点。
- 所有权不清时,运行 `gh stack view --json`;再检查 `git log --all -- <path>`;然后检出 owner、编辑、提交、向上 rebase、返回 top。
- 编辑已有栈的完整流程:`gh stack down` 或 `gh stack checkout api`;`git add ... && git commit -m "Add get-user endpoint"`;`gh stack rebase --upstack`;`gh stack top`;`gh stack push`。
- 核心创建流程:`gh stack init auth`;`git add ... && git commit -m "Add auth middleware"`;`gh stack add api`;`git add ... && git commit -m "Add API routes"`;`gh stack submit --auto`;`gh stack view --json`。
- 给 `submit` 加 `--open` 可创建待审 PR 而不是草稿。
- 分支名按原样使用:`gh stack add refactor/foo` 创建 `refactor/foo`。
- 同步:运行 `gh stack sync`,它会 fetch、与 GitHub 协调、rebase、push、刷新 PR 状态。
- 同步并清理:运行 `gh stack sync --prune`,删除已合并 PR 的本地分支;非交互下没有 `--prune` 绝不 prune。
- 若本地与远程栈分叉,`sync` 会打印两条链、不做修改、以 0 退出并显示 `Sync aborted`;查看 `references/troubleshooting.md`。
- 合并多个已打开 PR 的默认做法是经 forge 顺序合并:使用 merge-open-prs,先合并父 PR,再对下一个 PR 应用仓库的 base-update 和验证要求;不要把“合并打开 PR”请求变成一次组合式栈操作。
- 仅在用户明确要求整栈合并时,才使用 `gh stack merge`,并用参数限定范围。
- 整栈合并命令:`gh stack merge 42 --yes` 合并 PR #42 及其下方每个未合并 PR;`gh stack merge 7 --yes` 合并栈 #7 中每个未合并 PR;可加 `--squash`、`--merge`、`--rebase`、`--merge-method <method>`。
- 整栈合并是全有或全无:该集合中任一 PR 不能合并,则都不合并。
- 不带方法 flag 时复用上次使用的方法;若 base 分支使用 merge queue,栈会排队,queue 决定方法并忽略传入 flag 且警告;排队 PR 可能分批落地。
- 读取状态:`gh stack view --json` 将 JSON 写到 stdout;状态消息写到 stderr;不要解析状态消息,按退出码分支。
- JSON 字段:`trunk` 字符串;`currentBranch` 字符串;`branches[]` 含 `name`、`head`、`base`、`isCurrent`、`isMerged`、`isQueued`、`needsRebase`;`branches[].pr` 含 `number`、`url`、`state`(`OPEN` | `MERGED` | `QUEUED`),无 PR 时缺失。
- 理解 `base`:它是该分支最后已知包含的父分支保存 SHA,可能比父分支当前 tip 旧;当当前父 tip 不再是该分支祖先时 `needsRebase` 为 true。
- 退出码 0:成功,无需恢复。
- 退出码 1:通用错误,读 stderr。
- 退出码 2:不在栈中,运行 `gh stack init` 或 `gh stack checkout <target>`。
- 退出码 3:rebase 冲突,按 Exit 3 recovery 处理。
- 退出码 4:GitHub API 失败,检查 `gh auth status`,重试。
- 退出码 5:无效参数,修正调用;看 `<command> --help`。
- 退出码 6:需要消歧,分支在多个栈中;检出一个非共享分支。
- 退出码 7:已有 rebase 进行中,运行 `gh stack rebase --continue` 或 `--abort`。
- 退出码 8:栈文件被锁,另一个 `gh stack` 进程正在写;约 5 秒后重试。
- 退出码 9:Stacked PRs 不可用,仓库未启用;告知用户。
- 退出码 10:需要 modify 恢复,运行 `gh stack modify --abort`。
- Exit 3 恢复(`gh stack rebase` 后):解决文件,运行 `git add`,再 `gh stack rebase --continue`;用 `gh stack rebase --abort` 恢复栈。
- Exit 3 恢复(`gh stack sync` 后):栈已恢复;运行 `gh stack rebase` 重现冲突,再按上述解决并继续。
- 约束:栈严格线性,一个父、至多一个子;并行工作用独立栈。
- 没有非交互式重排或移除;错误可能建议 `gh stack modify`,但它仅 TUI;改用 `unstack` 然后 `init` 重构。
- PR 标题和正文自动生成;之后用 `gh pr edit` 修改。
- `checkout <branch-name>` 只对本地栈解析;要从 GitHub 拉下栈,用栈号或 PR 号。
- 更多细节:`gh stack <command> --help` 是 flags/args 权威;`gh stack help <command>` 打印顶层帮助。
- 按任务读参考:创建栈前决定层数和每层内容读 `references/stack-design.md`;命令异常或需要前置条件、副作用、原子性、顺序保证读 `references/commands.md`;rebase 冲突、squash-merge 后、本地远程分叉或重构栈时读 `references/troubleshooting.md`。
适用边界 · 注意事项
- 不是 GitHub 仓库或无法安装 GitHub CLI 与 gh-stack 扩展时,不适用。
- 需要非线性分支关系、并行多父/多子栈时,不适用;gh stack 只支持严格线性栈。
- 用户只是要求合并多个已打开 PR 时,不要用整栈合并,改用 merge-open-prs 顺序合并。