Git Git non-fast-forward

Git push отклонён: «Updates were rejected because the tip of your current branch is behind»

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

Git не даёт отправить изменения, если удалённая ветка ушла вперёд. Сначала нужно получить чужие коммиты: git pull --rebase (или git pull) и разрешить конфликты, затем повторить git push. Принудительную отправку (--force) применяйте только если уверены, что перезаписываете свои, а не чужие изменения.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Если не помогло

#Что означает ошибка

non-fast-forward
! [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.

#Пошаговое решение

  1. Получите измененияВ корне нужного репозитория откройте терминал и выполните git status -sb, git branch --show-current, git remote -v. Убедитесь, что вы отправляете существующую локальную ветку в правильный проект и что рабочие изменения сохранены или закоммичены. Сообщение rejected (non-fast-forward) означает, что на удалённой ветке есть коммиты, которых нет в вашей локальной истории, либо история была изменена. Это не обязательно ошибка прав доступа, поэтому не создавайте новый токен и не используйте --force автоматически.
  2. Объедините измененияСкачайте метаданные без изменения файлов командой 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, пока не определили, кто делал новые коммиты и есть ли локальные незакоммиченные файлы.
  3. Проверьте результатЕсли удалённые коммиты корректны и вы хотите включить их в свою личную рабочую ветку, сначала сделайте сохранённый коммит или git stash с проверкой результата. Выберите один способ по правилам команды: git rebase origin/ИМЯ_ВЕТКИ для переноса локальных коммитов поверх удалённых либо git merge origin/ИМЯ_ВЕТКИ для обычного слияния. При конфликте откройте git status, исправьте помеченные файлы, выполните git add, затем git rebase --continue или git commit в режиме merge. При необходимости отмените незавершённую операцию командой git rebase --abort или git merge --abort.
  4. Отправьте измененияПосле завершения слияния выполните git status, проверьте тесты проекта и журнал git log --oneline -5. Если состояние чистое и ветка содержит нужные изменения, выполните git push origin ИМЯ_ВЕТКИ. Успех — обновление ветки без строки rejected. Если другой участник отправил новые коммиты пока вы работали, повторите git fetch и согласуйте объединение; не переходите к принудительной отправке ради скорости. На защищённой ветке создайте отдельную ветку и отправьте запрос на слияние.
  5. Если переписывали историю своей веткиgit push --force-with-lease — исключительная операция при намеренно переписанной истории собственной ветки и согласованном порядке работы. Она может перезаписать коммиты других участников, если они сделали изменения после вашего последнего fetch; не применяйте её к main или общей ветке как средство устранения non-fast-forward. Если причина отказа всё ещё неясна, не выполняйте команду: сохраните вывод git status, git log и сообщения сервера для руководителя проекта.
  6. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Диагностика без автоматического rebase и push; ветку берите из git branch --show-current.
    Linux · Терминал (Bash)Команда
    Диагностика без автоматического rebase и push; ветку берите из git branch --show-current.
    git status -sb
    git branch --show-current
    git fetch origin
    git log --oneline --graph --decorate --all -n 30
    # После проверки истории выберите ТОЛЬКО ОДНО: merge ИЛИ rebase.
    Вариант 2Не является стандартным исправлением non-fast-forward; требует согласования при переписывании собственной и…
    Linux · Терминал (Bash)Команда
    Не является стандартным исправлением non-fast-forward; требует согласования при переписывании собственной истории.
    # Не выполнять в общей ветке:
    # git push --force-with-lease origin ИМЯ_ВЕТКИ

#Если не помогло

Если запутались, сохраните состояние: git branch backup перед сложными операциями. Прервать неудачное перебазирование можно командой git rebase --abort.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.