git push rejected: как исправить ошибку отклонения отправки
Пошаговое руководство по устранению ошибки git push rejected: non-fast-forward,force push, pull перед push и защита веток.
Симптомы
- ! [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 в защищённую ветку
- Несогласованные изменения в индексе
Пошаговое решение
Пull перед push
Самое простое решение — выполнить git pull перед push. Это скачает удалённые изменения и объединит их с вашими: git pull origin master --rebase. Флаг --rebase пере replay ваши коммиты поверх удалённых, чтобы история была линейной. Если возникнут конфликты, разрешите их и выполните git rebase --continue. После этого push сработает.
git pull origin master --rebase Выполните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 Проверьте защиту веток
Если push rejected с сообщением branch is protected, проверьте настройки в GitHub/GitLab. Перейдите в Settings > Branches > Branch protection rules. Убедитесь, что у вас есть права на force push или что ветка не требует PR. Для обхода временно снимите protection (если у вас есть доступ) или создайте Pull Request.
Синхронизируйте с удалённым репозиторием
Выполните git fetch origin для скачивания информации об удалённых изменениях без объединения. Затем git log master..origin/master покажет, какие коммиты есть на удалённом сервере, но нет у вас. Это поможет понять, что именно нужно подтянуть. После анализа сделайте git merge origin/master или git rebase origin/master.
git fetch origin && git log master..origin/master Проверьте текущую ветку
Убедитесь, что вы в правильной ветке: 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 Создайте 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.
Источники
- stackoverflow.com — проверено 02.06.2026
- stackoverflow.com — проверено 02.06.2026
- docs.github.com — проверено 02.06.2026
- atlassian.com — проверено 02.06.2026