# 堆积拉取请求 CLI 命令

在 .. 中GitHub CLI查找扩展的每个命令、标志和退出代码gh stack。

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

用于`gh stack`GitHub CLI从本地存储库创建和管理拉取请求堆栈的扩展。 有关堆栈的简介，请参阅 [堆积拉取请求](/zh/pull-requests/reference/stacked-pull-requests)。

## 安装

```shell
gh extension install github/gh-stack
```

该扩展需要 GitHub CLI 版本`gh` 2.0 或更高版本。

> \[!NOTE]
> 该 `gh stack` 扩展使用身份验证 GitHub CLI 。 如果尚未进行身份验证，请运行 `gh auth login`。

## 命令摘要

| 命令                                        | Purpose                          |
| ----------------------------------------- | -------------------------------- |
| [`gh stack init`](#gh-stack-init)         | 初始化当前存储库中的新堆栈。                   |
| [`gh stack add`](#gh-stack-add)           | 在当前堆栈的顶部添加新分支。                   |
| [`gh stack view`](#gh-stack-view)         | 查看当前堆栈。                          |
| [`gh stack checkout`](#gh-stack-checkout) | 按堆栈编号、拉取请求编号、拉取请求 URL 或分支名称查看堆栈。 |
| [`gh stack modify`](#gh-stack-modify)     | 以交互方式重构当前堆栈。                     |
| [`gh stack unstack`](#gh-stack-unstack)   | 从本地跟踪中删除堆栈并将其取消堆栈。GitHub         |
| [`gh stack submit`](#gh-stack-submit)     | 推送所有分支，然后创建或更新拉取请求和堆栈。GitHub     |
| [`gh stack sync`](#gh-stack-sync)         | 在单个命令中提取、重新数据库、推送和同步拉取请求状态。      |
| [`gh stack rebase`](#gh-stack-rebase)     | 从远程拉取并跨堆栈运行级联存储库。                |
| [`gh stack push`](#gh-stack-push)         | 将当前堆栈中的活动分支推送到远程。                |
| [`gh stack link`](#gh-stack-link)         | 在不进行本地跟踪的情况下将拉取请求链接到堆栈 GitHub 中。 |
| [`gh stack merge`](#gh-stack-merge)       | 一次合并一个或多个堆积拉取请求。                 |
| [`gh stack switch`](#gh-stack-switch)     | 以交互方式切换到堆栈中的另一个分支。               |
| [`gh stack up`](#gh-stack-up)             | 向上移动到堆栈顶部，远离中继。                  |
| [`gh stack down`](#gh-stack-down)         | 向堆栈底部向下移动，向中继移动。                 |
| [`gh stack top`](#gh-stack-top)           | 跳到堆栈的顶部。                         |
| [`gh stack bottom`](#gh-stack-bottom)     | 跳到堆栈底部。                          |
| [`gh stack trunk`](#gh-stack-trunk)       | 跳到中继分支。                          |
| [`gh stack alias`](#gh-stack-alias)       | 创建短命令别名，以便可以少键入。                 |
| [`gh stack feedback`](#gh-stack-feedback) | 共享有关扩展的 `gh stack` 反馈。           |

## 堆栈管理

### `gh stack init`

初始化当前存储库中的新堆栈。

```shell
gh stack init [flags] [branches...]
```

在本地初始化新堆栈。 在交互模式（无参数）中，命令提示符输入分支名称并提供使用 Current Branch 作为第一层的功能。

提供显式分支名称时，会自动采用现有分支，并创建任何缺失的分支。 中继默认为存储库的默认分支，除非使用 `--base`替代它。

该命令会自动启用 `git rerere` ，以便跨存储库记住冲突解决。

| Flag                  | 说明                   |
| --------------------- | -------------------- |
| `-b, --base <branch>` | 堆栈的中继分支（默认为存储库的默认分支） |

**例子：**

```shell
# Interactive — prompts for branch names
gh stack init

# Non-interactive — specify first branch upfront
gh stack init feature-auth

# Use a different trunk branch
gh stack init --base develop feature-auth

# Adopt or create multiple branches at once
gh stack init feature-auth feature-api feature-ui
```

### `gh stack add`

在当前堆栈的顶部添加新分支。

```shell
gh stack add [flags] [branch]
```

在当前 HEAD 处创建一个新分支，将其添加到堆栈顶部，并将其签出。必须在堆栈的最顶层分支上运行此命令。 如果未提供分支名称，命令提示符会提示一个分支名称。

可以选择暂存更改，并在流中创建提交 `add` 。 在没有显式分支名称的情况下提供 `-m` 时，分支名称会以日期和时间格式自动生成，例如 `03-24-add_login`。

| Flag                     | 说明                        |
| ------------------------ | ------------------------- |
| `-A, --all`              | 暂存所有更改，包括未跟踪的文件。 需要 `-m`。 |
| `-u, --update`           | 仅暂存对已跟踪文件的更改。 需要 `-m`。    |
| `-m, --message <string>` | 创建分支之前使用此消息创建提交           |

> \[!NOTE]
> `-A`和`-u`是互相排斥的。

**例子：**

```shell
# Create a branch by name
gh stack add api-routes

# Prompt for a branch name interactively
gh stack add

# Stage all changes, commit, and auto-generate the branch name
gh stack add -Am "Add login endpoint"

# Stage only tracked files, commit, and auto-generate the branch name
gh stack add -um "Fix auth bug"

# Commit already-staged changes and auto-generate the branch name
gh stack add -m "Add user model"

# Stage all changes, commit, and use an explicit branch name
gh stack add -Am "Add tests" test-layer

# Stage only tracked files, commit, and use an explicit branch name
gh stack add -um "Update docs" docs-layer
```

### `gh stack view`

查看当前堆栈。

```shell
gh stack view [flags]
```

显示堆栈中的所有分支、排序、拉取请求链接以及具有相对时间戳的最新提交。 输出通过寻呼器进行管道传递，该寻呼器遵循 `GIT_PAGER` 或 `PAGER`默认为 `less -R`。

| Flag          | 说明            |
| ------------- | ------------- |
| `-s, --short` | 压缩输出（仅分支名称）   |
| `--json`      | 将堆栈数据输出为 JSON |

**例子：**

```shell
gh stack view
gh stack view --short
gh stack view --json
```

### `gh stack checkout`

按堆栈编号、拉取请求编号、拉取请求 URL 或分支名称查看堆栈。

```shell
gh stack checkout [<stack-number> | <pr-number> | <pr-url> | <branch>]
```

空数首先解释为堆栈或拉取请求编号。 这些是 UI 中显示的 GitHub 存储库范围的标识符。 如果没有与数字匹配，则会将其尝试为分支名称。

引用远程堆栈时，该命令会提取堆栈 GitHub，拉取分支，并在本地设置堆栈。 如果堆栈已存在于本地并匹配，则命令会切换到分支。 如果本地堆栈和远程堆栈具有不同的组合，系统会提示你解决冲突。

提供分支名称时，该命令仅针对本地跟踪的堆栈解析它。

在交互式终端中运行命令时，它会打开一个可搜索选取器，其中列出了本地跟踪的每个堆栈以及仅 GitHub存在于它的堆栈。 每行显示堆栈号、其底部和顶部分支、基分支、状态栏，汇总了其拉取请求的合并、打开、关闭或尚未推送的数量，以及堆栈是在本地可用还是仅在远程上可用。 使用 **“全部**”、“ **本地”** 和 **“远程** ”选项卡进行筛选，或键入 `/` 搜索。 将省略完全合并的堆栈。 在切换到本地之前，选择仅远程堆栈会将其克隆到本地。

**例子：**

```shell
# Check out a stack by its stack number
gh stack checkout 7

# Check out a stack by pull request number
gh stack checkout 42

# Check out a stack by pull request URL
gh stack checkout https://github.com/owner/repo/pull/42

# Check out a stack by branch name (local only)
gh stack checkout feature-auth

# Interactive — pick from all available stacks (local and remote)
gh stack checkout
```

### `gh stack modify`

以交互方式重构当前堆栈。

```shell
gh stack modify [flags]
```

打开用于重组堆栈的交互式终端 UI。 所有更改都会暂存到界面中，并在按 <kbd>Ctrl</kbd>+<kbd>S</kbd> 时一起应用。 无法修改合并拉取请求的分支。

| Flag         | 说明                       |
| ------------ | ------------------------ |
| `--continue` | 解决冲突后继续                  |
| `--abort`    | 中止修改会话，并在运行命令之前将堆栈还原到其状态 |

**前提 条件**

该命令在打开接口之前检查这些条件：

1. 必须在本地签出活动堆栈。
2. 工作树必须干净，没有未提交的更改。
3. 没有正在进行的重新基。
4. 堆栈中没有拉取请求排队进行合并。
5. 提交历史记录必须是线性的，没有合并提交，也没有分歧的分支。

**Operations**

| 运算                         | 密钥                                | Effect |
| -------------------------- | --------------------------------- | ------ |
| Drop                       |                                   |        |
| <kbd>x</kbd>               | 从堆栈中删除分支及其提交。 保留本地分支和关联的拉取请求。     |        |
| 向下折叠                       |                                   |        |
| <kbd>d</kbd>               | 将提交内容吸收到下面的分支中，指向中继。 折叠分支将从堆栈中删除。 |        |
| 向上折叠                       |                                   |        |
| <kbd>u</kbd>               | 将提交吸收到上面的分支中，远离中继。 折叠分支将从堆栈中删除。   |        |
| 在下方插入                      |                                   |        |
| <kbd>i</kbd>               | 将新的空分支插入光标下方，朝中继。                 |        |
| 在上面插入                      |                                   |        |
| <kbd>我</kbd>               | 在光标上方插入一个新的空分支，远离中继。              |        |
| 下移                         |                                   |        |
| <kbd>转变</kbd>+<kbd></kbd>  | 将分支重新排序，朝中继。                      |        |
| 上移                         |                                   |        |
| <kbd>转变</kbd>+<kbd>→</kbd> | 将分支重新排序，远离中继。                     |        |
| Rename                     |                                   |        |
| <kbd>r</kbd>               | 使用内联提示重命名分支。                      |        |
| Undo                       |                                   |        |
| <kbd>Z</kbd>               | 撤消最后一个暂存操作。                       |        |

**应用阶段**

按 <kbd>Ctrl</kbd>+<kbd>S</kbd> 时，会通过重命名分支、插入新分支、折叠或删除分支以及运行级联存储库来创建具有所需堆栈状态的线性提交历史记录来应用暂存更改。

如果发生重新基冲突，则可以：

* 解决冲突，暂存文件，然后运行 `gh stack modify --continue`。
* 运行 `gh stack modify --abort` 以中止操作并将堆栈还原到其以前的状态。

**修改后**

如果已创建拉取请求 GitHub堆栈，请运行 `gh stack submit` 以推送更新的分支并重新创建堆栈。 旧堆栈会自动替换。

**例子：**

```shell
# Open the interactive modify interface
gh stack modify

# Continue after resolving a conflict
gh stack modify --continue

# Abort and restore to the previous state
gh stack modify --abort
```

### `gh stack unstack`

从本地跟踪中删除堆栈并将其取消堆栈。GitHub 此命令也可用作 `gh stack delete`.

```shell
gh stack unstack [<stack-number>] [flags]
```

如果没有参数，该命令面向活动堆栈，即包含当前签出分支的堆栈。 它会取消堆栈的堆栈， GitHub 并删除本地跟踪。

提供堆栈号（堆栈 UI GitHub上所示的标识符）以取消堆栈特定的堆栈。 这适用于存储库中的任意位置，无论堆栈是否在本地签出，因为堆栈是通过 GitHub API 直接取消堆栈的。 当堆栈也在本地可用时，也会删除其本地跟踪。

无法从堆栈上 GitHub 删除合并、合并或排队进行合并的拉取请求并保留堆栈的一部分。 删除每个拉取请求时，堆栈将解散，并删除任何本地跟踪。 当某些拉取请求保持堆叠时，将保留堆栈并保留本地跟踪（如果有的话）。 用于 `--local` 跳过远程操作并仅删除本地跟踪。

当需要通过删除分支、插入分支、重新排序分支、重命名分支或进行其他大型更改来重构堆栈时，此命令非常有用。 取消堆栈后，用于 `gh stack init` 使用所需的结构重新创建堆栈。 自动采用现有分支。

| Flag      | 说明                       |
| --------- | ------------------------ |
| `--local` | 仅在本地删除堆栈，使其保持打开状态 GitHub |

**例子：**

```shell
# Unstack the current stack on GitHub and remove local tracking
gh stack unstack

# Unstack a specific stack by its number
gh stack unstack 7

# Only remove local tracking
gh stack unstack --local
```

## 远程操作

### `gh stack submit`

推送所有分支，然后创建或更新拉取请求和堆栈。GitHub

```shell
gh stack submit [flags]
```

为堆栈中的每个分支创建拉取请求，将分支推送到远程分支。 创建拉取请求后， `submit` 会自动创建堆栈 GitHub 以将拉取请求链接在一起。 如果堆栈已存在于上一个提交中 GitHub，则会将新的拉取请求添加到现有堆栈。

如果堆栈中的每个拉取请求都已合并，该堆栈已完成且无法扩展。 在这种情况下， `submit` 会自动启动一个新堆栈，该堆栈根植于未合并的分支的中继，并在其上 GitHub创建它，使合并的堆栈保持不变。

在交互式终端中， `submit` 在单个屏幕上打开全屏编辑器。

* **左面板。** 默认情况下，包含不带拉取请求的每个分支。 取消选择不想使用 <kbd>Ctrl</kbd>+<kbd>X</kbd> 提交的任何项。 由于每个拉取请求在它下面的分支上生成，因此取消选择分支也会取消选择其上堆叠的分支，并重新包括分支重新包含它所依赖的分支下方的分支。 已具有拉取请求的分支（无论是打开、草稿、排队还是合并）都针对上下文显示，但已锁定。 在 Web 上编辑这些内容。
* **右侧面板。** 对于重点分支，起草标题和说明，并选择拉取请求是已打开以供审阅还是作为草稿打开。 通过 markdown 预览和 `$EDITOR` 转义，从存储库的拉取请求模板或提交中预先填充说明。 将锁定分支的焦点显示为只读卡片，其中包含其拉取请求的链接。 按 <kbd>o</kbd> 在浏览器中打开它。

按 <kbd>Ctrl</kbd>+<kbd>S</kbd> 一次性提交所有包含的拉取请求。 编辑器支持键盘和鼠标输入。 在非交互式终端（如 CI）中传递 `--auto`或运行命令，以跳过编辑器并使用自动生成的游戏。

如果分支已打开拉取请求，但不存在堆栈 GitHub，则可以选择使用 <kbd>Ctrl</kbd>+<kbd>B</kbd> 将拉取请求链接到堆栈中。

在编辑器中，新的拉取请求默认为准备审阅。 可以使用切换切换来翻转任何拉取请求以草稿。 使用 `--auto`时，除非通过 `--open`，否则新拉取请求将创建为草稿。

| Flag              | 说明                                  |
| ----------------- | ----------------------------------- |
| `--auto`          | 跳过编辑器并使用自动生成的拉取请求标题                 |
| `--open`          | 创建新的拉取请求（准备审阅而不是草稿），并将现有拉取请求标记为准备审阅 |
| `--remote <name>` | 远程推送到 （默认为自动检测到的远程）                 |

**例子：**

```shell
gh stack submit
gh stack submit --auto
gh stack submit --open
```

### `gh stack sync`

在单个命令中提取、重新数据库、推送和同步拉取请求状态。

```shell
gh stack sync [flags]
```

同步整个堆栈。

1. **获取。** 从 `origin`中获取最新更改。
2. **协调远程堆栈。** 在本地镜像堆栈 GitHub 。 将拉取请求添加到堆栈时 GitHub，以便远程位于本地堆栈之前，其分支会自动拉取并追加到本地堆栈。 当本地堆栈和远程堆栈真正发生分歧时，例如，由于你在将不同的拉取请求添加到堆栈时 GitHub在本地添加了分支，因此系统会提示你解决差异问题。 请参阅 [分化堆栈](#diverged-stacks)。 在非交互式终端中，差异中止同步，不会推送或更新任何内容。
3. **快进中继。** 快速转发中继分支以匹配远程分支。 如果分支存在分歧，则会跳过此步骤。
4. **级联重基。** 将所有堆栈分支重新定基到更新的父级，但前提是中继移动。 如果检测到冲突，所有分支将还原到其原始状态，建议以交互方式运行 `gh stack rebase` 以解决冲突。
5. **推送。** 推送所有分支（ `--force-with-lease` 如果发生重新基）。
6. **同步拉取请求。** 从中同步拉取请求状态 GitHub 并报告每个拉取请求的状态。
7. **同步堆栈。** 将堆栈的打开拉取请求链接到堆栈上 GitHub、创建远程堆栈对象（如果尚不存在）或更新它（如果部分形成）。 仅当存在两个或多个拉取请求时，才会发生这种情况。 同步永远不会打开拉取请求。 用于该用途 `gh stack submit` 。
8. **修剪。** 在交互式终端中，提示删除合并拉取请求的本地分支。 用于 `--prune` 自动修剪。

在本地堆栈顶部添加拉取请求的全新远程预更新会自动拉取，无需提示即可自动拉取，因此 `sync` 可以安全地在自动化中运行。 仅当堆栈真正发生分歧时同步提示。

#### 分化堆栈

如果两个堆栈都不是另一个堆栈的干净前缀，例如，由于你在本地添加了分支，同时将单独的拉取请求添加到同一堆栈时 GitHub，同步无法自动合并这两个分支。 在交互式终端中，它提供了三种选择。

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

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

| Flag              | 说明                      |
| ----------------- | ----------------------- |
| `--remote <name>` | 从远程提取和推送到 （默认为自动检测到的远程） |
| `--prune`         | 删除合并拉取请求的本地分支           |

**例子：**

```shell
gh stack sync

# Sync and automatically prune merged branches
gh stack sync --prune
```

### `gh stack rebase`

从远程拉取并跨堆栈运行级联存储库。

```shell
gh stack rebase [flags] [branch]
```

从 `origin`中提取最新更改，然后确保堆栈中的每个分支在其提交历史记录中都有上一层的提示。 分支按顺序重新定基，从中继向上。

如果已合并分支的拉取请求，则存储库会自动切换到 `--onto` 模式，以在合并目标顶部正确重播提交。

如果发生重新数据库冲突，该操作将暂停并打印带行号的冲突文件。 解决冲突，暂存冲突 `git add`，然后继续 `--continue`。 若要撤消整个存储库，请使用 `--abort` 该存储库将所有分支还原到其重新数据库之前的状态。

| Flag                              | 说明                                          |
| --------------------------------- | ------------------------------------------- |
| `--downstack`                     | 仅将分支从中继重新设置为当前分支                            |
| `--upstack`                       | 仅将当前分支中的分支重新设置为顶部                           |
| `--no-trunk`                      | 跳过中继。 仅将堆栈分支重新置于彼此上，没有提取，也没有中继重新基。          |
| `--continue`                      | 解决冲突后继续重定基                                  |
| `--abort`                         | 中止重新数据库并将所有分支还原到其重新数据库之前的状态                 |
| `--remote <name>`                 | 从远程提取（默认为自动检测到的远程）                          |
| `--committer-date-is-author-date` | 将提交者日期设置为存储库中的作者日期。 别名： `--preserve-dates`. |

| 论点         | 说明            |
| ---------- | ------------- |
| `[branch]` | 目标分支（默认为当前分支） |

**例子：**

```shell
# Rebase the entire stack
gh stack rebase

# Only rebase branches below the current one
gh stack rebase --downstack

# Only rebase branches above the current one
gh stack rebase --upstack

# Rebase stack branches without pulling from or rebasing with trunk
gh stack rebase --no-trunk

# After resolving a conflict
gh stack rebase --continue

# Abort rebase and restore everything
gh stack rebase --abort

# Rebase and preserve committer date as author date
gh stack rebase --committer-date-is-author-date
```

### `gh stack push`

将当前堆栈中的活动分支推送到远程。

```shell
gh stack push [flags]
```

使用显式每分支检查在单个 `git push`分支中推送每个活动分支（不包括合并分支和排队分支 `--force-with-lease` ）。 更新不是原子的。 即使拒绝了另一个分支，其租约传递也可以更新的分支。 修复已拒绝的分支，并再次运行该命令。 已更新的分支保持不变。 此命令不创建或更新拉取请求。 用于该用途 `gh stack submit` 。

| Flag              | 说明                  |
| ----------------- | ------------------- |
| `--remote <name>` | 远程推送到 （默认为自动检测到的远程） |

**例子：**

```shell
gh stack push
gh stack push --remote upstream
```

### `gh stack link`

在不进行本地跟踪的情况下将拉取请求链接到堆栈 GitHub 中。

```shell
gh stack link [flags] <stack-number | branch-or-pr> <branch-or-pr> [...]
```

从分支名称或拉取请求编号和 URL 创建 GitHub 或更新堆栈。 此命令不会创建或修改任何本地跟踪状态。 它专为在本地使用其他工具（如 Jujutsu、Sapling 或 git-town）管理分支的人员而设计，并希望打开一堆拉取请求。 请参阅“[将其他工具与堆积拉取请求配合使用](/zh/pull-requests/reference/use-other-tools-with-stacked-pull-requests)”。

按堆栈顺序提供自变量，从下到上。 在创建或查找拉取请求之前，分支参数会自动推送到远程。 对于已打开拉取请求的分支，将使用这些拉取请求。 对于没有拉取请求的分支，使用正确的基分支链自动创建新的拉取请求。 基本分支与预期链不匹配的现有拉取请求会自动更正。

如果拉取请求尚不在堆栈中，则会创建一个新堆栈。 如果某些拉取请求已在堆栈中，则会更新现有堆栈以包含新的拉取请求。 现有拉取请求永远不会从堆栈中删除，因为更新仅累加。

若要增大现有堆栈而不再次列出其拉取请求，请传递堆栈编号（堆栈 UI GitHub中显示的数字）作为第一个参数。 其余参数将追加到该堆栈的顶部。 跳过堆栈中已有的参数，而属于不同堆栈的参数将被拒绝。 由于堆栈和拉取请求编号永远不会重叠，因此仅当数字第一个参数与现有堆栈匹配时，才会将其视为堆栈。 否则，它被视为拉取请求或分支。

| Flag              | 说明                                      |
| ----------------- | --------------------------------------- |
| `--base <branch>` | 堆栈底部的基分支（默认为存储库的默认分支）。 添加到现有堆栈时，将忽略此标志。 |
| `--open`          | 将新的拉取请求和现有拉取请求标记为准备好进行评审                |
| `--remote <name>` | 远程推送到 （默认为自动检测到的远程）                     |

**例子：**

```shell
# Link branches into a stack (pushes, creates pull requests, creates stack)
gh stack link feature-auth feature-api feature-ui

# Link existing pull requests by number
gh stack link 10 20 30

# Link existing pull requests by URL
gh stack link https://github.com/owner/repo/pull/10 https://github.com/owner/repo/pull/20

# Add branches to an existing stack of pull requests
gh stack link 42 43 feature-auth feature-ui

# Append to the top of an existing stack by its stack number, with no need
# to list the pull requests already in stack 7 again
gh stack link 7 48 feature-ui

# Use a different base branch and mark pull requests as ready for review
gh stack link --base develop --open feat-a feat-b feat-c
```

### `gh stack merge`

一次合并一个或多个堆积拉取请求。

```shell
gh stack merge [<stack-number> | <pr-number>]
```

将堆栈中的每个拉取请求（最多包括所选拉取请求）合并到基分支中。 合并是一项全无操作。 如果无法合并任何拉取请求，则不会合并其中任何请求。

在没有参数的情况下，该命令使用活动本地堆栈。 提供堆栈号以合并未签出的堆栈，这是纯粹的远程操作，或者提供直接合并到该拉取请求的拉取请求编号。

在交互式终端中，命令提示符你选择要合并的拉取请求、选取合并方法并确认。 在非交互式终端中，或者使用 `--yes`时，整个堆栈或你指定的拉取请求的所有内容都将被合并，而不提示，除非你指定了一个。

合并之前仅检查基本拉取请求状态。 每个拉取请求都必须处于打开状态，并且不得为草稿。
GitHub 评估合并运行时的分支保护和存储库规则，并将任何故障报告回你。

> \[!NOTE]
> 合并堆积拉取请求时，不能绕过合并要求。

如果基分支使用合并队列，则会将堆栈添加到队列中，而不是直接合并。 队列选择合并方法，因此提示将跳过合并方法步骤，并且`--merge-method``--squash`将忽略带有警告的 、、`--rebase`和`--merge`标志。 选择的拉取请求将一起添加到队列中，但随着队列处理请求而合并，因此它们可以一次性登陆单独的组而不是全部。

| Flag                            | 说明                                  |
| ------------------------------- | ----------------------------------- |
| `--merge-method <method>`       | 要使用的合并方法：`merge`、或 `squash``rebase` |
| `--merge`、`--squash`、`--rebase` | 对应合并方法的简写                           |
| `-y, --yes`                     | 合并而不提示确认                            |

**例子：**

```shell
# Merge the current stack, choosing pull requests interactively
gh stack merge

# Merge a stack you do not have checked out, by stack number
gh stack merge 7

# Merge everything up to and including pull request 42
gh stack merge 42

# Merge the whole current stack without prompting, squashing commits
gh stack merge --yes --squash
```

## Navigation

导航命令可在当前堆栈中的分支之间移动，而无需记住分支名称。 堆栈底部是离中继最近的分支，顶部是离它最远的分支。
`up` 离开中继，朝 `down` 它移动。

所有导航命令都固定到堆栈边界。 从顶部或从底部向上移动，不执行任何操作并显示消息。

### `gh stack switch`

以交互方式切换到堆栈中的另一个分支。

```shell
gh stack switch
```

显示一个交互式选取器，其中列出当前堆栈中的所有分支，从顶部排序，从干线到底部，最靠近中继的位置编号。 选择一个分支以签出它。

此命令需要交互式终端。

**例子：**

```shell
gh stack switch
#    → Select a branch in the stack to switch to
#      5. frontend
#      4. api-endpoints
#      3. auth-layer
#      2. db-schema
#      1. config-setup
```

### `gh stack up`

向上移动到堆栈顶部，远离中继。

```shell
gh stack up [n]
```

向上 `n` 移动分支，默认为 1。 如果位于中继分支上， `up` 请移动到第一个堆栈分支。

**例子：**

```shell
# Move up one layer
gh stack up

# Move up three layers
gh stack up 3
```

### `gh stack down`

向堆栈底部向下移动，向中继移动。

```shell
gh stack down [n]
```

向下 `n` 移动分支，默认为 1。

**例子：**

```shell
# Move down one layer
gh stack down

# Move down two layers
gh stack down 2
```

### `gh stack top`

跳到堆栈的顶部。

```shell
gh stack top
```

检查树干最远的分支。

### `gh stack bottom`

跳到堆栈底部。

```shell
gh stack bottom
```

检查离中继最近的分支。

### `gh stack trunk`

跳到中继分支。

```shell
gh stack trunk
```

检查当前堆栈的中继分支，例如 `main`。 你必须位于属于堆栈的分支上。

## Utilities

### `gh stack alias`

创建短命令别名，以便可以少键入。

```shell
gh stack alias [flags] [name]
```

将小包装器脚本安装到 `~/.local/bin/` 该脚本中，将所有参数转发到 `gh stack`。 默认别名为 `gs`，但可以通过将其作为参数传递来选择任何名称。 安装后，可以运行 `gs push` 而不是 `gh stack push`。

在Windows，不支持自动创建别名。 该命令输出有关创建批处理文件或 PowerShell 函数的手动说明。

| Flag       | 说明        |
| ---------- | --------- |
| `--remove` | 删除之前创建的别名 |

**例子：**

```shell
# Create the default alias (gs), so that "gs push" and "gs view" both work
gh stack alias

# Create a custom alias
gh stack alias gst

# Remove an alias
gh stack alias --remove
gh stack alias --remove gst
```

### `gh stack feedback`

共享有关扩展的 `gh stack` 反馈。

```shell
gh stack feedback [title]
```

在 [gh-stack 存储库](https://github.com/github/gh-stack) 中打开讨论，以便提交反馈。 可以选择为讨论文章提供标题。

**例子：**

```shell
gh stack feedback
gh stack feedback "Support for reordering branches"
```

## 环境变量

| 变量                        | 值                                                                                                                  | 说明 |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------ | -- |
| `GH_STACK_THEME`          |                                                                                                                    |    |
| `auto`（默认）、`light`、`dark` | 控制交互式屏幕`submit``modify``view`的调色板以及所有彩色命令输出。 颜色自动适应终端背景。 将此变量设置为在终端不报告其背景时强制使用浅色或深色调色板，这可能会在某些 SSH 或 `tmux` 设置中发生。 |    |

```shell
# Force the light palette for one command
GH_STACK_THEME=light gh stack view
```

## 退出代码

| Code          | Meaning           |
| ------------- | ----------------- |
| 0             | 成功                |
| 1             | 常规错误              |
| 2             | 不在堆栈中，或找不到堆栈      |
| 3             | 重新定基冲突            |
| 4             |                   |
| GitHub API 失败 |                   |
| 5             | 参数或标志无效           |
| 6             | 需要消除歧义，因为分支属于多个堆栈 |
| 7             | 已在进行中重新定基         |
| 8             | 堆栈被另一个进程锁定        |
| 9             | 未为此存储库启用堆积拉取请求    |
| 10            | 修改会话中断，需要恢复       |

## 延伸阅读

* [堆积拉取请求](/zh/pull-requests/reference/stacked-pull-requests)
* [创建堆积拉取请求](/zh/pull-requests/how-tos/create-pull-requests/creating-stacked-pull-requests)
* [管理堆积拉取请求](/zh/pull-requests/how-tos/create-pull-requests/managing-stacked-pull-requests)
* [排查堆积拉取请求问题](/zh/pull-requests/how-tos/merge-and-close-pull-requests/troubleshooting-stacked-pull-requests)