Git Force Push
最終更新
ローカルブランチがリモートから分岐していると、通常の git push は拒否されます。Git はあなたが見ていないかもしれないコミットを上書きしないからです。force push はそのチェックを無視し、リモートブランチをローカルに一致させます。履歴を書き換えた後(rebase や amend)には必要ですが、他人のコミットを消してしまうことがあるため、より安全な --force-with-lease を選びましょう。
これらをターミナルプレイグラウンドで試しましょう - ブラウザ内の本物のシェルで、インストール不要です。
構文
| Command | What it does |
|---|---|
git push --force | 安全チェックなしでリモートブランチを上書きする |
git push -f | --force の短縮形 |
git push --force-with-lease | その間に他の誰もプッシュしていない場合のみ強制する |
git push --force-with-lease origin feature | 名前付きブランチへのより安全な force push |
--force vs --force-with-lease
| Behavior | --force | --force-with-lease |
|---|---|---|
| リモートを上書きする | 常に | 最後の fetch 以降に変更がない場合のみ |
| 他人のコミットを消せる | はい | 拒否する - ただし fetch で lease が更新された場合を除く |
| チームに推奨 | いいえ | はい |
Git force push のよくある質問
いつ force push が必要ですか?
すでにリモートにある履歴を書き換えたときです -
git rebase、git commit --amend、またはコミットを squash する対話的 rebase の後などです。ローカルブランチがもはやリモートの履歴と一致しないため、通常のプッシュは拒否され、force push だけが更新できます。--force と --force-with-lease の違いは何ですか?
--force は無条件でリモートブランチを上書きするため、最後の fetch 以降にチームメイトがプッシュしたコミットを気づかぬうちに削除することがあります。--force-with-lease はリモートがあなたが最後に見たコミットのままである場合にのみ上書きします - その間に他の誰かがプッシュしていれば拒否し、その作業を保護します。1 つ注意点があります。あらゆる fetch(IDE のバックグラウンド自動 fetch を含む)が lease を更新するため、リモートを確認した直後にプッシュしてください。それでも共有ブランチでは --force より --force-with-lease を選びましょう。force push は危険ですか?
危険な場合があります。共有ブランチでは、単純な
--force が他人のプッシュしたコミットを上書きし、実質的にその作業をリモートから削除してしまうことがあります。自分だけが使うブランチでは安全です。迷ったら --force-with-lease を使いましょう。見ていない変更を潰す代わりに、安全に失敗します。force push を元に戻すには?
古いコミットがまだローカルや
git reflog に残っていれば、ブランチをそこへリセットして再度 force push すれば以前の状態を復元できます。これも --force-with-lease を使うべき理由の一つです - そもそも誤った上書きが起こる可能性を大幅に減らします。これをオンラインで練習できますか?
はい。ターミナルプレイグラウンドを開けば、ブラウザ内の本物のシェルで git push コマンドを実行できます - インストール不要です。Coddy の無料のインタラクティブな Git コースでも、リモートとの作業を段階的に扱います。