🔒

GitHub の Branch protection rule を設定して、誤マージ誤プッシュを防ごう

2021/06/15に公開

概要

ローカルでメインブランチのままうっかり作業してコミット、そのまま push してしまった経験があります。PRレビュー通ったものしかメインブランチへマージしない運用をしているリポジトリで、これをやってしまうと復旧作業しているあいだ他の人がメインブランチを参照できず、その人の作業に影響をあたえてしまいます。

気づかないうちに誰も知らない内容のコミットがそのまま残ってしまうことも…

PR未レビューの状態でコミットpushやマージをさせないように、GitHub の Branch protection rule を使ってブランチの保護設定をしておくことを推奨します。

GitHub の Branch protection rule 設定方法

リポジトリの SettingBranches を開いて Add rule ボタンを押します。

  1. Branch Protection ruleで以下を入力&チェック
    • Branch name pattern
      • 保護したいブランチ名 (master, main など)
    • Protect matching branches
      • Require pull request reviews before merging にチェック
        • PRレビューで approve をもらったものだけマージ可能とします。
        • Required approving reviews に、 approve ほしい最低限の数を指定
      • Include administrators にチェック
        • このチェックを入れることで、リポジトリの管理者権限を持つユーザーもPR未レビューの状態でコミットやマージが出来ません。
        • リポジトリ管理者権限を持つユーザーもコードを触る人であれば、Include administrators にチェックを入れておきましょう。

最低限上記の対応を入れることで、 master ブランチへの誤プッシュや誤マージを防ぐことが出来ます。

保護設定を入れた場合の master ブランチ直push 挙動確認

この設定を入れたリポジトリに対して、保護対象のブランチにローカルで新しいコミットを入れて push してみました。

$ git commit --allow-empty -m "empty commit for tag"
[master 880ce90] empty commit for tag
$ git push origin master
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 192 bytes | 192.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
remote: error: GH006: Protected branch update failed for refs/heads/master.
remote: error: At least 1 approving review is required by reviewers with write access.
To ssh://github.com/K1-Style/go-local-server.git
 ! [remote rejected] master -> master (protected branch hook declined)
error: failed to push some refs to 'ssh://github.com/K1-Style/go-local-server.git'

At least 1 approving review is required by reviewers with write access. と出て push が出来ません。

参考

今回紹介した以外にも、例えば「連携したCIのステータスが異常であればマージできない」といった設定も加えることが出来ます。より厳密な保護ルールをお考えであれば以下 GitHub のドキュメントを合わせてご確認ください。

ブランチ保護ルールを管理する - GitHub Docs

Discussion