#Как выглядит неисправность
Принудительное обновление ветки Git опасно: оно способно скрыть или удалить чужие коммиты из видимой истории. Перед действием обязательно сравнивают локальную и удалённую ветки, проверяют защиту и используют --force-with-lease только по согласованию.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Удалённая ветка изменена коллегойПосле последнего fetch появились новые коммиты на сервере | git log показывает коммиты только справа | Не перезаписывать, запросить согласование |
| Локальная история переписана rebaseХэши локальных коммитов стали другими | Левый список содержит новые коммиты и старые заменены | Оценить право на перезапись, зафиксировать точку отката |
#Пошаговое устранение
- 1. Выберите конкретную ветку и сохраните состояниеОткройте терминал из репозитория, запустите git status и git branch --show-current. Убедитесь, что нет незакоммиченных изменений; запишите текущий хэш через git rev-parse HEAD.
- Только чтение; фиксирует локальную точку перед анализомLinux · Терминал (Bash)КомандаТолько чтение; фиксирует локальную точку перед анализом.
git statusgit branch --show-currentgit rev-parse HEAD
- 2. Обновите сведения о сервереВыполните git fetch origin, затем git branch -vv. Это не меняет рабочую ветку, но обновляет сведения о ветках на сервере. Если fetch не работает, не выполняйте принудительную отправку.
- Получение метаданных и объектов; без слияния с текущей веткойLinux · Терминал (Bash)КомандаПолучение метаданных и объектов; без слияния с текущей веткой.
git fetch origingit branch -vv
- 3. Сравните коммиты в обе стороныЗамените main на вашу ветку: git log --oneline --left-right HEAD...origin/main. Слева показаны коммиты только локально, справа — только удалённо; наличие любых чужих справа требует остановки и согласования.
- Подставьте реальное имя веткиLinux · Терминал (Bash)КомандаПодставьте реальное имя ветки. Команда не меняет историю.
git log --oneline --left-right HEAD...origin/main
- 4. Создайте резервную ссылку на текущий коммитВыполните git branch backup-before-push-20261102 HEAD. Она сохранит локальную ссылку на исходный коммит; у коллег на сервере это не создаёт резервной копии. Для удалённого состояния попросите администратора создать защищённую ветку/тег.
- Создаёт локальную ветку; назовите её уникально для вашего случаяLinux · Терминал (Bash)С осторожностьюСоздаёт локальную ветку; назовите её уникально для вашего случая.
git branch backup-before-push-20261102 HEADКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 5. Проверьте разрешение на изменение историиУточните у владельца репозитория, допускается ли перезапись именно этой ветки и нет ли незавершённых запросов на слияние. Если нет письменного согласования — остановитесь: безопаснее создать новую ветку и запрос на слияние.
- 6. Если разрешено, используйте точечную защитуПо возможности зафиксируйте ожидаемый хэш удалённой ветки и выполните git push --force-with-lease=refs/heads/main:ОЖИДАЕМЫЙ_ХЭШ origin HEAD:refs/heads/main. Не запускайте пример буквально: два значения заменяются после согласования. При отказе lease повторите проверку коммитов, не заменяйте команду на --force.
- Дополнительная команда по темеLinux · Терминал (Bash)Риск потери данныхКритическое изменение общей истории, только при разрешении владельца репозитория и после проверки хэша; подставить свои значения.
git push --force-with-lease=refs/heads/main:ОЖИДАЕМЫЙ_ХЭШ origin HEAD:refs/heads/mainЭта команда может привести к потере данных или существенным изменениям. Проверьте параметры, резервную копию и возможность отката.
#Как проверить результат
Сверьте git ls-remote origin refs/heads/main с запланированным хэшем и попросите коллег проверить свои клоны. При отказе сервера или неожиданном расхождении историю не переписывайте.
#Если проблема осталась
Не повторяйте опасные действия на рабочем окружении. Сравните первоначальный симптом с новым состоянием, сохраните обезличенные сообщения и версии компонентов, проверьте резервную копию; перед изменением общей истории Git или данных/сети Docker обратитесь к ответственному администратору проекта.