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