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 して整合を取る必要があります。
仕組み
- Git が最後に fetch した時点のリモート参照の期待状態を保存する。
- push 時に、実際のリモート参照と期待値を比較する。
- 一致すれば、push が実行される。
- 異なれば、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 ブランチ。
- 自分が唯一のコントリビューターであるブランチ。
main、develop、その他の共有統合ブランチでは絶対に使わない。
黄金律:他の誰かがそのブランチで作業している可能性がある場合は、--force-with-lease を使いましょう。他人の作業を破壊することに対する一言の保険です。
ユースケース
最新の main に feature ブランチを rebase した後、開発者がリモートブランチを更新する必要があり、チームメイトの最近の push を上書きしないよう --force-with-lease を使用する場面で使用します。