Skip to main content

管理堆积拉取请求

重新构造堆积拉取请求,重新定基其分支,并使用更改下层 GitHub CLI。

注意

此功能以公共预览版提供,可能会发生更改。

在堆栈上循环访问时,通常需要在较低层进行更改、重新设置基以保留线性历史记录或重构其分支。 扩展 gh stack 处理 GitHub CLI 这些任务的级联操作,这些操作会更新每个受影响的分支。 请参阅“堆积拉取请求 CLI 命令”。

对较低层进行更改

在顶层上工作时,需要更改堆栈中较低的内容时,请在分支中进行更改并重新定基,而不是在当前层中对其进行处理。

  1. 导航到需要更改的分支。

    Shell
    gh stack down
    

    还可以使用 <a0/a0> 查看特定分支

  2. 进行更改并提交。

    Shell
    git add .
    git commit -m "helpful-commit-message"
    
  3. 重新设置上述分支的基,以拾取更改。

    Shell
    gh stack rebase --upstack
    
  4. 推送更新的分支并返回到工作位置。

    Shell
    gh stack push
    gh stack top
    

重排堆栈

堆栈必须在其分支之间具有线性历史记录,然后才能合并。 运行 gh stack rebase 会执行级联 rebase,其中每个分支都基于其下方的分支重新基于该分支, main因此每个分支从所有下层中选取最新更改。

  1. 重新定基堆栈。 默认情况下,这会将每个分支从底部重新设置为顶部。

    Shell
    gh stack rebase
    

    若要限制 rebase,请使用 --downstack 从最低层到当前分支的重设基,或 --upstack 从当前分支重新设置为顶部。

  2. 推送更新的分支。 这用于 --force-with-lease 安全地更新重新基于的分支。

    Shell
    gh stack push
    

如果存储库遇到冲突, gh stack rebase 请停止并列出冲突的文件。

  • 解决受影响文件中的标记,将其暂存 git add,然后运行 gh stack rebase --continue
  • 若要重新开始,请运行 gh stack rebase --abort 以将所有分支还原到其预重新数据库状态。

注意

还可以从拉取请求触发服务器端存储库,但这些提交未签名。 如果存储库需要签名的提交,请从 GitHub CLI 中重新设置提交,使提交遵循本地 Git 提交签名配置。

从 GitHub 网站重新开始

当堆栈不线性时,合并框中会显示 一个 Rebase 堆栈 按钮。 选择它会触发服务器端级联 rebase,

  1. 将整个堆栈重新定基在最新中继的顶部,例如 main
  2. 将每个未合并的分支重新定基在其基分支的顶部,从堆栈底部向上工作。
  3. 强制推送每个重新基于的分支以更新远程。

重新数据库完成后,每个拉取请求都会反映更新的分支,并重新触发 CI 检查。

注意

不会对服务器端存储库创建的提交进行签名。**** 如果存储库需要签名的提交,请从GitHub CLI中gh stack rebase重新设置其基础,使提交遵循本地 Git 提交签名配置,然后推送。gh stack push

重组堆栈

你可能想要更改堆栈的构成。 例如,如果需要删除分支、合并分支、插入分支、重新排序或重命名,请使用交互式命令 gh stack modify

在运行 gh stack modify之前,请确保满足以下条件:

  • 已签出活动堆栈。
  • 工作树干净。
  • 没有正在进行的重新基。
  • 没有请求请求排队进行合并。
  • 提交历史记录是线性的。
  1. 打开修改终端 UI。

    Shell
    gh stack modify
    
  2. 选择分支并暂存操作。 在同一会话中不能混合重新排序和结构更改(drop、fold、insert、rename)。

    • x — 删除分支及其提交
    • d — 将分支折叠到下面的分支中
    • u — 将分支折叠到其上方的分支中
    • i / I — 在光标下方或上方插入新分支
    • r — 重命名分支
    • 转变+ / 转变+</kbd> — 对分支重新排序
    • z — 撤消最后一个暂存操作
  3. 通过保存应用暂存更改。 保存前不会修改任何内容。

    使用 ctrl/cmd+s

    如果在应用时发生冲突,请解决此问题并运行 gh stack modify --continue,或运行 gh stack modify --abort 以还原预修改状态。

  4. 推送更新的分支并重新创建堆栈 GitHub。

    Shell
    gh stack submit
    

从 GitHub 网站取消堆栈

若要从网站解析堆栈,例如重新排序或重新组织堆栈,请使用堆栈上的 Unstack 选项。

取消堆栈会删除堆栈中的 打开、草稿和关闭 拉取请求。 每个分支保留其当前基分支,但不再链接到其他分支,堆栈映射和堆栈合并要求会从它们中消失。

合并拉取请求和排队拉取请求保留在堆栈中。 拉取请求合并或排队进行合并后,作为堆栈的一部分,无法取消堆栈。 仅当其拉取请求均未合并或排队进行合并时,堆栈才会完全解散;否则,它会保留这些拉取请求。

若要在不解散堆栈的情况下重新排序或重构堆栈,请 gh stack modify 改用该命令。 请参阅 重新构建堆栈

合并后同步本地环境

当堆栈底部的拉取请求合并时,请使用单个同步命令更新本地状态。 若要同时自动修剪合并拉取请求的本地分支,请添加该 --prune 选项。

Shell
gh stack sync --prune

这会提取最新的更改,快速转发中继,将剩余的分支重新基于它,推送更新的分支,并从中同步拉取请求状态 GitHub。

拉取添加到堆栈上的拉取请求 GitHub

如果其他人将拉取请求添加到堆栈上 GitHub, gh stack sync 则提取新分支并将其追加到本地堆栈,使其镜像远程。 自动拉取此类全新远程预更新,因此 gh stack sync 可以安全地在自动化中运行。

解析分散堆栈

当两个堆栈都不是另一个的干净扩展时,本地堆栈和远程堆栈会有所不同,例如,当你在本地添加分支时,将不同的拉取请求添加到同一堆栈上 GitHub。 发生这种情况时, gh stack sync 无法自动合并这两者。 在交互式终端中,它提供了三种选择:

  • 使用远程堆栈作为事实来源。 将本地堆栈组合替换为远程,拉取任何缺失的分支。 如果位于分支上,远程堆栈不再包含,则你已移动到最近的幸存分支。 这需要一个干净的工作树,没有未提交的更改。
  • 删除堆栈。GitHub 删除堆栈对象 GitHub 并停止同步。拉取请求和本地分支保持不变。 使用 gh stack submit重新创建堆栈,该堆栈还会为尚未提交的任何分支创建拉取请求。 如果要更改其结构,请首先运行 gh stack modify
  • 取消。 在不推送分支或更新任何拉取请求的情况下中止同步。

在非交互式终端(如 CI)中,差异中止同步,而无需推送分支或更新拉取请求。 通过取消堆栈和重新创建堆栈来解决此问题。

后续步骤