GitHubでのチーム開発 — Pull Requestとマージ戦略
ここまでの章で、Git単体の使い方は一通り学んできました。最終章では、実際のチーム開発でどういうフローで作業が進むのかを見ていきます。
GitHubでのチーム開発は、Pull Request を軸にしたレビュー文化が中心です。この仕組みが分かれば、どの現場に入っても通用します。
全体の流れ
標準的なチーム開発のフローは以下のような形です。
この流れをGitHub Flow と呼びます。もっと複雑なフロー(Git Flow、GitLab Flow など)もありますが、今の主流はこのシンプルなGitHub Flowです。
Pull Request とは
Pull Request(PR) は、「自分のブランチの変更をmainに取り込んでほしい」という依頼です。
PRを作ると、GitHub上に以下のような画面が生まれます。
- 変更されたファイルの差分
- コミット履歴
- レビューコメントのスレッド
- マージボタン
- CI(自動テスト)の結果
レビュアーはこの画面で変更内容を確認し、コメントや修正依頼を返します。承認されたらマージボタンでmainに取り込む、という流れです。
PRを作る手順
1. ブランチを切って作業する
git switch main
git pull
git switch -c feature/user-login
# ... 作業 ...
git add .
git commit -m "feat: ユーザーログイン機能を追加"2. リモートにpush
git push -u origin feature/user-loginpush後、ターミナルに以下のようなURLが表示されます。
remote: Create a pull request for 'feature/user-login' on GitHub by visiting:
remote: https://github.com/username/repo/pull/new/feature/user-login
このURLをブラウザで開くとPR作成画面になります。
3. PRの本文を書く
PRのタイトルと本文はレビュアーの時間を節約するための情報です。最低限以下を書きます。
- 何を変えたか
- なぜその変更が必要か
- どう動作確認したか
- スクリーンショット(UI変更の場合)
多くのチームではPRテンプレートを用意しています。リポジトリに .github/pull_request_template.md があれば、PR作成時に自動で本文に展開されます。
4. レビュアーをアサインして依頼
右サイドバーの Reviewers で、レビューしてもらう人を指定します。チームのルールによっては、特定のファイルは特定の人のレビューが必須といった設定(CODEOWNERS)がされています。
レビューを受ける・返す
レビューされる側
コメントが付いたら、以下のような対応をします。
- 指摘内容を理解する — 不明なら質問する、曖昧なまま修正しない
- 修正する or 議論する — 納得できないなら意見を書いてよい
- 修正したらpush — PRには自動で反映される
- 返信する — 「修正しました」「これはこういう意図です」など
PRブランチに追加で git push すると、PRの差分が自動更新されます。コミットは溜めっぱなしで大丈夫(最終的にマージ時にまとめることもできる)。
レビューする側
レビューはバグ探しだけではなく、設計・可読性・テスト・ドキュメントまで広く見ます。
- 指摘は具体的に、コード行にコメントを付ける
- 褒める点も書く(
LGTM、Nice!) - 修正必須と改善提案を区別する(
[must]、[nits]のような接頭辞を使う慣習も) - 質問で気づきを促すスタイルも有効(
このケースはどうなりますか?)
GitHubのレビュー機能には以下の3段階があります。
| 種類 | 用途 |
|---|---|
| Comment | ただコメントするだけ |
| Approve | 承認 |
| Request changes | 修正が必要 |
マージ戦略 — 3つの選択肢
PRを承認したあと、mainにマージするときは3つの方式から選べます。
Create a merge commit(通常マージ)
git merge と同じで、マージコミットを作って統合します。
- メリット — PRのコミット履歴がすべて残る、「いつマージしたか」が明確
- デメリット — マージコミットが増えて履歴が複雑になる
Squash and merge(スカッシュマージ)
PRの全コミットを1つにまとめてmainに追加する方式です。
- メリット — mainの履歴が1 PR = 1コミットで綺麗
- デメリット — PR内の細かいコミット履歴は失われる
多くのチームがこの方式を採用しています。個々のPRがmainから見て1つの意味のある変更単位になるため、履歴が読みやすくなります。
Rebase and merge(リベースマージ)
PRの各コミットを1つずつmainの先端に積み重ねる方式です。マージコミットは作られません。
- メリット — 履歴が一直線、各コミットが独立して残る
- デメリット — PRの「塊」が分かりづらくなる、コミットが綺麗に整理されていないと履歴が汚れる
どれを選ぶべきか
| チームの特徴 | 推奨 |
|---|---|
| 履歴を綺麗にしたい、1PR=1機能で管理したい | Squash |
| PRの詳細履歴を残したい、大規模な変更が多い | Merge commit |
| コミット1つ1つに意味がある、厳密に履歴を管理したい | Rebase |
迷ったらSquash、で問題ありません。
CIとの連携
最近のGitHubリポジトリは、PRを作ると自動でテストやLintが走るのが普通です。これを CI(Continuous Integration)と呼びます。
GitHub Actionsを使う場合、.github/workflows/ にYAMLファイルを置くと、以下のようなチェックが自動実行されます。
- 自動テスト(
npm testなど) - Lintチェック(
eslint、prettier) - ビルドが通るか
- TypeScriptの型チェック
PR画面には各チェックの結果が表示され、すべて通らないとマージできない設定にもできます。CIが落ちているPRはマージしないのがルールです。
ブランチ保護ルール
GitHubのリポジトリ設定で、mainブランチへの直接pushを禁止することができます。
mainへの直接pushを禁止- PRを経由しないとマージできない
- 最低1人のレビュー承認が必須
- CIが通らないとマージ不可
この設定が入っていれば、事故でmainを壊すことは起こりにくくなります。チームで開発するリポジトリではほぼ必須の設定です。
マージ後の後片付け
PRがマージされたら、作業ブランチは不要になります。
リモートブランチの削除
GitHubのPR画面に Delete branch ボタンが表示されるので、クリックすればリモートのブランチが削除されます。
ローカルブランチの削除
ローカル側も手動で削除します。
git switch main
git pull
git branch -d feature/user-login大文字の -D は強制削除なので、普段は小文字の -d を使ってください。未マージのブランチが残っていたら -d が教えてくれます。
一括削除したい場合
マージ済みのブランチをまとめて削除するワンライナー:
git branch --merged | grep -v "main" | xargs git branch -dよくあるハマりどころ
1. PRを出したあとにmainが進んだ
mainの最新を取り込む必要があります。rebaseかmergeで取り込めますが、チームの方針に従ってください。
git switch feature/my-work
git fetch origin
git rebase origin/main
git push --force-with-lease2. レビューの指摘がいっぱい、気持ちが折れる
レビューはコードを否定しているのではなく、コードを良くするための共同作業です。指摘が多いのは、それだけ丁寧に見てくれている証拠。淡々と修正していきましょう。
3. PRが大きくなりすぎてレビューされない
レビュアーは大きすぎるPRを嫌います。1 PR = 1つの目的になるように、作業を分けてPRを作るのが基本です。理想は数百行以内、最大でも1000行を目安に。
4. コンフリクトしてマージできない
PR画面で「This branch has conflicts」と表示されたら、ローカルでmainを取り込んで解決します。
git switch feature/my-work
git fetch origin
git merge origin/main
# コンフリクト解決
git pushちゃんと使うためのポイント
- チーム開発は GitHub Flow(main + PR)が主流
- PRはレビュアーの時間を節約するように本文を書く
- マージ戦略は迷ったら Squash and merge
- mainブランチは保護ルールでpush禁止にする
- CIが落ちているPRはマージしない
- 1 PRは小さく、1つの目的に絞る
最後に
この本で学んだことをまとめると、以下のようになります。
- Gitの役割 — 変更履歴を管理して、チーム開発を可能にする
- 初期設定 — user.name、SSH鍵、defaultBranch
- 基本フロー — add → commit → push
- ブランチ — switch、restoreで安全に操作
- merge / rebase — 使い分けの判断基準
- コンフリクト — 編集 → add → commit
- 取り消し — restore / reset / revert の違い
- リモート同期 — fetch / pull / push
- stash — 作業の一時退避
- チーム開発 — Pull Request と マージ戦略
ここまで身につけば、実務でGitを使うのに困ることはほぼなくなります。
Gitは奥が深く、まだまだ便利なコマンドや高度な使い方があります(cherry-pick、bisect、worktree、submodule など)。必要になったときに調べれば十分です。
最初のうちは、思い出せないコマンドがあって当然です。git help <command> や公式ドキュメント、この本をその都度参照しながら進めてください。使い続けるうちに、自然と手が覚えていきます。
Git、ちゃんと使えるようになりましたか?