关于 glab-stack
glab-stack 是实验性的 glab 命令行技能,用于将相互依赖的 Git 分支和提交组织成 GitLab 合并请求栈。它可从修订范围推断层级、调整顺序,并同步分支与合并请求。
主要功能
- 01创建和选择栈
- 02从 Git 修订推断层级
- 03保存和修改栈变更
- 04调整层级顺序并变基
- 05同步分支与合并请求
适用场景
- 01将功能拆分为相互依赖的合并请求
- 02从修订范围添加提交到栈
- 03为重排后的合并请求变基并调整目标
- 04推送栈变更并更新合并请求
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ vince-winkintel/ gitlab-cli-skills --skill glab-stack安装后在 Claude Code 中输入/glab-stack确认已加载。
附带文件references/commands.md
详细介绍
glab stack
工作树本地选择
当前选中的堆栈按 Git 工作树分别跟踪。请在准备操作的工作树中选择并检查目标堆栈;在一个工作树中切换堆栈,不会在另一个工作树中选择该堆栈。堆栈数据和仓库引用仍可能共享,因此仍需检查有破坏性或会发布内容的操作。
概览
堆栈是一系列相互依赖的小型合并请求,用于交付一项功能。在本地,每个差异都是一个独立分支上的提交,并基于前一个差异的分支。同步会创建一个以此前一个分支为目标的 MR;第一个差异则以基础分支为目标。
无论当前检出的分支是什么,堆栈命令都会操作最近创建或切换到的堆栈。执行变更前请检查当前活动堆栈。此功能仍处于实验阶段。完整且经过校验和验证的父命令与子命令帮助(包括当前术语和示例)请参阅 references/commands.md。
快速入门
glab stack --help
当前行为
生成的堆栈分支使用 {branch_prefix}-{stack-title}-{hash}。如果未设置 branch_prefix,glab 会使用操作系统账户用户名(并移除 Windows 域前缀);只有在无法获取用户名时才回退到 glab-stack。它不会依赖 $USER;如果自动化需要稳定且明确的前缀,请设置 glab config set branch_prefix <value>。
glab stack infer <revision-range> 会根据 Git 修订范围内选定的提交创建或追加堆栈层。该范围的起点必须解析为分支名称,不能是 HEAD~5 这类相对引用,因为基础分支会记录在堆栈元数据中。
# Infer stack layers from commits between main and the current branch
glab stack infer main..HEAD
# Infer from a feature branch that diverged from develop
glab stack infer develop..HEAD
# If no stack is active, create one with a specific name
glab stack infer --name feature-stack main..HEAD
如果有活动堆栈,infer 会向该堆栈追加内容,并忽略 --name。请先检查活动堆栈;若要选择不同的目标位置,再推断无关的工作,请使用 glab stack create 或 glab stack switch。
glab stack sync 支持 --update-base、--assignee、--label、--reviewer、--skip-mr-creation 和 --skip-push。
# Sync stack and rebase onto the latest base branch
glab stack sync --update-base
# Sync/push existing stack work without opening MRs for branches that do not have one yet
glab stack sync --skip-mr-creation
# Fetch and rebase the stack locally without pushing branches or creating MRs
glab stack sync --skip-push
# Sync stack and set MR metadata during submission
glab stack sync --assignee @owner --reviewer @reviewer --label backend
# Multiple reviewers can be repeated or comma-separated
glab stack sync --reviewer user1 --reviewer user2
glab stack sync --reviewer user1,user2
如果基础分支(例如 main)已有更新,且你想在推送前对整个堆栈执行变基,请使用 --update-base。
如果你想推送已修改的堆栈分支并清理已合并的条目,但有意不为尚未创建合并请求的堆栈层打开新合并请求,请使用 --skip-mr-creation。合并请求已关闭的差异会保留在堆栈中。
如果你想在本地获取并对堆栈执行变基,但不推送分支或创建合并请求,请使用 --skip-push。这不是离线模式:glab 仍会从远程服务获取内容,并调用 GitLab API。之后推送前,请检查重写后的本地历史记录。
如果你想让 glab stack sync 在同一步骤中提交堆栈的合并请求,并附带负责人和路由元数据,请使用 --assignee、--reviewer 和 --label。
堆栈同步推送期间,glab 会在运行时将 Git 钩子的输出流式传输到 stdout/stderr。请在自动化日志中保留这些输出:如果 pre-push 钩子失败,错误会作为推送错误返回,而不会被缓冲的输出掩盖。
现在可以不带堆栈名称运行 glab stack switch,以交互方式从所有堆栈中选择。对于非交互式自动化,请传入堆栈名称。
glab stack amend 支持 --reword,可在不暂存文件的情况下仅更新堆栈提交消息。它不能与文件参数或 --all 同时使用;请传入 -m/--message 或 -d/--description,也可以让 glab 打开编辑器。
glab stack amend --reword -m "updated commit message"
glab stack amend 和 glab stack save 支持 --no-verify,可跳过底层 Git 提交的本地 pre-commit 和 commit-msg 钩子。请将其视同 git commit --no-verify:只有在了解被跳过的钩子并有意绕过时才使用。
重新排序与恢复
glab stack reorder 会在编辑器中打开当前堆栈顺序,将每个分支变基到新的父分支上,并在 GitLab 上重新指定移动的合并请求的目标分支。它不会推送分支,但会写入远程,不是试运行;运行前请先批准合并请求的目标变更。检查重写后的历史记录后,运行 glab stack sync,以强制推送变基后的分支。
glab stack reorder
# After resolving a rebase conflict and running git rebase --continue
glab stack reorder --continue
# Restore the original branch order instead
glab stack reorder --abort
重新排序变基过程中不要开始另一项重新排序。请先解决冲突并继续,或中止操作,然后再重试。在自动化日志中保留冲突和变基输出。
删除本地堆栈元数据
# Choose a stack interactively
glab stack delete
# Delete a named stack after confirmation
glab stack delete <stack-name>
# Approved non-interactive deletion
glab stack delete <stack-name> --yes
删除操作只会移除堆栈的本地 stacked-metadata 目录,不会删除分支、提交或合并请求。使用 --yes 前,请确认堆栈名称和仓库;随后确认 $(git rev-parse --git-common-dir)/stacked/ 下已不存在指定目录。此只读检查适用于普通检出和关联工作树;glab stack list 只会列出当前堆栈中的层,无法验证其他堆栈是否已删除。
子命令
create:创建并激活新堆栈。switch:选择其他活动堆栈。infer:将 Git 修订范围中的差异添加到活动堆栈;如果没有活动堆栈,则创建一个。save:将更改保存为新差异。amend:将更改保存到现有差异。list:列出活动堆栈中的所有差异。first:移动到第一个差异。last:移动到最后一个差异。next:移动到下一个差异。prev:移动到上一个差异。move:移动到指定差异。reorder:对重新排序后的差异进行变基,并在 GitLab 上重新指定已移动 MR 的目标分支,但不推送分支。sync:推送堆栈并创建或更新其合并请求,具体受上述跳过标志影响。delete:删除本地堆栈元数据,不删除分支、提交或 MR。
完整的 --help 输出请参阅 references/commands.md。