# プル要求でのコード変更のスタック

迅速に確認できる小規模な依存プル要求のスタックを作成します。

> \[!NOTE] この機能はパブリック プレビュー段階であり、変更される可能性があります。

大量のプル要求は、特に短時間で大量のコードを生成する場合に、ボトルネックを確認して作成するのが困難です。 pull request サイズが大きくなると、レビューの品質も低下します。 レビュー担当者は、結果、ミスの問題、または先延ばしを回避し、古くなりマージ競合が発生するまで pull request を残すことができます。

スタック プル要求では、大きなコード変更をレビュー可能な状態に保ちます。

スタックは、同じリポジトリ内の一連のプル要求です。各プル要求は、その下のプル要求のブランチを対象とし、1 つのブランチ (通常はメイン ブランチ) に配置される順序付きチェーンを形成します。 1 つの大きなプル要求の代わりに、一連の小さなプル要求を取得します。 各プル要求には独自のフォーカスされた差分があるため、チームメイトは各レイヤーを個別に確認して承認できます。

このチュートリアルでは、スタックプル要求を使用して、個別にレビュー可能なレイヤーにフィーチャを構築する方法について説明します。 この例では、アプリにユーザー認証を追加する方法を検討します。
GitHub CLIでは、`gh stack`拡張機能を使用します。

## Prerequisites

このチュートリアルに従うには、 GitHub CLI と `gh stack` 拡張機能をインストールする必要があります。 以下のものが必要です。

* GitHub CLI (`gh`) 2.90.0 以降、および Git 2.20 以降。
  * GitHub CLIを使用して`gh auth login`を認証します。
* プッシュできる GitHub リポジトリ。

GitHub CLIで、`gh stack`拡張機能をインストールします。

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

## 1. コードを生成する前にスタックを設計する

良いスタックは家を建てのようなものです:強い基盤から始め、壁をフレームに取り付け、配線を取り付け、その後、ドライウォールを終了します。 各レイヤーは、以下のものに依存して構築されます。 最終的に、レビュー担当者は、下から上にプル要求を読み取り、機能の開発に従うことができる必要があります。

* フィーチャをレイヤーに分割します。 各レイヤーは、単独で確認できる単一の一貫性のある変更である必要があります。
  * 各レイヤーは、プル要求が簡単に読み取れるほど小さくします。 レイヤーがレビューに長い説明が必要だと感じる場合は、おそらく大きすぎる可能性があります。
  * 境界を自分で決定します。 スタックの形状を所有している。
* 依存関係別にレイヤーを並べ替える。 基本的な変更は下部に表示されます。 それらに依存するものは、より高くなります。 認証の場合、次のようになります。
  * レイヤー 1: データ モデルと移行
  * レイヤー 2: CRUD エンドポイント
  * レイヤー 3: JWT ミドルウェアとガード
  * レイヤー 4: 統合テストと単体テスト

## 2. 最初に下部レイヤーを構築する

基盤を使用してスタックを開始します。 上記のすべては、このレイヤーを正しく取得することに依存します。

* スタックを作成し、プランに基づいて最初のレイヤーを構築します。
  `gh stack init BRANCH-NAME-1`で作成し、プレフィックスを使用してブランチ名を整理することを検討してください。
* 次に進む前に、自分で変更を確認してください。 下位レイヤーの間違いは、その上のすべてのブランチに反映されるため、次に進む前にレビューを行ってください。

## 3. 新しい各コード レイヤーを上に積み重ねる

基盤を整えた状態で、フィーチャの残りの部分を一度に 1 レイヤーずつ構築します。

* 次のレイヤーを追加し、以下のレイヤーのコンテキストで実装します。
  `gh stack add BRANCH-NAME-NEXT`を使用してスタックの一番上に分岐を追加し、そこで作業をコミットします。
* レイヤーが大きくなりすぎる場合は、プランの外側にドリフトしたか、1 つではなく 2 つのレイヤーが実際に必要かどうかを検討します。
* レイヤーごとに新しいブランチを作成し、すべてのブランチがクリーンで自己完結型の差分を維持するようにします。
* pull request を作成する準備ができたら、 `gh stack submit`を使用してスタックを送信します。
* 各プル要求を単独で実行します。 通常は、重点を置いたタイトルと、レイヤーの簡潔でわかりやすい説明で十分です。

## 4. レビューを依頼する前に pull request を自分で確認する

各レイヤーは小さく、自己レビューも簡単になります。 チームメイトを巻き込む前に、すべてのブランチにパスを渡します。 レビュー担当者は、既に信頼している変更を受け取る必要があります。

* レビューを要求する前に、各ブランチでテスト、リンター、コード スキャンを実行して、各レイヤーを標準に照らしてチェックします。

## 5. スタックのレビューを一番下から要求する

レイヤーを構築すると、校閲者はコードの大きな壁ではなく、小さな差分を取得します。

* 依存関係が厳密に統合されている場合は、スタックの下部からレビューを依頼して、後続のレビューの前に変更をスタックに統合できるようにします。
* 異なるレイヤーの個別のユーザーからのレビューが必要な場合は、レビュー担当者が並行して作業できます。 1 人のユーザーがデータ モデルを確認でき、別のユーザーがエンドポイントを確認し、機能全体を確認して作業を行う必要はありません。

## 6. フィードバックを反復処理する

フィードバックは、機能全体ではなく、レイヤーに個別に反映されます。 スタックを使用すると、適切なレイヤーを所定の位置に固定し、変更を上に移動できます。

* レビュー担当者がフラグを付けたレイヤーを修正します。 右側のブランチに移動し、変更を加えて、そこでコミットします。
* 各修正は、それが属するレイヤーに保持します。 間違ったブランチで行われた変更により、エラーが混乱し、エラーが発生する可能性があります。
* `gh stack down`、`gh stack up`、または`gh stack checkout BRANCH-NAME`を使用してブランチ間を移動します。 次に、変更をコミットし、 `gh stack rebase --upstack` を実行して上記のブランチをリベースし、 `gh stack push` して変更をスタックに反映します。

## 7. 下のレイヤーから結合する

スタックは、メイン ブランチを指すレイヤーから順にマージされます。 レイヤーを一度に 1 つずつマージし、GitHub自動的にメインをポイントするように次のレイヤーを再ターゲットします。

* スタックを一度に 1 つずつ、またはスタック内の任意の場所からマージすると、マージするプル要求の下にあるすべてのブランチが一番下からマージされます。
* 各レイヤーの差分は親に対してまったく同じままで、基本の変更のみであるため、進行中の作業やレビューに影響を与えることなく、一度にレイヤーを簡単にマージできます。
* マージ キューを使用して、各レイヤーが承認され、そのチェックが成功した後に順番にマージされるようにします。 スタック全体を一度に待機する必要はありません。

最上位レイヤーがマージされると、フィーチャ全体が着陸します。 すべての部分は、1 つの大きなプル要求ではなく、小さな意図的な変更としてより効果的にレビューされました。

## 詳細については、次を参照してください。

* [積み上げプル要求について](/ja/enterprise-cloud@latest/pull-requests/get-started/about-stacked-prs)
* [スタックされたプル要求の管理](/ja/enterprise-cloud@latest/pull-requests/how-tos/create-pull-requests/managing-stacked-pull-requests)
* [Stacked pull requests CLI コマンド](/ja/enterprise-cloud@latest/pull-requests/reference/stacked-prs-cli-commands)