↓Перейти к содержанию
  1. Git: руководства и команды/

Ошибка «failed to push some refs to» в Git

·8 минут·

Вы пытаетесь отправить изменения на сервер командой git push, но получаете загадочную ошибку “failed to push some refs to”. Эта проблема одна из самых распространённых в Git, но решается довольно просто — нужно только понять, какая именно причина в вашем случае. В этой статье я разберу все возможные варианты и покажу, как их исправить.

Что означает ошибка “failed to push some refs to” #

Эта ошибка возникает, когда Git пытается отправить ваши локальные коммиты на удалённый сервер (GitHub, GitLab, Bitbucket и т.д.), но сервер отклоняет операцию push.

Полный текст ошибки выглядит так:

To github.com:username/repository.git
 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to '[email protected]:username/repository.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.

Главное правило: push был отклонён, потому что на сервере есть коммиты, которых нет в вашей локальной ветке. Git не разрешает перезаписывать чужие коммиты просто так — это защита от случайной потери данных.

Но причины могут быть разные. Давайте разберём каждую.

Причина 1: Remote обогнал local (расхождение истории) #

Это самая частая причина. Возникает, когда во время вашей работы кто-то другой (или вы сами с другого компьютера) уже запушил коммиты в ту же ветку.

Как это происходит #

  1. Вы начали работать на ветке main
  2. Сделали несколько коммитов локально
  3. В это время коллега запушил свои коммиты на main
  4. Теперь история на сервере и у вас расходится
  5. Git не знает, как примирить эти два потока коммитов

Решение: Git Pull с Rebase (рекомендуется) #

Самый чистый способ — использовать git pull --rebase:

git pull --rebase origin main

Эта команда:

  1. Скачивает актуальную историю с сервера (git fetch)
  2. Перемещает ваши коммиты поверх новых коммитов с сервера (rebase)
  3. История остаётся линейной, без лишних merge-коммитов

Если возникли конфликты, Git подскажет, какие файлы нужно отредактировать. Отредактируйте их, затем:

git add .
git rebase --continue

После этого push пройдёт без проблем:

git push origin main

Альтернатива: Git Pull с Merge #

Если вам не нравится rebase, используйте обычный merge:

git pull origin main

Git автоматически создаст merge-коммит, который объединит две ветки истории. Это безопаснее, но история становится более запутанной.

Если есть конфликты:

# Редактируете файлы вручную
git add .
git commit -m "Merge branch 'main' of origin"
git push origin main

Когда использовать rebase, когда merge? #

Используйте rebase если:

  • Вы работаете в feature-ветке и хотите включить в неё свежие коммиты из main
  • Хотите, чтобы история была чистой и линейной
  • Коммиты ещё не опубликованы на сервере

Используйте merge если:

  • Вы работаете в главной ветке команды
  • Коммиты уже опубликованы и другие их используют
  • Хотите оставить полную историю слияний

Причина 2: Branch protection rules (GitHub/GitLab) #

На GitHub, GitLab и других платформах администратор может включить правила защиты ветки. Это не позволяет напрямую пушить в основные ветки (обычно main или master).

Как выглядит ошибка #

remote: error: GH006: Protected branch rule violations found for refs/heads/main.
remote: error: At least 1 approving review is required

или

! [remote rejected] main -> main (protected branch hook declined)
error: failed to push some refs to '[email protected]:username/repository.git'

Почему это делается #

Branch protection нужна, чтобы:

  • Не один человек не мог случайно сломать production-код
  • Все изменения проходили code review
  • Автоматические тесты гарантировали качество

Как исправить #

Есть два варианта:

Вариант 1: Создать Pull Request (рекомендуется)

# Пушьте в отдельную ветку
git push origin feature/my-feature

# Затем создайте PR на GitHub/GitLab через веб-интерфейс

Когда PR пройдёт review и тесты, admin или кто-то с нужными правами может merge в main.

Вариант 2: Обратиться к администратору

Если вам нужны права напрямую пушить в защищённую ветку, попросите admin добавить вас в список исключений. Но это не рекомендуется — защита ветки существует именно для безопасности.

Причина 3: Запрет force push #

Иногда вам нужно переписать историю коммитов (например, используя git rebase -i или git commit --amend). Если вы это сделали, обычный git push не сработает:

! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to '[email protected]:username/repository.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote-tracking branch.

Когда нужен force push #

  • Вы изменили последний коммит через git commit --amend
  • Вы переписали историю через git rebase -i
  • Вы хотите отменить merge с git revert

Безопасная альтернатива: force-with-lease #

Вместо опасного git push --force, используйте:

git push --force-with-lease origin main

Этот вариант отклонит push, если на сервере появились новые коммиты от других людей. Это защитит вас от случайной потери чужой работы.

Когда нужен обычный force push #

git push --force origin main

Используйте только если вы уверены, что никто другой не делал коммитов параллельно. Это опасно!

Причина 4: Файл превышает лимит размера #

GitHub не разрешает пушить файлы больше 100 MB. GitLab по умолчанию ограничен 5 GB, но часто снижается на 500 MB.

Как обнаружить большой файл #

git log --stat

Эта команда покажет все файлы в коммитах. Если размер скачиваемого pack-файла близок к лимиту, проблема в размере.

Или используйте специальный скрипт:

# Найти 10 самых больших файлов в истории
git rev-list --all --objects | \
  sed -n $(git rev-list --objects --all | \
  cut -f1 -d' ' | \
  git cat-file --batch-check | \
  grep blob | \
  sort -k3 -n | \
  tail -10 | \
  while read hash type size; do \
    echo -n "-e s/$hash/$size/p "; \
  done) | \
  cut -d' ' -f2- | \
  sort -k1 -n

Решение 1: Git LFS (рекомендуется) #

Git LFS (Large File Storage) хранит большие файлы отдельно:

# Установите Git LFS
git lfs install

# Отслеживайте большие файлы
git lfs track "*.zip"
git lfs track "*.mp4"
git lfs track "*.psd"

# Добавьте изменения
git add .gitattributes
git commit -m "Setup Git LFS"

# Теперь большие файлы будут сжиматься автоматически
git push origin main

На GitHub LFS бесплатен до 1 GB в месяц.

Решение 2: Удалить файл из истории #

Если файл был случайно залит, удалите его:

# Используйте git filter-repo (новый инструмент)
git filter-repo --path path/to/large/file --invert-paths

# или старый способ (git filter-branch)
git filter-branch --tree-filter 'rm -rf path/to/large/file' HEAD

# Затем force push
git push --force-with-lease origin main

Важно: после удаления файла из истории сообщите всем коллегам, чтобы они обновили свои локальные репозитории. Иначе у них останутся старые коммиты с большим файлом.

Причина 5: Pre-receive hook отклонил push #

На сервере может быть установлен скрипт (pre-receive hook), который отклоняет push в определённых случаях:

remote: error: Push rejected by hook
remote: Your branch does not follow our naming policy
remote: Commit messages must match pattern: "TICKET-\d+: .*"

Подробнее об этой проблеме читайте в статье /ru/git/oshibka-pre-receive-hook/.

Сравнение с похожими ошибками: “rejected” vs “failed to push” #

Может возникнуть путаница с похожими ошибками:

ОшибкаПричинаРешение
[rejected] ... (non-fast-forward)Расхождение историиgit pull --rebase
[rejected] ... (protected branch)Branch protectionСоздайте PR
[rejected] ... (hook declined)Pre-receive hookПроверьте требования сервера
failed to push some refs toЛюбая из выше перечисленныхСмотрите полное сообщение об ошибке

Ключ к решению — внимательно прочитайте полное сообщение об ошибке. В нём Git обычно подсказывает, что делать.

FAQ: Часто задаваемые вопросы #

Что значит “failed to push some refs to origin”? #

Это означает, что Git не смог отправить ваши коммиты на сервер. “refs” — это ветки и теги. “Some” значит, что одна или несколько веток не прошли. Сервер отклонил операцию, потому что что-то не так с историей коммитов, правами доступа или правилами сервера.

Как исправить ошибку git push? #

Зависит от причины. Сначала внимательно прочитайте сообщение об ошибке:

  • Если написано “fetch first” — используйте git pull --rebase origin [branch]
  • Если “protected branch” — создайте PR вместо direct push
  • Если “non-fast-forward” — используйте git push --force-with-lease
  • Если “hook declined” — проверьте требования сервера

Почему git push не работает? #

Причины:

  1. У вас нет доступа к репозиторию (проверьте SSH-ключ)
  2. История расходится (pull + rebase)
  3. Branch защищена (используйте PR)
  4. Файл слишком большой (Git LFS)
  5. Сервер отклонил по какому-то правилу (проверьте сообщение об ошибке)

Как запушить когда remote впереди? #

# Скачиваем новые коммиты с сервера
git fetch origin

# Перемещаем наши коммиты поверх новых
git rebase origin/main

# Если были конфликты, разрешаем их
# git add .
# git rebase --continue

# Пушим результат
git push origin main

Что такое branch protection? #

Это правила на GitHub/GitLab, которые запрещают напрямую пушить в критически важные ветки (обычно main). Вместо этого нужно создавать Pull Request, который проходит review и автоматические проверки. Это защита от случайных ошибок в production-коде.

Как обойти ограничение размера файла на GitHub? #

Есть три способа:

  1. Git LFS — сжимает большие файлы: git lfs track "*.zip"
  2. Удалить файл из истории — если файл был залит ошибкой: git filter-repo --path path/to/file --invert-paths
  3. Использовать другой хостинг — некоторые платформы позволяют более крупные файлы

Трюки и советы #

Автоматическая переконфигурация pull #

Чтобы git pull всегда использовал rebase (как это рекомендуется):

git config --global pull.rebase true

Просмотр истории перед pull #

Перед тем как делать pull, посмотрите, что будет скачано:

git fetch origin
git log --oneline main..origin/main

Это покажет коммиты, которые есть на сервере, но нет у вас.

Безопасный force push с проверкой #

Всегда используйте --force-with-lease вместо просто --force:

git push --force-with-lease origin main

Это отклонит push, если на сервере кто-то что-то изменил.

Заключение #

Ошибка “failed to push some refs to” почти всегда решается одним из описанных выше методов. Главное:

  1. Прочитайте полное сообщение об ошибке — часто сам Git подсказывает решение
  2. Чаще всего нужен git pull --rebase — это решает 80% проблем
  3. Используйте --force-with-lease вместо --force — это безопаснее
  4. Если branch защищена — создавайте PR, а не force push
  5. Git LFS для больших файлов — это спасает при работе с бинарными файлами

Теперь вы готовы справиться с этой ошибкой! Если что-то всё ещё не работает, проверьте, что у вас есть правильный доступ к репозиторию и что SSH-ключ настроен корректно.