テクノロジー · 実用ガイド
Git push が non-fast-forward で拒否?修正前にリモート参照を証明する
拒否はグラフの安全信号で、強制 push の指示ではありません。宛先参照と OID を保存し、監査用に fetch してから merge、rebase、承認済みの明示 lease を選びます。

non-fast-forward は宛先ブランチが提案コミットの祖先でないことを示します。受け入れると少なくとも一つのリモートコミットが可視履歴から消えます。まず正確な宛先参照と tip を保存します。
使い捨てローカル実験では共通基点 15c1b740f8f4、リモート tip ff5235c58d12、分岐したローカル tip 220186e6d9a6 を作りました。通常 push と古い lease は拒否され、観測した現行 OID に明示的に結び付けた承認済みテストだけが成功しました。
実験は仕組みの証明で、権限ではありません。チーム規則、保護設定、PR 規則とリモートコミットの意味が統合か書き換えかを決めます。lease は未観測変更を守りますが、履歴削除を正当化しません。
履歴を変える前に宛先を確定する
remote URL、現在ブランチ、upstream、push refspec と refs/heads/main のような正確な宛先を記録します。
ls-remote --heads で OID と時刻を保存します。結果が無ければ名称、権限、参照種別を確認し、古い tracking ref で代用しません。
観測 tip を監査参照へ fetch する
専用 audit ref に取得し OID が一致することを確認してから、両側だけのコミットを読みます。背景 fetch が origin/main を変えても証拠は残ります。
merge-base --is-ancestor の 0 は remote tip を含むこと、非 0 は遅れまたは分岐を示します。方針前に両側を確認します。
共有履歴を残すなら統合する
規則に従い audit ref を merge するか、未公開ローカルコミットだけを rebase します。衝突解決、テスト、グラフ確認後に通常 push します。
OID 保存前の blind pull は避けます。設定により merge または rebase が走り、拒否を説明する証拠より先に作業枝を変えます。
承認済み書き換えだけ明示 lease を使う
管理者承認後だけ --force-with-lease=refs/heads/main:<observed-oid> を使います。実験では古い lease は拒否されました。
push 後に宛先を再読し新旧 OID、承認、理由を記録します。拒否時は自動更新して再試行せず、監査をやり直します。
