Git Force Push を --force-with-lease で安全に行う

git push --force-with-lease を使って安全に force push する方法を解説。チームメイトの作業を上書きするリスクを防ぎながらリモートブランチを更新できます。

git push --force-with-lease

詳細な説明

なぜ Force Push が必要なのか?

feature ブランチで rebase や amend を行うと、ローカルとリモートの履歴が分岐します。通常の git push は拒否されます。force push が必要ですが、不注意に行うとチームメイトの作業を上書きしてしまう可能性があります。

--force の危険性

# 危険: リモートの状態に関係なく上書きする
git push --force

最後に fetch した後にチームメイトがコミットを push していた場合、--forceその作業を無言で破壊します

安全な代替手段: --force-with-lease

# 安全: 最後の fetch 以降にリモートが変更されていない場合のみ push する
git push --force-with-lease

--force-with-lease はリモートブランチが期待通りのコミットにあるか確認します。他の誰かがその間に push していた場合、push は拒否され、先に fetch して整合を取る必要があります。

仕組み

  1. Git が最後に fetch した時点のリモート参照の期待状態を保存する。
  2. push 時に、実際のリモート参照と期待値を比較する。
  3. 一致すれば、push が実行される。
  4. 異なれば、push がエラーで拒否される。

ベストプラクティス

# force push 前に必ず fetch する
git fetch origin
git rebase origin/main
git push --force-with-lease

デフォルトとして設定する

force push 時に常に --force-with-lease を使うよう Git を設定できます:

git config --global alias.fpush "push --force-with-lease"

Force Push が許容される場面

  • rebase や amend の後の自分の feature ブランチ
  • 自分が唯一のコントリビューターであるブランチ。
  • maindevelop、その他の共有統合ブランチでは絶対に使わない

黄金律:他の誰かがそのブランチで作業している可能性がある場合は、--force-with-lease を使いましょう。他人の作業を破壊することに対する一言の保険です。

ユースケース

最新の main に feature ブランチを rebase した後、開発者がリモートブランチを更新する必要があり、チームメイトの最近の push を上書きしないよう --force-with-lease を使用する場面で使用します。

Try It — Git Command Builder

フルツールを開く