Git WindowsLinuxmacOS

Git: non-fast-forward при отправке локальной ветки с новыми коммитами на сервер

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

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

Когда другой участник добавил коммиты в ту же удалённую ветку, Git не разрешает обычной отправкой заменить её вершину. У этой статьи узкий сценарий: ваши локальные коммиты нужно СОХРАНИТЬ, а изменения коллег включить в ту же ветку. Если сервер пишет remote rejected, protected branch или permission denied, это другая неисправность.

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

#Что означает проблема

Когда другой участник добавил коммиты в ту же удалённую ветку, Git не разрешает обычной отправкой заменить её вершину. У этой статьи узкий сценарий: ваши локальные коммиты нужно СОХРАНИТЬ, а изменения коллег включить в ту же ветку. Если сервер пишет remote rejected, protected branch или permission denied, это другая неисправность.

#Как отличить причины

Возможная причинаКак узнатьЧто делать
Коллега отправил изменения раньшеИстория на сервере уже содержит коммиты, отсутствующие локально.В git log HEAD..origin/имя есть коммиты после git fetch.Сравнить истории, объединить изменения без перезаписи сервера.
Ветку обновили другим способомНа сервер попала новая история, например после перебазирования или принудительной отправки сотрудником.Общая база может существовать, но обе стороны расходятся сильнее ожидаемого.Остановить отправку и уточнить у команды, нельзя ли потерять чужую работу.
Вы отправляете не тудаТекущая ветка может отслеживать другое ответвление или другой сервер.git status -sb и git branch -vv показывают неожиданное имя upstream.Выяснить целевую ветку до объединения.

#Пошаговая диагностика и решение

  1. Откройте терминал в нужном проекте и сохраните работуВ VS Code выберите «Терминал» → «Создать терминал»; в Windows можно открыть Git Bash в папке проекта, в Linux/macOS — обычный Терминал. Для штатного Git права администратора не нужны. Сначала запустите git status -sb; если вывод содержит modified или untracked, сохраните нужные файлы отдельным коммитом на своей рабочей ветке либо сделайте внешнюю копию. Не начинайте объединение с неучтёнными правками. Перед остальными командами выполните git --version: в ответ должна появиться установленная версия Git. Если терминал сообщает, что git не найден, проверьте установку Git и доступность команды в этом терминале; не продолжайте операции наугад.
  2. Узнайте фактическую ветку и адрес отправкиВ том же окне выполните git branch -vv и git remote -v. Звёздочка отмечает текущую ветку; рядом может быть [origin/feature]. В remote -v есть адреса для fetch и push. Если там чужой проект или ветка main вместо вашей feature, ничего не отправляйте. В дальнейшем примеры подразумевают, что вы уже стоите в правильной ветке и её сервер — origin.
  3. Обновите только сведения о сервере, не меняя свои файлыВведите git fetch origin. Эта команда скачивает коммиты и обновляет ссылки вида origin/feature, но сама не сливает их с вашими файлами. Если Git требует войти в учётную запись, используйте штатный способ авторизации. При ошибке доступа сначала восстановите права и связь: команда не должна выполняться многократно с отключённой проверкой сертификатов.
  4. Сравните, какие изменения есть только на одной сторонеВыполните git status -sb и git log --oneline --left-right HEAD...@{upstream}. Вторая команда требует настроенной отслеживаемой ветки: слева (<) — только ваши коммиты, справа (>) — только серверные. Если написано no upstream configured, уточните имя удалённой ветки через git branch -r и сравните HEAD...origin/feature, заменив feature реальным именем. Не пытайтесь решить проблему принудительной отправкой.
  5. Получите изменения коллег с обычным объединениемЕсли обе истории имеют общую основу и вы согласовали объединение, на текущей рабочей ветке введите git merge @{upstream}. Это сохраняет обе истории и при необходимости создаёт коммит слияния. Если Git сообщает Already up to date, в вашей ветке уже есть обновления и нужно проверить, куда был направлен push. Если есть CONFLICT, остановитесь и разберите конфликтующие файлы в редакторе; Git не отправит конфликтную версию сам.
  6. Разрешите конфликт, если он возникВ VS Code откройте «Система управления версиями» (Ctrl+Shift+G) и файл с пометкой конфликта. Сравните обе стороны, выберите либо объедините смысловые изменения и удалите служебные метки <<<<<<<, =======, >>>>>>>. Проверьте программу или тесты. Затем сохраните файл, выполните git add только для исправленных путей и git commit для завершения слияния, если Git не завершил его сам. При сомнениях до создания коммита используйте git merge --abort: попытка возврата может не восстановить уже вручную изменённые файлы, поэтому нужна копия.
  7. Повторите отправку и посмотрите результатПосле git status -sb и проверки тестов выполните git push на своей отслеживаемой ветке. Успех — строка обновления диапазона коммитов либо Everything up-to-date; затем git fetch origin и git status -sb должны показать отсутствие расхождения. Если снова отказ, кто-то мог отправить новый коммит за время работы: повторите получение и сравнение, не используйте --force.

#Команды для проверки и исправления

Linux · Терминал (Bash)Команда
Все три команды запускаются в терминале корня проекта от обычного пользователя. -s — краткая сводка, -b — имя ветки; -vv — отслеживаемая ветка и последние коммиты. Ничего не меняют.
git status -sb
git branch -vv
git remote -v
Linux · Терминал (Bash)Команда
Команды запускают по очереди, не склеивая строки. fetch обновляет сведения о сервере; --left-right делит уникальные коммиты на стороны. В PowerShell для выражения @{upstream} при разборе оболочкой используйте кавычки: "HEAD...@{upstream}". Если upstream не задан, сначала выясните соответствующую ветку.
git fetch origin
git log --oneline --left-right HEAD...@{upstream}
Linux · Терминал (Bash)С осторожностью
Применять только после сравнения истории и с чистым деревом. merge может создать новый коммит или конфликт, поэтому риск средний; объединяемая ветка должна быть своей доверенной веткой.
git merge "@{upstream}"

Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

Linux · Терминал (Bash)С осторожностью
Отправляет текущую ветку, если у неё настроен upstream. Проверьте адрес и полномочия; не добавляйте --force.
git push

Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

#Как проверить результат и что делать, если не помогло

Успешная отправка подтверждается git status -sb (нет [ahead]/[behind] относительно нужного сервера) и наличием ваших коммитов на странице ветки в GitHub/GitLab. Если проблема повторяется, сохраните полный отказ и сравнение git log для администратора репозитория; при protected branch может понадобиться запрос на включение изменений.

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

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