EMZETT.
Войти

Git: push отклонён (non-fast-forward)

Коротко: На сервере есть коммиты, которых нет у вас локально; Git отклоняет push, пока вы не получите и не интегрируете чужие изменения.

Подробнее: Сообщение: ! [rejected] main -> main (fetch first) или (non-fast-forward), а также Updates were rejected because the remote contains work that you do not have locally. Git защищает от перезаписи чужих коммитов.

Подробности

Причины

  • Кто-то другой (или вы со второго устройства) сделал push после вашей последней синхронизации.
  • Вы изменили историю локально (rebase, amend, reset), и вершина ветки больше не совпадает с сервером.
  • Неверная ветка или удалённый репозиторий.

Решения

  1. Получите и интегрируйте: git pull --rebase (линейная история) или git pull (коммит слияния). Разрешите конфликты, затем git push.
  2. Сначала посмотрите: git fetch и git log HEAD..origin/main покажут, что нового на сервере.
  3. После намеренной перезаписи истории в своей ветке: git push --force-with-lease (безопаснее --force, проверяет, что сервер не изменился).
  4. В общих ветках (main, develop) никогда не используйте force; договоритесь или работайте через pull request.
  5. Не та ветка? git branch -vv показывает upstream.

Памятка

--force слепо перезаписывает и может уничтожить чужую работу. --force-with-lease прерывается, если сервер тем временем получил новые коммиты. Предупредите команду заранее, прежде чем менять историю в общих ветках. Защищённые ветки (branch protection) во многих командах вообще запрещают force push.

См. также: Разрешение конфликта слияния, Git: not a git repository