コンテンツにスキップ

ブランチ保護ルール

この章では、mainブランチへの直接プッシュ禁止、PR必須化、必須レビュー数の設定など、ブランチ保護ルールの詳細を学びます。

ブランチ保護は、重要なブランチ(通常はmain)に対して、特定のルールを強制する機能です。

  1. コード品質の維持: レビューなしのマージを防止
  2. CI/CDの確保: テストが通らないコードをブロック
  3. 事故の防止: 誤った force push から保護
  4. コンプライアンス: 監査要件への対応
  1. リポジトリの Settings
  2. 左メニューの Branches
  3. Branch protection rules セクション
  4. Add rule または既存ルールを編集
  1. Branch name pattern に main を入力
  2. Require a pull request before merging にチェック
これにより:
✅ PRを経由したマージのみ許可
❌ git push origin main は拒否される
Terminal window
# 直接プッシュしようとすると...
git push origin main
# エラーになる
remote: error: GH006: Protected branch update failed
remote: error: Required pull request reviews not satisfied
サブオプション説明
Require approvals承認が必要
Dismiss stale pull request approvals新コミットで承認を無効化
Require review from Code OwnersCODEOWNERSの承認必須
Require approval of the most recent push最新プッシュの承認必須

「Required number of approvals before merging」で1〜6を選択:

チーム規模推奨承認数
1〜3人1
4〜10人1〜2
10人以上2以上

承認の取り消し(Dismiss stale approvals)

Section titled “承認の取り消し(Dismiss stale approvals)”

新しいコミットがプッシュされたら、既存の承認を無効にする設定:

メリット:
- 承認後の変更も必ずレビューされる
- 意図しない変更の混入を防止
デメリット:
- 軽微な修正でも再承認が必要
- レビュアーの負担増

Require status checks to pass before merging

Section titled “Require status checks to pass before merging”

CI/CDの結果をマージ条件にします。

.github/workflows/ci.yml
name: CI
on:
pull_request:
branches: [main]
jobs:
test: # ← このジョブ名を必須チェックに設定
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: npm test
lint: # ← このジョブ名も必須チェックに追加可能
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Lint
run: npm run lint
  1. Require status checks to pass before merging にチェック
  2. 検索ボックスでジョブ名を検索(例: test, lint
  3. 必須にしたいチェックを選択

Require branches to be up to date before merging

Section titled “Require branches to be up to date before merging”

マージ前にbaseブランチ(main)と同期することを必須にします:

有効にすると:
- PRブランチがmainの最新に追随している必要がある
- 「Update branch」ボタンでワンクリック同期

デフォルトでは、リポジトリ管理者(Admin)は保護ルールをバイパスできます。

このオプションを有効にすると、管理者も同じルールに従う必要があります。

推奨:
- 本番環境に影響するリポジトリ → 有効
- 個人プロジェクト → 無効でも可

すべてのコミットにGPG署名を必須にします。

Terminal window
# 署名付きコミットの確認
git log --show-signature
# 署名付きでコミット
git commit -S -m "メッセージ"
# 常に署名する設定
git config --global commit.gpgsign true
  1. なりすまし防止: コミッターの本人確認
  2. 監査対応: コードの出所を証明
  3. セキュリティ: サプライチェーン攻撃対策

マージコミットを禁止し、履歴を直線的に保ちます。

許可されるマージ方法:
✅ Squash and merge
✅ Rebase and merge
❌ Create a merge commit
非線形履歴:
●────●────●
│ ↑
└──●─┘
線形履歴:
●────●────●────●────●
設定説明
Disabled完全に禁止(推奨)
Everyone全員に許可(非推奨)
Specify who can force push特定ユーザーのみ許可

Allow deletions をオフにすると、保護ブランチの削除を禁止できます。

複数のルールがある場合、最も制限的なルールが適用されます:

例:
ルール1: main → 承認1件必須
ルール2: main* → 承認2件必須
main ブランチには両方がマッチ → 2件必須(より制限的)

main # 完全一致
release/* # release/v1.0.0 などにマッチ
feature/** # feature/auth/login などにもマッチ
* # 全ブランチ

設定のエクスポート/インポート

Section titled “設定のエクスポート/インポート”

GitHub CLI でルールを確認:

Terminal window
gh api repos/{owner}/{repo}/branches/main/protection

緊急時に管理者がバイパスする場合:

  1. 「Do not allow bypassing」を一時的にオフ
  2. 緊急修正を実施
  3. 設定を元に戻す
  4. 監査ログに記録

Q1. mainブランチへの直接プッシュを禁止するために有効にする設定はどれですか?

Q2. Dismiss stale pull request approvalsの効果はどれですか?

Q3. ブランチ保護ルールで複数のルールがマッチする場合、どのルールが適用されますか?