用途:这是 GitButler 多 lane(分支栈)的进阶操作说明。日常的 but status、but commit、but push、but absorb 由根目录 AGENTS.md 覆盖,本技能只处理已有分支栈的情况。
主要能力与用法:
- 优先一次只处理一个 lane,落完再开下一个;只有改动确实依赖另一在途分支的提交时才用栈。同步 lane 用 rebase 而不是 merge。
- 提交到栈内指定 lane:改动被分配给整个栈而非单个分支,but rub <file> <branch> 与 but commit <branch> --only 都作用于栈的 assigned-changes 集合,因此不要先暂存多个 lane 的文件再逐个提交;应逐 lane 分配、提交并立即用 git show --stat --name-only <branch> 验证。路径形式的 but rub 在每次变更后会失效,改用稳定的 cliId:but rub <cliId> <target>。
- 把一批编辑回填到已推送的栈:可靠做法是先用 but oplog snapshot -m "pristine" 再 git stash push -u,然后逐 lane 用 git checkout 'stash@{0}' -- <paths> 恢复已跟踪文件、用 git checkout 'stash@{0}^3' -- <paths> 恢复新增文件,用 git rm 复现删除/重命名,再整体 but absorb 或 but commit <lane>,验证 lane 的 tip tree 而非 diff,最后 but push <lane> -f 并用 git ls-remote 核对。
- 栈是线性的:but branch new <name> --anchor <parent> 会插入到父分支之上而非生成兄弟分支;分支扇出靠 PR base 表达,用 but move <branch> <target-branch> 或 but move <branch> zz 调整顺序。
适用场景:仓库中存在多分支栈、需要按 lane 拆分提交、回填评审修改或整理 PR base 时。
限制与注意:多 hunk 文件跨 lane 无法可靠拆分;but absorb 会把无法归属的内容放进顶层 lane;合并式历史会让栈塌缩;but pull 在 main 上 rebase 而非各分支 upstream;but commit --only 丢 hunk 时可能损坏工作树,可从快照的 worktree 子树恢复。具体命令行为以官方文档为准,文中未提供的收费等信息暂未提供。