GitHubのmainブランチを守る:最低限のブランチ保護設定と3wayマージ運用
納戸工房では、Minecraft の Paper プラグイン「twbridge」を
GitHub の nando256/twbridge リポジトリで管理しています。
今までは、
- main ブランチにそのままコミット
- 修正もバグも、全部 main に直プッシュ
という、ある意味 “男らしい” ?運用をしていました。
ところが、コード量や機能が増えてくると、
- 「あれ、このコミット何のために入れたんだっけ?」
- 「ちょっとまずい変更を main に入れちゃったな……」
- 「過去の状態に戻したいけど、履歴がごちゃごちゃで見るのがつらい」
という場面がじわじわ増えてきます。
1人開発だからといって main を甘やかしていいわけではないな、と思い始めたわけです。
今回の目的はシンプルです。
main ブランチへの強制プッシュを防ぐために、GitHub のブランチ保護を入れてみる。
どうせやるなら、一般的な3wayマージで取り込む運用を試してみたい。
目指した運用:main 直プッシュ禁止+ゆるい 3way マージ
ポイントは「がっつりルールで縛る」のではなく、
- main に 直接 push はできない
- 作業は ブランチを切って push
- GitHub 上で Pull Request を作ってマージ
- マージは GitHub の標準的な 3way マージ(Merge pull request ボタン)
という、かなりゆるいけど 最低限のラインだけは守る 形にすることです。
レビュー必須とか、CI 必須とか、CODEOWNERS とか、
そういう “本気運用セット” までは今回はやりません。
今のままだと何が困るか
1人で main に直プッシュしていると、次のような問題が出てきます。
- コミット単位が雑になりがち
- 「とりあえず保存」みたいなコミットが積み上がる
- バグを埋め込んでも気づきにくい
- main に載せてから「あ、まずい」と気づく
- 過去バージョンに戻したいときに履歴が読みづらい
- どこが機能追加で、どこがバグ修正かがぱっと見で分からない
そして何より、
- 「いつでも main を壊せる」という心理的プレッシャー
があります。
実験的なコードを main に入れるのがちょっと怖くなってきたので、
「main に入るのはそれなりに確認したものだけ」 という線引きをしたくなりました。
GitHub で main を「最低限だけ」保護する
やった設定は本当に最低限です。
手順
- https://github.com/nando256/twbridge を開く
- 上部のタブから Settings を開く
- 左メニューの Code and automation → Branches をクリック
- 「Branch プルリクエストotection rules」セクションで
Add branch ruleset をクリック

- 次のように設定:
- Ruleset Nane
3way merge(自由に決めてください) - Enforcement status
Active(rulesetを有効にします) - Target branchges
Add target > Include default branch - Require a pull request before merging
チェックを入れる - 他はそのまま
- Ruleset Nane
これだけ です。
レビュー必須もステータスチェック必須も CI も、今回はいっさい触っていません。
3way マージについて
GitHub のデフォルトの「Merge pull request」ボタンは 3wayマージ(マージコミット付き) なので、
- リポジトリの Settings → General → Pull Requests
- Allow merge commits が ON になっていれば、3wayマージが使えます
Squash と Rebase の設定はお好みでそのままでも大丈夫です。
(特にいじらなくても、今まで通り「Merge pull request」で 3way マージされます)
運用イメージ
1. main からブランチを切る
git checkout main git pull origin main git checkout -b feature/xxx
2. 変更 → コミット → GitHub に push
git add . git commit -m "Something" git push origin feature/xxx
3. GitHub 上で プルリクエスト 作成
4. 自分で内容確認 → 「Merge pull request」(3way マージ)
これだけです。
CI もレビュー強制も無しで、「main に直 push できない & プルリクエスト 経由で 3way マージ」という最小構成になります。
やめたくなったら
- 「やっぱり main に直 push したくなった」
- 「一部だけ緩めたい」
みたいなことがあったら、Rules > Rulesets の画面でDisableにすればすぐ戻せます。
まとめ
やったことはすごくシンプルです。
- デフォルトブランチ(main)に対してブランチ保護を設定
- target branches:default branch
- bypass:なし
- Require a pull request before merging:オン
これだけで、
- main に 直接 push できない
- 必ずブランチを切ってプルリクエスト → 3way マージ という流れになる
- main の削除や force push も防げる
という「最低限だけど効くガード」が付きました。
1人開発でも、main を雑に触ると後から自分が困ります。
「気をつける」ではなく、「物理的に main に直 push できない」ようにしておくと、
履歴もきれいに保ちやすく、気楽にブランチで実験もしやすくなります。
まずはこのライトな設定で運用してみて、
必要になったタイミングで「レビュー必須」や「CI 必須」などを足していくつもりです。










