git pushのforce-if-includesオプション

--force-if-includes について以下のブログで初めて知ったのでメモ

git push -f が更に安全になる –force-if-includes - id:onk のはてなブログ

git push –force-with-lease

push --froce-with-lease すると origin/main ブランチにいつのまにか新しいコミットが積まれていた場合、以下のように怒ってくれる(上記記事からの引用)

$ git push --force-with-lease origin HEAD
To github.com:onk/foo.git
 ! [rejected]        HEAD -> main (stale info)
error: failed to push some refs to 'github.com:onk/foo.git'

ローカルには、mainorigin/main の他に remotes/origin/main という追跡ブランチがあり、追跡ブランチが origin/main より古いと上記のように怒られる

追跡ブランチは git fetchorigin/main と同期される

追跡ブランチと origin/main が揃っていると push --force-with-lease は成功するので、pushする前に git fetch すると 他の人がリモートブランチに積んでいたコミットを守ってくれなくなる

git push –force-if-includes

--force-if-includes は追跡ブランチと origin/main が揃っていても reflogを見て追跡ブランチがアップデートされていることをチェックしてpushできないようにしてくれる

--force-with-lease ではpushできてしまっていた、push前に git fetch で両ブランチを揃えたパターンでもpushできなくなるため、より安全にpushできるようになった