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