# 管理堆积拉取请求

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

> \[!NOTE] 此功能以公共预览版提供，可能会发生更改。

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

## 对较低层进行更改

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

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

   ```shell copy
   gh stack down
   ```

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

2. 进行更改并提交。

   ```shell copy
   git add .
   git commit -m "helpful-commit-message"
   ```

3. 重新设置上述分支的基，以拾取更改。

   ```shell copy
   gh stack rebase --upstack
   ```

4. 推送更新的分支并返回到工作位置。

   ```shell copy
   gh stack push
   gh stack top
   ```

## 重排堆栈

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

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

   ```shell copy
   gh stack rebase
   ```

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

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

   ```shell copy
   gh stack push
   ```

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

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

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

### 从 GitHub 网站重新开始

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

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

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

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

## 重组堆栈

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

在运行 `gh stack modify`之前，请确保满足以下条件：

* 已签出活动堆栈。
* 工作树干净。
* 没有正在进行的重新基。
* 没有请求请求排队进行合并。
* 提交历史记录是线性的。

1. 打开修改终端 UI。

   ```shell copy
   gh stack modify
   ```

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

   * `x` — 删除分支及其提交
   * `d` — 将分支折叠到下面的分支中
   * `u` — 将分支折叠到其上方的分支中
   * `i`
     /
     `I` — 在光标下方或上方插入新分支
   * `r` — 重命名分支
   * <kbd>转变</kbd>+<kbd>→</kbd> / <kbd>转变</kbd>+<kbd>\</kbd> — 对分支重新排序
   * `z` — 撤消最后一个暂存操作

3. 通过保存应用暂存更改。 保存前不会修改任何内容。

   使用 <kbd>ctrl/cmd</kbd>+<kbd>s</kbd>。

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

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

   ```shell copy
   gh stack submit
   ```

## 从 GitHub 网站取消堆栈

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

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

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

若要在不解散堆栈的情况下重新排序或重构堆栈，请 `gh stack modify` 改用该命令。 请参阅 [重新构建堆栈](#restructuring-a-stack)。

## 合并后同步本地环境

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

```shell copy
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）中，差异中止同步，而无需推送分支或更新拉取请求。 通过取消堆栈和重新创建堆栈来解决此问题。

## 后续步骤

* [查看堆积拉取请求](/zh/pull-requests/how-tos/review-pull-requests/reviewing-stacked-pull-requests)
* [合并堆积拉取请求](/zh/pull-requests/how-tos/merge-and-close-pull-requests/merging-stacked-pull-requests)