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), и вершина ветки больше не совпадает с сервером.
- Неверная ветка или удалённый репозиторий.
Решения
- Получите и интегрируйте:
git pull --rebase(линейная история) илиgit pull(коммит слияния). Разрешите конфликты, затемgit push. - Сначала посмотрите:
git fetchиgit log HEAD..origin/mainпокажут, что нового на сервере. - После намеренной перезаписи истории в своей ветке:
git push --force-with-lease(безопаснее--force, проверяет, что сервер не изменился). - В общих ветках (main, develop) никогда не используйте force; договоритесь или работайте через pull request.
- Не та ветка?
git branch -vvпоказывает upstream.
Памятка
--force слепо перезаписывает и может уничтожить чужую работу. --force-with-lease прерывается, если сервер тем временем получил новые коммиты. Предупредите команду заранее, прежде чем менять историю в общих ветках. Защищённые ветки (branch protection) во многих командах вообще запрещают force push.
См. также: Разрешение конфликта слияния, Git: not a git repository