#Что означает ошибка
failed to push some refs
Git отправил коммиты, но сервер (GitHub, GitLab, Gitea) их не принял. Причину сообщает сам сервер в строках, начинающихся с remote: — они находятся выше итоговой фразы failed to push some refs. Не игнорируйте их: там обычно написано protected branch, file exceeds, permission denied или pre-receive hook declined.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
Защищённая веткаПрямой push в main запрещён. | remote: error: GH006: Protected branch update failed. | Создайте ветку и pull request. |
| Нет правНет прав записи в репозиторий. | remote: Permission denied. | Получите права или форкните. |
| Слишком большой файлФайл больше лимита (100 МБ на GitHub). | remote: error: File ... is 120 MB. | Используйте Git LFS или удалите файл из истории. |
| Хук сервераСерверный хук отклонил коммит. | pre-receive hook declined. | Прочитайте причину хука. |
#Пошаговое решение
- Прочитайте строки remoteВ терминале проекта откройте полный вывод неудачного
git pushи найдите несколько строк вышеfailed to push some refs, особенно сообщенияremote:и! [remote rejected]. Скопируйте точную причину, не включая токены доступа. Выполнитеgit status -sb,git branch --show-currentиgit remote -v, сверьте текущую ветку и адрес репозитория с веб-страницей проекта. Не начинайте сgit pull --rebase: ошибка может относиться к защищённой ветке, размеру файла или серверному правилу, и объединение истории её не исправит. - Для устаревшей ветки сделайте pullЕсли в выводе есть
non-fast-forwardилиfetch first, а неremote rejected, выполнитеgit fetch origin, затемgit log --oneline --graph --decorate --all -n 30. Проверьте новые коммиты в соответствующей удалённой ветке и собственные незакоммиченные изменения. При сохранённой работе и согласованной политике команды можно выполнитьgit rebase origin/ИМЯ_ВЕТКИлибо слияние; это альтернативы. При конфликте посмотритеgit status, исправьте отмеченные файлы, выполнитеgit addиgit rebase --continueили отменитеgit rebase --abort. Не используйтеreset --hardиforce. - Для защищённой ветки создайте веткуЕсли сервер пишет
protected branchилиGH006, прямой push запрещён правилом проекта. В терминале создайте новую ветку от текущих коммитов:git switch -c fix/my-change, где имя выбрано вами и ещё не занято. Выполнитеgit push -u origin fix/my-change, затем на сайте GitHub/GitLab откройте предложение создания запроса на слияние и отправьте его на проверку. Если ветка уже существует, выберите другое имя вместо принудительного переименования. Не отключайте защиту основной ветки ради одной публикации. - Проверьте праваЕсли вывод сообщает о недостаточных правах, убедитесь, что
git remote -vуказывает на ваш проект, а вы вошли в правильную учётную запись. В веб-интерфейсе проверьте роль участника и ограничения ветки; попросите владельца предоставить доступ либо создайте копию репозитория (fork) и отправьте запрос на слияние. При HTTPS используйте поддерживаемый менеджер учётных данных или токен с минимальными разрешениями, а при SSH — проверьтеssh -T git@github.comдля GitHub. Не записывайте токен в URL репозитория или файл с исходным кодом. - Для больших файлов используйте LFSЕсли сервер отклоняет файл по лимиту размера, найдите его имя в строке
remote:и проверьте, попал ли файл в историю коммитов; удаление его только из текущей папки не убирает его из предыдущих коммитов. Для нового проекта используйте Git LFS по документации хостинга, если это разрешено, либо исправьте историю в отдельной копии после резервного сохранения и согласования с командой. Не запускайте массовое переписывание истории чужой ветки. Повторите push только после проверки нового размера и правил проекта. - Удалите секретыЕсли сервер пишет о найденном секрете, сразу считайте ключ скомпрометированным: отзовите его в системе выдачи, создайте новый, уберите секрет из файлов и истории по согласованной процедуре. Простое добавление файла в
.gitignoreне убирает уже отправленные коммиты. Проверьте правила защиты секретов и используйте переменные окружения или хранилище секретов. Не отправляйте один и тот же пароль повторно, пытаясь подобрать флаг обхода. - Не используйте force без необходимостиПосле устранения именно вашей причины повторите
git statusи обычнуюgit push -u origin ИМЯ_ВЕТКИс реальным именем; успех — сообщение об обновлении удалённой ветки и появление коммита на сайте.git push --forceи--force-with-leaseне являются универсальным исправлением отклонённого push: они не обходят защищённую ветку, правила безопасности или отсутствие прав, но способны переписать историю. Если сервер продолжает отклонять запись, сохраните строкиremote:для администратора репозитория. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
Для GitHub лимит — 100 МБ на файл и 5 ГБ на репозиторий; для GitLab настраивается администратором. Если вы пушите по HTTPS с паролем, он больше не принимается: создайте персональный токен (PAT) на . Справка по Git — .