{"meta":{"title":"管理堆积拉取请求","intro":"重新构造堆积拉取请求，重新定基其分支，并使用更改下层 GitHub CLI。","product":"拉取请求","breadcrumbs":[{"href":"/zh/pull-requests","title":"拉取请求"},{"href":"/zh/pull-requests/how-tos","title":"How-tos"},{"href":"/zh/pull-requests/how-tos/create-pull-requests","title":"创建拉取请求"},{"href":"/zh/pull-requests/how-tos/create-pull-requests/managing-stacked-pull-requests","title":"管理堆积 PR"}],"documentType":"article"},"body":"# 管理堆积拉取请求\n\n重新构造堆积拉取请求，重新定基其分支，并使用更改下层 GitHub CLI。\n\n> \\[!NOTE] 此功能以公共预览版提供，可能会发生更改。\n\n在堆栈上循环访问时，通常需要在较低层进行更改、重新设置基以保留线性历史记录或重构其分支。 扩展 `gh stack` 处理 GitHub CLI 这些任务的级联操作，这些操作会更新每个受影响的分支。 请参阅“[堆积拉取请求 CLI 命令](/zh/pull-requests/reference/stacked-prs-cli-commands)”。\n\n## 对较低层进行更改\n\n在顶层上工作时，需要更改堆栈中较低的内容时，请在分支中进行更改并重新定基，而不是在当前层中对其进行处理。\n\n1. 导航到需要更改的分支。\n\n   ```shell copy\n   gh stack down\n   ```\n\n   还可以使用 \\<a0/a0> 查看特定分支 <c0 />。\n\n2. 进行更改并提交。\n\n   ```shell copy\n   git add .\n   git commit -m \"helpful-commit-message\"\n   ```\n\n3. 重新设置上述分支的基，以拾取更改。\n\n   ```shell copy\n   gh stack rebase --upstack\n   ```\n\n4. 推送更新的分支并返回到工作位置。\n\n   ```shell copy\n   gh stack push\n   gh stack top\n   ```\n\n## 重排堆栈\n\n堆栈必须在其分支之间具有线性历史记录，然后才能合并。 运行 `gh stack rebase` 会执行级联 rebase，其中每个分支都基于其下方的分支重新基于该分支， `main`因此每个分支从所有下层中选取最新更改。\n\n1. 重新定基堆栈。 默认情况下，这会将每个分支从底部重新设置为顶部。\n\n   ```shell copy\n   gh stack rebase\n   ```\n\n   若要限制 rebase，请使用 `--downstack` 从最低层到当前分支的重设基，或 `--upstack` 从当前分支重新设置为顶部。\n\n2. 推送更新的分支。 这用于 `--force-with-lease` 安全地更新重新基于的分支。\n\n   ```shell copy\n   gh stack push\n   ```\n\n如果存储库遇到冲突， `gh stack rebase` 请停止并列出冲突的文件。\n\n* 解决受影响文件中的标记，将其暂存 `git add`，然后运行 `gh stack rebase --continue`。\n* 若要重新开始，请运行 `gh stack rebase --abort` 以将所有分支还原到其预重新数据库状态。\n\n> \\[!NOTE]\n> 还可以从拉取请求触发服务器端存储库，但这些提交未签名。 如果存储库需要签名的提交，请从 GitHub CLI 中重新设置提交，使提交遵循本地 Git 提交签名配置。\n\n### 从 GitHub 网站重新开始\n\n当堆栈不线性时，合并框中会显示 **一个 Rebase 堆栈** 按钮。 选择它会触发服务器端级联 rebase，\n\n1. 将整个堆栈重新定基在最新中继的顶部，例如 `main`。\n2. 将每个未合并的分支重新定基在其基分支的顶部，从堆栈底部向上工作。\n3. 强制推送每个重新基于的分支以更新远程。\n\n重新数据库完成后，每个拉取请求都会反映更新的分支，并重新触发 CI 检查。\n\n> \\[!NOTE]\n> 不会对服务器端存储库创建的提交进行签名。\\*\\*\\*\\* 如果存储库需要签名的提交，请从GitHub CLI中`gh stack rebase`重新设置其基础，使提交遵循本地 Git 提交签名配置，然后推送。`gh stack push`\n\n## 重组堆栈\n\n你可能想要更改堆栈的构成。 例如，如果需要删除分支、合并分支、插入分支、重新排序或重命名，请使用交互式命令 `gh stack modify`。\n\n在运行 `gh stack modify`之前，请确保满足以下条件：\n\n* 已签出活动堆栈。\n* 工作树干净。\n* 没有正在进行的重新基。\n* 没有请求请求排队进行合并。\n* 提交历史记录是线性的。\n\n1. 打开修改终端 UI。\n\n   ```shell copy\n   gh stack modify\n   ```\n\n2. 选择分支并暂存操作。 在同一会话中不能混合重新排序和结构更改（drop、fold、insert、rename）。\n\n   * `x` — 删除分支及其提交\n   * `d` — 将分支折叠到下面的分支中\n   * `u` — 将分支折叠到其上方的分支中\n   * `i`\n     /\n     `I` — 在光标下方或上方插入新分支\n   * `r` — 重命名分支\n   * <kbd>转变</kbd>+<kbd>→</kbd> / <kbd>转变</kbd>+<kbd>\\</kbd> — 对分支重新排序\n   * `z` — 撤消最后一个暂存操作\n\n3. 通过保存应用暂存更改。 保存前不会修改任何内容。\n\n   使用 <kbd>ctrl/cmd</kbd>+<kbd>s</kbd>。\n\n   如果在应用时发生冲突，请解决此问题并运行 `gh stack modify --continue`，或运行 `gh stack modify --abort` 以还原预修改状态。\n\n4. 推送更新的分支并重新创建堆栈 GitHub。\n\n   ```shell copy\n   gh stack submit\n   ```\n\n## 从 GitHub 网站取消堆栈\n\n若要从网站解析堆栈，例如重新排序或重新组织堆栈，请使用堆栈上的 **Unstack** 选项。\n\n取消堆栈会删除堆栈中的 **打开、草稿和关闭** 拉取请求。 每个分支保留其当前基分支，但不再链接到其他分支，堆栈映射和堆栈合并要求会从它们中消失。\n\n**合并拉取请求和排队拉取请求保留在堆栈中。** 拉取请求合并或排队进行合并后，作为堆栈的一部分，无法取消堆栈。 仅当其拉取请求均未合并或排队进行合并时，堆栈才会完全解散;否则，它会保留这些拉取请求。\n\n若要在不解散堆栈的情况下重新排序或重构堆栈，请 `gh stack modify` 改用该命令。 请参阅 [重新构建堆栈](#restructuring-a-stack)。\n\n## 合并后同步本地环境\n\n当堆栈底部的拉取请求合并时，请使用单个同步命令更新本地状态。 若要同时自动修剪合并拉取请求的本地分支，请添加该 `--prune` 选项。\n\n```shell copy\ngh stack sync --prune\n```\n\n这会提取最新的更改，快速转发中继，将剩余的分支重新基于它，推送更新的分支，并从中同步拉取请求状态 GitHub。\n\n### 拉取添加到堆栈上的拉取请求 GitHub\n\n如果其他人将拉取请求添加到堆栈上 GitHub， `gh stack sync` 则提取新分支并将其追加到本地堆栈，使其镜像远程。 自动拉取此类全新远程预更新，因此 `gh stack sync` 可以安全地在自动化中运行。\n\n### 解析分散堆栈\n\n当两个堆栈都不是另一个的干净扩展时，本地堆栈和远程堆栈会有所不同，例如，当你在本地添加分支时，将不同的拉取请求添加到同一堆栈上 GitHub。 发生这种情况时， `gh stack sync` 无法自动合并这两者。 在交互式终端中，它提供了三种选择：\n\n* **使用远程堆栈作为事实来源。** 将本地堆栈组合替换为远程，拉取任何缺失的分支。 如果位于分支上，远程堆栈不再包含，则你已移动到最近的幸存分支。 这需要一个干净的工作树，没有未提交的更改。\n* **删除堆栈。GitHub** 删除堆栈对象 GitHub 并停止同步。拉取请求和本地分支保持不变。 使用 `gh stack submit`重新创建堆栈，该堆栈还会为尚未提交的任何分支创建拉取请求。 如果要更改其结构，请首先运行 `gh stack modify` 。\n* **取消。** 在不推送分支或更新任何拉取请求的情况下中止同步。\n\n在非交互式终端（如 CI）中，差异中止同步，而无需推送分支或更新拉取请求。 通过取消堆栈和重新创建堆栈来解决此问题。\n\n## 后续步骤\n\n* [查看堆积拉取请求](/zh/pull-requests/how-tos/review-pull-requests/reviewing-stacked-pull-requests)\n* [合并堆叠式拉取请求](/zh/pull-requests/how-tos/merge-and-close-pull-requests/merging-stacked-pull-requests)"}