Разработка 6 мин чтения

git push rejected: как исправить ошибку отклонения отправки

Пошаговое руководство по устранению ошибки git push rejected: non-fast-forward,force push, pull перед push и защита веток.

GitpushrejectedremoteGitHub

Симптомы

  • ! [rejected] master -> master (non-fast-forward)
  • error: failed to push some refs
  • Updates were rejected because the remote contains work
  • git push завершается ошибкой
  • Push rejected из-за protected branch

Возможные причины

  • Удалённая ветка содержит коммиты, которых нет локально
  • Кто-то другой запустил push до вас
  • Ветка защищена в GitHub/GitLab
  • Вы пытаетесь force push в защищённую ветку
  • Несогласованные изменения в индексе

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

1

Пull перед push

Самое простое решение — выполнить git pull перед push. Это скачает удалённые изменения и объединит их с вашими: git pull origin master --rebase. Флаг --rebase пере replay ваши коммиты поверх удалённых, чтобы история была линейной. Если возникнут конфликты, разрешите их и выполните git rebase --continue. После этого push сработает.

Команда
git pull origin master --rebase
2

Выполнитеforce push (осторожно)

Если вы уверены, что ваши изменения правильные и перезаписывают удалённые: git push --force origin master. FORCE PUSH перезаписывает удалённую ветку вашей историей. Это опасно: чужие коммиты будут потеряны. Безопаснее: git push --force-with-lease — он проверяет, что удалённая ветка не изменилась с момента последнего pull. НИКОГДА не делайте force push в main/master без согласия команды.

Команда
git push --force-with-lease origin master
3

Проверьте защиту веток

Если push rejected с сообщением branch is protected, проверьте настройки в GitHub/GitLab. Перейдите в Settings > Branches > Branch protection rules. Убедитесь, что у вас есть права на force push или что ветка не требует PR. Для обхода временно снимите protection (если у вас есть доступ) или создайте Pull Request.

4

Синхронизируйте с удалённым репозиторием

Выполните git fetch origin для скачивания информации об удалённых изменениях без объединения. Затем git log master..origin/master покажет, какие коммиты есть на удалённом сервере, но нет у вас. Это поможет понять, что именно нужно подтянуть. После анализа сделайте git merge origin/master или git rebase origin/master.

Команда
git fetch origin && git log master..origin/master
5

Проверьте текущую ветку

Убедитесь, что вы в правильной ветке: git branch. Если вы в feature-ветке, а пушите в master — будет ошибка. Переключитесь: git checkout master. Также проверьтеgit remote -v — URL удалённого репозитория должен быть правильным. Если URL изменился: git remote set-url origin git@github.com:user/repo.git.

Команда
git branch && git remote -v
6

Создайте PR вместо прямого push

Если ветка защищена, создайте Pull Request. Перейдите в GitHub/GitLab, нажмите New Pull Request. Выберите свою ветку и ветку назначения (main/master). Опишите изменения и запросите ревью. После одобрения PR будет слит без необходимости force push. Это безопасный и рекомендуемыйworkflow.

Ошибка git push rejected возникает, когда удалённая ветка содержит коммиты, которых нет в вашей локальной копии. Git отказывается перезаписывать историю, чтобы не потерять чужие изменения. Решение: pull перед push или force push (осторожно).

Non-fast-forward — что это значит

Non-fast-forward означает, что ваша локальная ветка отстаёт от удалённой. Кто-то (или вы на другой машине) запустил push до вас. Git предлагает сначала подтянуть удалённые изменения: git pull, затем снова push. Это самый безопасный вариант.

Проверка состояния репозитория

Выполните git status для просмотра текущего состояния.git log —oneline -10 покажет последние 10 коммитов. git remote -v — URL удалённого репозитория. Если репозиторий повреждён: git fsck —full. Это проверит целостность объектов Git.

Откат изменений

Для отката незакоммиченных изменений: git checkout — имя-файла. Для отката коммита: git revert КОММИТ (создаёт новый коммит, отменяющий изменения). Для опасного отката: git reset —hard КОММИТ (перезаписывает историю). Используйтеgit reflog для поиска потерянных коммитов.

Работа с ветками

Список веток: git branch -a. Создание: git branch имя-ветки. Переключение: git checkout имя-ветки (или git switch). Слияние: git merge имя-ветки. Удаление: git branch -d имя-ветки (безопасное) или git branch -D (принудительное). Переименование: git branch -m старое имя новое.

Настройка удалённого репозитория

Проверьте URL: git remote -v. Измените: git remote set-url origin URL. Добавьте: git remote add upstream URL. Скачайте изменения: git fetch origin. Загрузите: git pull origin ветка. Отправьте: git push origin ветка. Для первого push: git push -u origin ветка (установит tracking).

Разрешение конфликтов

При конфликте: git status покажет конфликтные файлы. Откройте файл, найдите маркеры <<<<<<<, =======, >>>>>>>. Выберите нужную версию, удалите маркеры. Добавьте: git add имя-файла. Завершите: git commit. Для отмены слияния: git merge —abort. Для использования инструмента: git mergetool.

Источники

  1. stackoverflow.com — проверено 02.06.2026
  2. stackoverflow.com — проверено 02.06.2026
  3. docs.github.com — проверено 02.06.2026
  4. atlassian.com — проверено 02.06.2026