🙅‍♂️

【Git/GitHub】禁忌:git push ( -f ) origin mainを防ぐ

2021/03/13に公開

概要

先日、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は禁止しようね。

Discussion