概要
先日、TwitterでGitの取り扱いについてプチバズしていたツイートを発見してその引用RTやリプで
$ git push origin main
$ git push -f origin main
は危険です!と投稿していた人が数人いました。
(-f
オプションは強制(force)pushを意味します)
もちろん危険なのは言わずもがなですが、ヒューマンエラーは防ぎようがないし、「そもそもちゃんと設定すれば防げるのにいいいい!」と思ったのでサクッとまとめます。
※そのツイートの引用RTやリプでも設定に関して言及しているので現役エンジニアからすると当たり前のことだと思います。
結論
GitHubで簡単に設定できます👌
※色々ググってみるとローカルの.git/hooks
以下にpre-push
というファイルを作成してローカル側でリモート(GitHub)のmain(master)ブランチへのpushを禁止する方法が多くヒットしました。が、GitHubで設定できるのでとりあえずGitHubにお任せすれば良いのではないかと思います。
参考までに
この辺の記事を書いている当時はGitHub側での設定機能は無かったみたいですね。
GitHubで禁忌:git push origin (-f) mainを防ぐ設定
1.設定場所に行く
- GitHubの
Settings
タブのBranches
を選択する -
Add rule
ボタンをクリック
2.設定項目を入力する
Branch name pattern
保護設定を適用するブランチ名を入力するのでmain
と入力。
一応パターンなのでfeature/*
にするとfeature/○○
のブランチ全てに適用できるっぽい。
Require pull request reviews before merging
マージ前にPR(プルリク)のレビューを必須にするかどうかを選択します。
ここにチェックが必要ですね。
Required approving reviews
PRを承認するレビュワーの人数を設定します。(一例として2名にしてます)
※今回の趣旨とは違いますが、参考程度に。
Dismiss stale pull request approvals when new commits are pushed
承認済みのPRに新たにcommitがpushされた時にそのPRの承認を却下します。
※今回の趣旨とは違いますが、大事な設定だと思ったのでピックアップしました。
Include administrators
管理者というかリポジトリのオーナー(今回でいうと私)もこの設定内容を適用するかどうかを選択します。
Allow force pushes
force pushを許可するかどうかを選択します。チェックは付けないようにしましょう。
($ git push origin -f main
が可能に...)
Create
ブランチの保護設定を作成して有効にします。
3.作成(設定)後
試してみる
git push origin (-f) main実行
どちらも警告が出てpushできません。 ⇒ OK(☝︎ ՞ਊ ՞)☝︎
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 302 bytes | 302.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: error: GH006: Protected branch update failed for refs/heads/main.
remote: error: At least 2 approving reviews are required by reviewers with write access.
To https://github.com/shimotaroo/test.git
! [remote rejected] main -> main (protected branch hook declined)
error: failed to push some refs to 'https://github.com/shimotaroo/test.git'
参考:PR(プルリク)発行
以下コマンドでPRを発行してみる。
$ git switch -c feature/test
$ git add .
$ git commit -m "README.md修正"
$ git push origin feature/test
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 302 bytes | 302.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
remote: Create a pull request for 'feature/test' on GitHub by visiting:
remote: https://github.com/shimotaroo/test/pull/new/feature/test
remote:
To https://github.com/shimotaroo/test.git
* [new branch] feature/test -> feature/test
ちゃんとpushできたので、GitHub側でPRを作成。
先程設定した通りになっていますね。
- mainにmergeするためにはPRのレビューが必須になっている
- レビュワーを2名選択しないといけないようになっている
まとめ
ちゃんとGitHubでmainへのpushは禁止しようね。