はじめに
チーム開発において、コードの品質を維持しながら効率的に変更を統合するには「Pull Request(プルリクエスト)」の活用が欠かせません。Pull Requestは単なるマージの仕組みではなく、コードレビューを通じてチームの知識共有や品質向上を実現する重要なコラボレーション機能です。
本記事では、GitHub Pull Requestの作成から効果的なPR説明文の書き方、コードレビューの進め方、レビューコメントへの対応方法、そしてMerge・Squash・Rebaseの3つのマージ方法の使い分けまでを体系的に解説します。この記事を読み終えると、以下のことができるようになります。
- Pull Requestの作成手順を理解し、適切なPRを作成できる
- 効果的なPR説明文(タイトル・本文)を書ける
- コードレビューを効率的に進められる
- レビューコメントへ適切に対応できる
- Merge・Squash・Rebaseの違いを理解し、状況に応じて選択できる
実行環境と前提条件
本記事の内容は、以下の環境で動作確認を行っています。
| 項目 | 要件 |
|---|---|
| Git | 2.40以上 |
| OS | Windows 10/11、macOS 12以上、Ubuntu 22.04以上 |
| ターミナル | コマンドプロンプト、PowerShell、Terminal.app、bash等 |
| エディタ | VS Code推奨 |
前提条件として、以下の知識があることを想定しています。
- コマンドライン操作の基礎知識(
cd、ls/dir、mkdir等) - テキストエディタの基本操作
- Gitの基本コマンド(
git init、git add、git commit、git log)の理解 - ブランチ操作(
git branch、git switch、git merge)の理解 - GitHubアカウントの作成とリモートリポジトリへのpush経験
Gitのバージョンは以下のコマンドで確認できます。
|
|
Pull Requestとは
Pull Requestの基本概念
Pull Request(PR)とは、GitHubなどのホスティングサービスが提供する機能で、ブランチの変更内容をベースブランチに統合する「提案」を行う仕組みです。PRを作成すると、変更内容の差分が可視化され、チームメンバーがレビューやコメントを行えるようになります。
gitGraph commit id: "m1" branch feature-branch commit id: "コミットA" commit id: "コミットB" commit id: "コミットC" tag: "PR作成" checkout main merge feature-branch id: "m2" tag: "レビュー承認後マージ"
Pull Requestの主な役割は以下のとおりです。
- 変更内容の可視化: 差分を一覧で確認できる
- コードレビュー: チームメンバーがコードを確認し、フィードバックを提供できる
- 議論の場: 実装方針や設計について議論できる
- 品質ゲート: マージ前に承認を必須にすることで品質を担保できる
- 履歴の記録: なぜその変更が行われたかを後から追跡できる
PRを使ったチーム開発ワークフロー
一般的なPRを使った開発ワークフローは以下のようになります。
- mainブランチから作業用ブランチを作成
- ブランチ上で機能開発・バグ修正を行う
- 変更をリモートリポジトリにpush
- GitHub上でPull Requestを作成
- チームメンバーがコードレビューを実施
- 必要に応じて修正を行い、再度push
- レビュー承認後、mainブランチにマージ
- 作業ブランチを削除
Pull Requestの作成手順
ステップ1: 作業ブランチの作成とコミット
まず、mainブランチから作業用のブランチを作成します。
|
|
作業ブランチ上で必要な変更を行い、コミットします。
|
|
ステップ2: リモートリポジトリへのpush
作業ブランチをリモートリポジトリにpushします。
|
|
実行結果の例:
|
|
push完了時に表示されるURLからPRを作成できます。
ステップ3: GitHub上でPull Requestを作成
GitHubのリポジトリページにアクセスすると、pushしたブランチに対して「Compare & pull request」ボタンが表示されます。このボタンをクリックするか、「Pull requests」タブから「New pull request」を選択してPRを作成します。
PR作成画面では、以下の項目を設定します。
| 項目 | 説明 |
|---|---|
| base | マージ先のブランチ(通常はmain) |
| compare | マージ元のブランチ(作成した作業ブランチ) |
| Title | PRのタイトル |
| Description | PRの説明文 |
| Reviewers | レビューを依頼するメンバー |
| Assignees | 担当者 |
| Labels | 分類用のラベル(feature、bugfix等) |
効果的なPR説明文の書き方
PRタイトルのベストプラクティス
PRタイトルは、変更内容を一目で理解できるように簡潔かつ具体的に記述します。
良いタイトルの例:
|
|
避けるべきタイトルの例:
|
|
Conventional Commitsの形式(type: description)を採用すると、変更の種類が明確になり、変更履歴の自動生成にも役立ちます。
PR説明文のテンプレート
PR説明文には、以下の情報を含めることを推奨します。
|
|
GitHubでは、リポジトリの.github/PULL_REQUEST_TEMPLATE.mdにテンプレートを配置すると、PR作成時に自動的にテンプレートが適用されます。
IssueとPRの連携
PR説明文に特定のキーワードとIssue番号を記載すると、PRがマージされた際に関連Issueを自動的にクローズできます。
|
|
使用できるキーワードは以下のとおりです。
close、closes、closedfix、fixes、fixedresolve、resolves、resolved
ドラフトPull Requestの活用
ドラフトPRとは
作業途中でフィードバックを得たい場合や、実装方針を共有したい場合は「ドラフトPull Request」を活用します。ドラフトPRは以下の特徴を持ちます。
- マージボタンが無効化される
- CODEOWNERSによる自動レビューリクエストが発生しない
- 「Draft」ラベルが表示され、作業中であることが明示される
ドラフトPRの作成方法
PR作成画面で「Create pull request」ボタンの横にあるドロップダウンから「Create draft pull request」を選択します。
作業が完了したら、PRページの「Ready for review」ボタンをクリックして通常のPRに変換します。これにより、レビュアーへの通知が送信され、正式なレビューを依頼できます。
コードレビューの進め方
レビュアーとしてのコードレビュー
PR画面の「Files changed」タブで変更内容を確認します。特定の行にコメントを追加するには、行番号の左側にある「+」アイコンをクリックします。
コメントには以下の種類があります。
| 種類 | 説明 | 使用場面 |
|---|---|---|
| 単一コメント | 即座に投稿される個別コメント | 簡単な質問や確認 |
| レビューコメント | レビュー送信時にまとめて投稿 | 複数箇所へのフィードバック |
| Suggested changes | コード修正の提案 | 具体的な修正案がある場合 |
Suggested changesの活用
レビュー中に具体的な修正案がある場合は、Suggested changesを使用すると効果的です。コメント欄のツールバーにある「Suggest changes」アイコンをクリックし、以下の形式で記述します。
|
|
PR作成者は、この提案を「Commit suggestion」ボタンで直接適用できます。複数の提案をまとめて適用する「Batch changes」機能も利用可能です。
レビューの送信
レビューが完了したら、「Review changes」ボタンからレビュー結果を送信します。送信時には以下の3つのオプションから選択します。
| オプション | 説明 | 使用場面 |
|---|---|---|
| Comment | コメントのみ | 承認や変更要求なしにフィードバックを共有 |
| Approve | 承認 | 変更内容に問題がなく、マージ可能と判断した場合 |
| Request changes | 変更要求 | マージ前に修正が必要と判断した場合 |
効果的なレビューコメントの書き方
良いレビューコメントは、問題点の指摘だけでなく、改善案や理由を含めます。
避けるべきコメント例:
|
|
推奨されるコメント例:
|
|
レビューコメントへの対応
コメントへの返信と修正
レビューコメントを受け取ったら、以下の手順で対応します。
- コメントを確認: 指摘内容を理解する
- 対応方針を決定: 修正する、議論する、対応不要と判断する
- 修正をコミット: 必要な修正を行い、同じブランチにpush
- コメントに返信: 対応内容を返信し、「Resolve conversation」でスレッドを解決
|
|
pushすると、PRに新しいコミットが追加され、レビュアーに通知されます。
Re-requestレビュー
修正が完了したら、レビュアーに再レビューを依頼します。PRページの「Reviewers」セクションで、レビュアーのアイコン横にある「Re-request review」ボタンをクリックします。
マージ方法の選択
GitHub Pull Requestでは、3つのマージ方法が提供されています。プロジェクトの運用方針や状況に応じて適切な方法を選択することが重要です。
Create a merge commit(通常のマージ)
すべてのコミットを保持し、マージコミットを作成してベースブランチに統合します。
|
|
特徴:
- すべてのコミット履歴が保持される
- マージコミットにより、統合ポイントが明確になる
- 誰がいつマージしたかが記録される
- 履歴が複雑になりやすい
使用場面:
- チームの開発履歴を完全に保持したい場合
- 各コミットの文脈が重要な場合
- Git Flowなどの戦略で明示的なマージポイントが必要な場合
Squash and merge(スカッシュマージ)
PRのすべてのコミットを1つのコミットにまとめてベースブランチに統合します。
|
|
特徴:
- 複数のコミットが1つにまとまる
- mainブランチの履歴がシンプルになる
- 作業中の細かいコミット(typo修正、WIP等)が非表示になる
- 個々のコミット履歴は失われる
使用場面:
- mainブランチの履歴をクリーンに保ちたい場合
- 作業中の細かいコミットを隠したい場合
- 1つの機能・修正を1コミットとして記録したい場合
注意点:
長期間運用するブランチでSquash mergeを繰り返すと、コンフリクトが発生しやすくなります。これは、元のコミットとスカッシュされたコミットが別物として扱われるためです。
Rebase and merge(リベースマージ)
PRのコミットをベースブランチの先頭にリベースし、マージコミットなしで統合します。
|
|
特徴:
- 線形の履歴が維持される
- マージコミットが作成されない
- 各コミットが個別に保持される(コミットハッシュは変更される)
- コンフリクトがある場合は使用できない
使用場面:
- 線形の履歴を維持したい場合
- 各コミットを個別に保持しつつ、履歴をクリーンにしたい場合
- Trunk Based Developmentを採用している場合
3つのマージ方法の比較
| 項目 | Merge | Squash | Rebase |
|---|---|---|---|
| コミット履歴 | すべて保持 | 1つにまとめる | 個別に保持(SHA変更) |
| マージコミット | 作成される | 作成されない | 作成されない |
| 履歴の見た目 | 分岐・合流あり | 線形 | 線形 |
| 個々のコミット追跡 | 可能 | 不可 | 可能(SHA変更) |
| コンフリクト時 | マージ可能 | マージ可能 | マージ不可 |
リポジトリ設定でのマージ方法制限
リポジトリの管理者は、許可するマージ方法を制限できます。「Settings」→「General」→「Pull Requests」セクションで、以下のオプションを設定できます。
- Allow merge commits
- Allow squash merging
- Allow rebase merging
チームで統一した運用を行う場合は、許可するマージ方法を限定することを推奨します。
Pull Requestマージ後の作業
マージ後のブランチ削除
PRがマージされたら、不要になった作業ブランチを削除します。
GitHub上での削除:
PRがマージされると「Delete branch」ボタンが表示されます。このボタンをクリックしてリモートブランチを削除します。
ローカルブランチの削除:
|
|
実行結果の例:
|
|
自動ブランチ削除の設定
リポジトリ設定で「Automatically delete head branches」を有効にすると、PRマージ時にブランチが自動削除されます。「Settings」→「General」→「Pull Requests」セクションで設定できます。
Pull Requestのベストプラクティス
PRのサイズを適切に保つ
大きすぎるPRはレビューが困難になり、品質低下の原因となります。以下の目安を参考にしてください。
- 変更ファイル数: 10ファイル以下が望ましい
- 変更行数: 400行以下が望ましい
- レビュー時間: 30分以内でレビュー可能なサイズ
大きな機能は複数のPRに分割し、段階的にマージすることを推奨します。
セルフレビューの実施
PRを作成する前に、自分自身でコードをレビューします。「Files changed」タブで差分を確認し、以下の点をチェックします。
- 意図しない変更が含まれていないか
- デバッグコードが残っていないか
- コメントやドキュメントが適切か
- テストが追加・更新されているか
CIチェックの確認
PRを作成すると、設定されているCI(継続的インテグレーション)が自動実行されます。「Checks」タブでテストやビルドの結果を確認し、すべてのチェックがパスしてからレビューを依頼します。
コンフリクトの早期解消
PRがベースブランチとコンフリクトしている場合は、早めに解消します。
|
|
または、rebaseを使用する方法もあります。
|
|
トラブルシューティング
PRがマージできない場合
PRがマージできない主な原因と対処法を示します。
| 原因 | 対処法 |
|---|---|
| コンフリクトが発生している | ベースブランチをマージまたはリベースしてコンフリクトを解消 |
| 必須のレビュー承認がない | レビュアーに承認を依頼 |
| CIチェックが失敗している | テストを修正してpush |
| ブランチ保護ルールに違反 | ルールの条件を満たすよう対応 |
誤ってマージした場合
誤ってPRをマージした場合は、「Revert」ボタンで取り消しPRを作成できます。PRページの下部にある「Revert」ボタンをクリックすると、マージを打ち消す新しいPRが自動作成されます。
まとめ
GitHub Pull Requestは、チーム開発における品質向上と知識共有の要となる機能です。本記事で解説した内容を振り返ります。
- PR作成: ブランチを作成し、変更をpushしてPRを作成する
- 説明文: 具体的なタイトルと、テンプレートに沿った説明文を記述する
- レビュー: Suggested changesを活用し、建設的なフィードバックを行う
- 対応: レビューコメントに対応し、スレッドを解決して再レビューを依頼する
- マージ: Merge・Squash・Rebaseの特徴を理解し、状況に応じて選択する
これらのプラクティスを実践することで、チーム全体のコード品質と開発効率を向上させることができます。