git pushが「rejected (fetch first)」で弾かれるときの対処

pushしようとすると、こう弾かれる。

! [rejected] main -> main (fetch first)
error: failed to push some refs
hint: Updates were rejected because the remote contains work that you do not have locally.

リモート側に、自分の手元にまだ無いコミットがある、という状態だ。誰かが先にpushしたか、別の端末から更新したときに起きる。手元が古いまま上書きできないので、Gitが止めている。

まずリモートの変更を取り込む

リモートの更新を取得して、自分の作業をその上に乗せ直す。

Terminal window
git pull --rebase origin main

コンフリクトが出たら、該当ファイルを直して続行する。

Terminal window
git add .
git rebase --continue

取り込めたらpushする

Terminal window
git push origin main

force push は基本使わない

git push --force で無理やり上書きもできるが、リモートの他人のコミットを消す危険がある。共同作業では避ける。どうしても必要なときだけ、影響範囲を理解して使う。

まとめ

  • 原因はリモートにローカル未取得のコミットがある
  • git pull --rebase で取り込んでから push
  • コンフリクトは直して git rebase --continue
  • --force は他人の作業を消すリスクがあるので安易に使わない