イシューからPRマージまで:Gitワークフローの全体像を理解する
「mainブランチに直接pushしている」「PRって何のためにあるの?」という方に向けて、イシュー登録からPRマージまでの一連のGitワークフローを解説します。
この記事では、実際のPR対応を例に、各ステップの役割と具体的なコマンドを紹介します。
ワークフロー全体像
まず、全体の流れを確認します。
graph TD
A[1. イシュー作成] --> B[2. ブランチ作成]
B --> C[3. コード修正・コミット]
C --> D[4. PR作成]
D --> E{5. CIチェック}
E -->|失敗| C
E -->|成功| F[6. レビュー]
F --> G{修正必要?}
G -->|はい| C
G -->|いいえ| H[7. マージ]
H --> I[8. イシュークローズ]
各ステップには明確な役割があります。順番に見ていきましょう。
ステップ1: イシューで作業を明確にする
イシューとは
イシュー(Issue)は「これから何をするか」を記録する場所です。バグ報告、機能追加、改善提案など、あらゆる作業の起点になります。
なぜイシューを作るのか
- 作業の可視化: 何をやるのかがチーム全体に共有される
- 議論の場: 実装前に方針を議論できる
- 履歴: なぜその変更をしたのか後から追跡できる
イシューテンプレートの活用
GitHubのイシューテンプレート機能を使うと、必要な情報を漏れなく記載できます。
# .github/ISSUE_TEMPLATE/bug.yml
name: バグ報告
description: バグや不具合を報告する
labels: ["bug"]
body:
- type: textarea
id: summary
attributes:
label: 概要
validations:
required: true
ステップ2: ブランチを切って作業する
なぜブランチを使うのか
mainブランチは「本番環境にデプロイされる状態」を保つべきです。作業中の不完全なコードをmainに置くと、他のメンバーに影響が出ます。
ブランチを使うことで:
- mainを安全に保つ: 作業中のコードは別ブランチに隔離
- 並行作業が可能: 複数の機能を同時に開発できる
- レビューしやすい: 変更がブランチ単位でまとまる
ブランチの作成
# mainブランチを最新に更新
git checkout main
git pull origin main
# 新しいブランチを作成して切り替え
git checkout -b feature/add-login-button
ブランチ名の命名規則
チームで規則を決めておくと管理しやすくなります。
| プレフィックス | 用途 |
|---|---|
feature/ | 新機能追加 |
fix/ | バグ修正 |
docs/ | ドキュメント更新 |
refactor/ | リファクタリング |
ステップ3: コミットで変更を記録する
コミットの単位
1つのコミットは「1つの論理的な変更」にまとめます。
# 良い例: 変更ごとにコミット
git add src/components/Button.tsx
git commit -m "ログインボタンコンポーネントを追加"
git add src/pages/login.tsx
git commit -m "ログインページにボタンを配置"
# 避けたい例: すべてを1つにまとめる
git add .
git commit -m "いろいろ修正"
コミットメッセージの書き方
何を変更したかではなく、なぜ変更したかが伝わるメッセージが理想です。
| 避けたい例 | 良い例 |
|---|---|
fix bug | ログイン時のリダイレクトループを修正 |
update | APIレスポンスのキャッシュ時間を30秒に延長 |
add file | ユーザー認証のミドルウェアを追加 |
ステップ4: PRで変更を提案する
PRとは
PR(Pull Request)は「このブランチの変更をmainに取り込んでほしい」という提案です。
リモートにプッシュしてPRを作成
# リモートにブランチをプッシュ
git push -u origin feature/add-login-button
GitHubでPRを作成するか、CLIを使います。
# GitHub CLIでPR作成
gh pr create --title "ログインボタンを追加" --body "## 概要
ログインページにボタンを追加しました。
## 関連イシュー
Closes #42"
PRテンプレートの活用
PRテンプレートを用意しておくと、レビューに必要な情報が揃います。
<!-- .github/PULL_REQUEST_TEMPLATE.md -->
## 概要
<!-- このPRで何をしたか -->
## 関連イシュー
<!-- Closes #123 で自動クローズ -->
## 確認事項
- [ ] ローカルで動作確認済み
- [ ] 既存機能への影響なし
ステップ5: CIチェック
CIとは
CI(Continuous Integration)は、コードの変更があるたびに自動でテストやビルドを実行する仕組みです。GitHub Actionsなどで設定します。
CIで行われる一般的なチェック
| チェック項目 | 目的 |
|---|---|
| ビルド | コードが正しくビルドできるか |
| テスト | 既存の機能が壊れていないか |
| Lint | コードスタイルが統一されているか |
| 型チェック | 型エラーがないか |
CIが失敗したら
graph LR
A[CIが失敗] --> B[エラー内容を確認]
B --> C[ローカルで修正]
C --> D[コミット・プッシュ]
D --> E[CIが再実行]
失敗したらエラーログを確認し、修正してプッシュします。CIは自動で再実行されます。
ステップ6: レビューとマージ
コードレビュー
チーム開発では、PRをマージする前に他のメンバーがコードを確認します。
レビューで確認されること:
- コードの品質と可読性
- バグがないか
- 設計方針に沿っているか
mainが進んでいた場合
作業中にmainブランチが更新されていることがあります。その場合は最新のmainを取り込みます。
# mainの最新を取得
git fetch origin main
# 現在のブランチにmainをマージ
git merge origin/main
コンフリクト(競合)が発生した場合は、手動で解消してコミットします。
マージの種類
| 方法 | 特徴 |
|---|---|
| Merge commit | すべてのコミット履歴を保持 |
| Squash and merge | 複数コミットを1つにまとめる |
| Rebase and merge | コミットをmainの先頭に移動 |
チームの方針に従って選択します。
実際の例: PR対応の流れ
実際にあったPR対応を例に、流れを見てみましょう。
状況
- 記事を追加するPRを作成
- CIが失敗(ビルドエラー)
- 原因を調査して修正
対応の流れ
# 1. PRの状態を確認
gh pr view
# 2. CIのエラー内容を確認
gh pr checks
# 3. ローカルでビルドして原因を特定
npm run build
# 4. 原因: 必須のメタデータが不足していた
# → 修正してコミット
git add .
git commit -m "fix: 記事にfrontmatterを追加"
# 5. プッシュしてCIを再実行
git push
# 6. CIが成功したらマージ
gh pr merge --merge
学び
- CIがあることで、本番環境にデプロイする前にエラーを検知できた
- エラーメッセージを読めば、原因と対処法がわかる
まとめ
Gitワークフローの各ステップには明確な役割があります。
| ステップ | 役割 |
|---|---|
| イシュー | 作業内容を明確化・共有 |
| ブランチ | mainを安全に保つ |
| コミット | 変更を論理的な単位で記録 |
| PR | 変更を提案・レビュー依頼 |
| CI | 自動でテスト・ビルド確認 |
| マージ | mainに変更を取り込む |
最初は手順が多く感じるかもしれませんが、この流れに慣れると:
- バグの混入を防げる
- 変更履歴が追跡しやすい
- チームでの協業がスムーズになる
まずは個人開発でもこの流れを意識してみてください。