#Что означает проблема
Когда другой участник добавил коммиты в ту же удалённую ветку, Git не разрешает обычной отправкой заменить её вершину. У этой статьи узкий сценарий: ваши локальные коммиты нужно СОХРАНИТЬ, а изменения коллег включить в ту же ветку. Если сервер пишет remote rejected, protected branch или permission denied, это другая неисправность.
#Как отличить причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Коллега отправил изменения раньшеИстория на сервере уже содержит коммиты, отсутствующие локально. | В git log HEAD..origin/имя есть коммиты после git fetch. | Сравнить истории, объединить изменения без перезаписи сервера. |
| Ветку обновили другим способомНа сервер попала новая история, например после перебазирования или принудительной отправки сотрудником. | Общая база может существовать, но обе стороны расходятся сильнее ожидаемого. | Остановить отправку и уточнить у команды, нельзя ли потерять чужую работу. |
| Вы отправляете не тудаТекущая ветка может отслеживать другое ответвление или другой сервер. | git status -sb и git branch -vv показывают неожиданное имя upstream. | Выяснить целевую ветку до объединения. |
#Пошаговая диагностика и решение
- Откройте терминал в нужном проекте и сохраните работуВ VS Code выберите «Терминал» → «Создать терминал»; в Windows можно открыть Git Bash в папке проекта, в Linux/macOS — обычный Терминал. Для штатного Git права администратора не нужны. Сначала запустите
git status -sb; если вывод содержитmodifiedилиuntracked, сохраните нужные файлы отдельным коммитом на своей рабочей ветке либо сделайте внешнюю копию. Не начинайте объединение с неучтёнными правками. Перед остальными командами выполнитеgit --version: в ответ должна появиться установленная версия Git. Если терминал сообщает, чтоgitне найден, проверьте установку Git и доступность команды в этом терминале; не продолжайте операции наугад. - Узнайте фактическую ветку и адрес отправкиВ том же окне выполните
git branch -vvиgit remote -v. Звёздочка отмечает текущую ветку; рядом может быть[origin/feature]. Вremote -vесть адреса дляfetchиpush. Если там чужой проект или веткаmainвместо вашейfeature, ничего не отправляйте. В дальнейшем примеры подразумевают, что вы уже стоите в правильной ветке и её сервер —origin. - Обновите только сведения о сервере, не меняя свои файлыВведите
git fetch origin. Эта команда скачивает коммиты и обновляет ссылки видаorigin/feature, но сама не сливает их с вашими файлами. Если Git требует войти в учётную запись, используйте штатный способ авторизации. При ошибке доступа сначала восстановите права и связь: команда не должна выполняться многократно с отключённой проверкой сертификатов. - Сравните, какие изменения есть только на одной сторонеВыполните
git status -sbиgit log --oneline --left-right HEAD...@{upstream}. Вторая команда требует настроенной отслеживаемой ветки: слева (<) — только ваши коммиты, справа (>) — только серверные. Если написаноno upstream configured, уточните имя удалённой ветки черезgit branch -rи сравнитеHEAD...origin/feature, заменивfeatureреальным именем. Не пытайтесь решить проблему принудительной отправкой. - Получите изменения коллег с обычным объединениемЕсли обе истории имеют общую основу и вы согласовали объединение, на текущей рабочей ветке введите
git merge @{upstream}. Это сохраняет обе истории и при необходимости создаёт коммит слияния. Если Git сообщаетAlready up to date, в вашей ветке уже есть обновления и нужно проверить, куда был направленpush. Если есть CONFLICT, остановитесь и разберите конфликтующие файлы в редакторе; Git не отправит конфликтную версию сам. - Разрешите конфликт, если он возникВ VS Code откройте «Система управления версиями» (Ctrl+Shift+G) и файл с пометкой конфликта. Сравните обе стороны, выберите либо объедините смысловые изменения и удалите служебные метки
<<<<<<<,=======,>>>>>>>. Проверьте программу или тесты. Затем сохраните файл, выполнитеgit addтолько для исправленных путей иgit commitдля завершения слияния, если Git не завершил его сам. При сомнениях до создания коммита используйтеgit merge --abort: попытка возврата может не восстановить уже вручную изменённые файлы, поэтому нужна копия. - Повторите отправку и посмотрите результатПосле
git status -sbи проверки тестов выполнитеgit pushна своей отслеживаемой ветке. Успех — строка обновления диапазона коммитов либоEverything up-to-date; затемgit fetch originиgit status -sbдолжны показать отсутствие расхождения. Если снова отказ, кто-то мог отправить новый коммит за время работы: повторите получение и сравнение, не используйте--force.
#Команды для проверки и исправления
-s — краткая сводка, -b — имя ветки; -vv — отслеживаемая ветка и последние коммиты. Ничего не меняют.git status -sbgit branch -vvgit remote -vfetch обновляет сведения о сервере; --left-right делит уникальные коммиты на стороны. В PowerShell для выражения @{upstream} при разборе оболочкой используйте кавычки: "HEAD...@{upstream}". Если upstream не задан, сначала выясните соответствующую ветку.git fetch origingit log --oneline --left-right HEAD...@{upstream}merge может создать новый коммит или конфликт, поэтому риск средний; объединяемая ветка должна быть своей доверенной веткой.git merge "@{upstream}"Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
--force.git pushКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат и что делать, если не помогло
Успешная отправка подтверждается git status -sb (нет [ahead]/[behind] относительно нужного сервера) и наличием ваших коммитов на странице ветки в GitHub/GitLab. Если проблема повторяется, сохраните полный отказ и сравнение git log для администратора репозитория; при protected branch может понадобиться запрос на включение изменений.