#Что означает ошибка
! [rejected] main -> main (non-fast-forward) error: failed to push some refs to 'origin' Updates were rejected because the tip of your current branch is behind its remote counterpart.
История ветки должна расти линейно. Если в удалённой ветке появились новые коммиты, ваш push не может «продолжить» её, и Git его отклоняет, защищая чужую работу.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Коллега отправил изменения раньшеУдалённая ветка содержит новые коммиты. | git fetch и git log HEAD..origin/main показывают коммиты. | Выполните git pull --rebase, затем git push. |
| Вы переписали историю (rebase, amend)Локальная история расходится с удалённой. | После git rebase или commit --amend push отклонён. | Используйте git push --force-with-lease для своей ветки. |
| Push не в ту веткуТекущая ветка отличается от нужной. | git status показывает другую ветку. | Переключитесь на нужную ветку. |
| Защищённая веткаПрямой push в основную ветку запрещён правилами. | Сообщение о protected branch. | Создайте ветку и оформите pull request. |
#Пошаговое решение
- Получите измененияВ корне нужного репозитория откройте терминал и выполните
git status -sb,git branch --show-current,git remote -v. Убедитесь, что вы отправляете существующую локальную ветку в правильный проект и что рабочие изменения сохранены или закоммичены. Сообщениеrejected (non-fast-forward)означает, что на удалённой ветке есть коммиты, которых нет в вашей локальной истории, либо история была изменена. Это не обязательно ошибка прав доступа, поэтому не создавайте новый токен и не используйте--forceавтоматически. - Объедините измененияСкачайте метаданные без изменения файлов командой
git fetch origin, затем посмотритеgit log --oneline --graph --decorate --all -n 30. Для конкретной ветки сравнитеgit log --oneline HEAD..origin/ИМЯ_ВЕТКИиgit log --oneline origin/ИМЯ_ВЕТКИ..HEAD, заменив имя настоящим. Если удалённая ветка отсутствует или имя другое, проверьтеgit branch -r. Не запускайтеpull, пока не определили, кто делал новые коммиты и есть ли локальные незакоммиченные файлы. - Проверьте результатЕсли удалённые коммиты корректны и вы хотите включить их в свою личную рабочую ветку, сначала сделайте сохранённый коммит или
git stashс проверкой результата. Выберите один способ по правилам команды:git rebase origin/ИМЯ_ВЕТКИдля переноса локальных коммитов поверх удалённых либоgit merge origin/ИМЯ_ВЕТКИдля обычного слияния. При конфликте откройтеgit status, исправьте помеченные файлы, выполнитеgit add, затемgit rebase --continueилиgit commitв режиме merge. При необходимости отмените незавершённую операцию командойgit rebase --abortилиgit merge --abort. - Отправьте измененияПосле завершения слияния выполните
git status, проверьте тесты проекта и журналgit log --oneline -5. Если состояние чистое и ветка содержит нужные изменения, выполнитеgit push origin ИМЯ_ВЕТКИ. Успех — обновление ветки без строкиrejected. Если другой участник отправил новые коммиты пока вы работали, повторитеgit fetchи согласуйте объединение; не переходите к принудительной отправке ради скорости. На защищённой ветке создайте отдельную ветку и отправьте запрос на слияние. - Если переписывали историю своей ветки
git push --force-with-lease— исключительная операция при намеренно переписанной истории собственной ветки и согласованном порядке работы. Она может перезаписать коммиты других участников, если они сделали изменения после вашего последнего fetch; не применяйте её кmainили общей ветке как средство устранения non-fast-forward. Если причина отказа всё ещё неясна, не выполняйте команду: сохраните выводgit status,git logи сообщения сервера для руководителя проекта. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Если не помогло
Если запутались, сохраните состояние: git branch backup перед сложными операциями. Прервать неудачное перебазирование можно командой git rebase --abort.