GitHub:強制 push が止められる
強制 push は、ぶつかりを気にせず手元の変更でリモートのリポジトリを上書きする Git の push です。GitHub は保護されたすべてのブランチで既定で強制 push を止めます。ルールセットの「Block force pushes」の規則も既定で有効で、対象のブランチやタグへの強制 push を止めます(GitHub の説明「保護されたブランチについて」と「ルールセットで使える規則」・2026年10月26日に確認)。
{ "type": "non_fast_forward" }
// ルールセットの規則:push できる人にも参照への強制 push をさせない
どこで止められるか
- ブランチの保護:保護されたブランチでは、「Rules applied to everyone including administrators」の下の「Allow force pushes」を選ばない限り、強制 push は止められます。選ぶと、書き込みの権限以上を持つ全員(管理者も含む)か、指定した人やチームだけが強制 push できます(GitHub の説明「ブランチの保護のルールの管理」)。
- ルールセット:「Block force pushes」は、ルールセットが対象にするブランチやタグに効きます。REST API では
non_fast_forwardの規則です(GitHub の説明「ルールの REST API」)。 - GitHub が止める理由:強制 push は、ほかの人が作業の土台にしたコミットをブランチの履歴から消すことがあり、マージのぶつかりや壊れたプルリクにつながります。強制 push でブランチを消したり、プルリクで承認されていないコミットをブランチに指させたりもできます。
- ほかの規則はそのまま:強制 push を許しても、ほかの規則は外れません。一直線の履歴が必須のブランチには、マージコミットを強制 push できません。
- 既定のブランチ:ルールセットが強制 push を止めていると、組織の持ち主やリポジトリの管理者も、ルールセットを迂回できなければ既定のブランチを変えたり名前を変えたりできません。
プルリクで強制 push が要るとき
- 書き直したコミット:コミットの署名が必須のブランチに署名の無いコミットを push したら、そのコミットをリベースして確かめられた署名を付け、書き直したコミットをブランチへ強制 push する必要がある、と GitHub は説明しています。強制 push も止めているブランチでは、この最後の手順が断られます。コミットのメタデータの規則でも、コミットの書き直しが要ることがあります(コミットのメタデータの規則を参照)。
- 対象のブランチを取り込む:プルリクの画面の「Update branch」は対象のブランチを head のブランチへマージし、「Update with rebase」は代わりに自分の変更を最新の対象のブランチの上へリベースします(GitHub の説明「プルリクを対象のブランチと揃える」)。REST の「Update a pull request branch」は、対象のブランチの HEAD をプルリクのブランチへマージします。
直す所
- 規則を探す:リポジトリを読める人なら誰でも、有効なルールセットを見られます。リポジトリの設定の Rules → Insights には、ルールセットで確かめた操作と、失敗した操作ではどの規則が失敗したかが出ます(GitHub の説明「リポジトリのルールセットの管理」)。
- 許してもらう:ブランチの保護なら、管理者が強制 push してよい人やチームを選べます。ルールセットは、役割・チーム・アプリに迂回の権限を与えられます(GitHub の説明「リポジトリのルールセットを作る」)。
- 対象のブランチはマージで取り込む:プルリクのブランチをリベースすると強制 push が要る場合は、「Update branch」(か REST の入口)で対象のブランチをマージして取り込めます。
IntelliJ IDEA はブランチ保護の規則で強制 push を止めるが、ルールセットは読まない
IntelliJ IDEA に入っている Git と GitHub の機能が、保護されたブランチへの強制 push をどう扱うか。ソース(2026年11月1日に確認・IntelliJ IDEA:GHProtectedBranchRulesLoader.kt・getProtectionRules.graphql・GithubProjectSettings.kt・GitSharedSettings.java・GitVcsPanel.kt・GitPushSupport.java・ForcePushAction.kt・DvcsBundle.properties・GraphQL のファイル・GithubApiRequests.kt)では:
- 保護されたブランチの出どころ:fetch が成功した後、Git の設定「Load branch protection rules from GitHub」(GitHub からブランチ保護の規則を読む)がオン(最初からオン)で、そのサーバーの GitHub アカウントが IDE にあれば、GitHub の機能がリポジトリのブランチ保護の規則を GitHub に頼み、それぞれの規則からブランチ名のパターンだけを取っておきます。これが Git の設定の保護されたブランチ(最初は
masterとmain)に足されます。 - 強制 push:push 先のブランチがそのパターンのどれかに当たると、Push の画面の Force Push の操作が使えなくなり、その説明は「Force push to <push 先> is prohibited」(強制 push は禁止)と、保護されたブランチを設定する場所になります。
- 読まない物:規則ごとに頼むのはパターンだけで、その規則が強制 push を許しているかは頼まないので、許している規則のブランチも IDE では保護されたブランチになります。78本の GraphQL のファイルのどれもルールセットを頼まず、REST で送る物の一覧にもルールセットの物は無いので、ルールセットだけで守られているブランチには GitHub からパターンが来ません。プルリクについてはマージ先のブランチの規則も取り、そこには
allowsForcePushesもあります。マージの判定がその規則から何を使うかは GitHub:署名の無いコミットがマージを止めている の節にあります。
IntelliJ IDEA で GitHub のプルリクを見るなら
Lesstep の Pull Request Inbox for GitHub は、JetBrains IDE(2024.1 以降)のプラグインです。プルリクのレビュー・チェック・会話を差分の隣に出し、対象のブランチが許す方法でマージします。プラグインは push も強制 push もしません。「ブランチを更新」は GitHub の「Update a pull request branch」を使い、対象のブランチをプルリクのブランチへマージします。受信箱・差分・会話は無料、承認・コメント・解決・マージは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。
GitHub は GitHub, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:GitHub のマージの断り(405・409) · GitHub のレビューの断り(422) · GitHub の検索の 422「Validation Failed」 · 「Resource not accessible by personal access token」 · 401「Bad credentials」 · 「Resource protected by organization SAML enforcement」 · 「API rate limit exceeded」 · GitHub の差分の 406「too_large」・3,000件 · GitHub の行のコメントの 422「must be part of the diff」 · GitHub のブランチの更新の断り(422) · GitHub のプルリクが作れない(422・403) · GitHub の自動マージの断り · GitHub の下書き・レビュー準備完了・閉じるの断り · GitHub の会話の解決の断り · GitHub のチェックが出ない(check runs の 403) · GitHub のファイルの中身が読めない · GitHub の比較の断り(404・422) · GitHub のコメント・返信の断り(ロック・アーカイブの 403) · GitHub のマージの方法の断り(405) · GitHub のブランチが見つからない(404・301) · GitHub Enterprise Server につながらない · GitHub のレビューの依頼が出ない · GitHub のプルリクの一覧が足りない · GitHub の 404・名前を変えたリポジトリ(301・307) · GitHub の行のコメントが outdated・差分に無い · GitHub のプルリクの更新・通知が遅い · GitHub の変更の提案が適用できない · GitHub の必須チェックが Expected のまま · GitHub でコードオーナーのレビューが要る · GitHub で未解決の会話がマージを止める · GitHub で署名の無いコミットがマージを止める · GitHub のマージキューでマージするブランチ · GitHub でマージが最後の push の承認を待っている · GitHub でマージがコードスキャンの結果を待っている · GitHub でマージがコード品質の結果を待っている · GitHub でコードのカバレッジの水準がマージを止める · GitHub でライセンスの適合の結果がマージを止める · GitHub でブランチのロックや更新の制限がマージを止める · GitHub でマージの後にブランチが消えない · GitHub でチームの承認(Required reviewers)がマージを止める · GitHub でシークレットスキャンのアラートがマージを止める · GitHub でスタックしたプルリクがマージできない · GitHub で push の規則が push を止める · GitHub でコミットのメタデータの規則がマージを止める · GitHub でプルリクをマージしても issue が閉じない · GitHub のプルリクを手元にチェックアウトできない · GitHub のプルリクがマージ先と衝突している · GitHub で変更を依頼された・レビューを取り消す · GitHub で共同作者がコミットに数えられない · GitHub で依存関係のレビューのチェックが失敗する · GitHub で Dependabot がプルリクをリベースしない · GitHub でフォークが同期できない · GitHub でプルリクのベースのブランチを変えられない · GitHub でプルリクを取り消せない · GitHub でプルリクのテンプレートが出ない · GitHub でプルリクにラベルや担当者が付かない · GitHub でプルリクを閉じられない・開き直せない · GitHub でプッシュ保護にプッシュを止められた · GitHub でプルリクのコメントが隠された · GitHub でデプロイが成功するまでプルリクをマージできない · GitHub でチームに頼んだレビューがメンバーに置き換わった · GitHub でプルリクのファイルの Viewed が外れた · GitHub でマージしていないプルリクがマージ済みになった · GitHub で Copilot のレビューが承認に数えられない · GitHub でワークフローが作ったプルリクのチェックが動かない · GitHub でプルリクに Update branch のボタンが出ない · GitHub で Dependabot のプルリクのチェックが失敗する · GitHub でフォークからのプルリクのチェックが失敗する · GitHub でコミットメッセージの [skip ci] でチェックが動かない · GitHub で保存期間を過ぎてチェックが消えた · GitHub の公開リポジトリのコードレビューの制限 · GitHub でリポジトリのプルリクがオフ・制限されている · GitHub でスタックのプルリクごとにチェックが走る · GitHub でスカッシュでマージ済みのコミットが次のプルリクに出る · GitHub のプルリクでファイルの差分が出ない · GitHub でフォークのプルリクのブランチに push できない · GitHub のプルリクのチェックが取り消された · GitHub で Rebase and merge が使えない · GitHub のマージのコミットメッセージが思った形にならない · GitHub のプルリクでファイルの全行が変わったと出る · GitHub の API がタイムアウトした · GitHub のプルリクで画像や文書の差分が見た目で出ない · GitHub のレビューの依頼が断られる(422) · GitHub で Copilot が作ったプルリクのチェックが動かない・承認が数えられない · GitHub の push が GH006・GH013 で断られる · GitHub で承認が足りずマージできない・数に入らない承認 · JetBrains の IDE で GitHub のプルリクを扱う · English