状況
ローカルで rebase してから main に push したら拒否された。作業者がすぐに次のコマンドを打とうとしている。
Enter の前に止めるべき点は?
$ git push origin main ! [rejected] main -> main (non-fast-forward)$ git push -f origin main正答
- -f ではなく --force と長いオプションで書くべき
- 先に
git push --dry-runで送られる内容を確かめれば -f してよい - push の前に
git gcで不要なオブジェクトを消すべき - remote の main にある他人のコミットを上書きして消してしまう
解説
non-fast-forward で拒否されたのは、remote の main に手元にないコミットがあるか、rebase で履歴を書き換えたため。-f はそれを無視して remote の main を手元の内容で上書きし、他の人が push したコミットが main から消える。git fetch で差分を確かめ、git pull --rebase などで取り込んでから通常の push をする。共有ブランチの履歴は書き換えない。--dry-run は送る内容を見るだけで、他人のコミットが消えることは変わらない。
参考: git-scm.com
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ