🔒
GitHub の Branch protection rule を設定して、誤マージ誤プッシュを防ごう
概要
ローカルでメインブランチのままうっかり作業してコミット、そのまま push してしまった経験があります。PRレビュー通ったものしかメインブランチへマージしない運用をしているリポジトリで、これをやってしまうと復旧作業しているあいだ他の人がメインブランチを参照できず、その人の作業に影響をあたえてしまいます。
気づかないうちに誰も知らない内容のコミットがそのまま残ってしまうことも…
PR未レビューの状態でコミットpushやマージをさせないように、GitHub の Branch protection rule を使ってブランチの保護設定をしておくことを推奨します。
GitHub の Branch protection rule 設定方法
リポジトリの Setting
→ Branches
を開いて Add rule
ボタンを押します。
- 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 のドキュメントを合わせてご確認ください。
Discussion