#Как проявляется ошибка и когда применим способ
Случайно удалённую локальную ветку нередко можно восстановить, если её коммиты ещё есть в истории других ссылок или reflog. Восстановление зависит от времени и сборки мусора Git; одно лишь имя удалённой ветки не гарантирует сохранение её коммитов.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Коммиты ещё доступныУдалена ссылка ветки, но объект последнего коммита существует. | git reflog или история других веток содержит нужный хеш. | Создать новую ветку на найденном коммите. |
| Ветка уже была на сервереЛокальная ссылка удалена, но origin/ветка существует. | git branch -r показывает нужное имя. | Создать отслеживаемую локальную ветку. |
#Пошаговая диагностика и решение
- 1. Немедленно прекратите очистку и упаковку репозиторияНе запускайте git gc --prune=now и не удаляйте .git. Скопируйте весь репозиторий с .git в отдельное место, прежде чем экспериментировать. Если удаление было сделано недавно, reflog может сохранить полезные записи, но срок хранения не бесконечен.
- 2. Проверьте удалённые и локальные ссылкиВ каталоге проекта откройте терминал и выполните git branch -a. Если нужная ветка показана как remotes/origin/ИМЯ, создайте локальную через git switch --track origin/ИМЯ, заменив имя. Не создавайте ветку на случайном коммите с похожим сообщением.
- Только чтение списка веток, включая удалённые ссылкиLinux · Терминал (Bash)КомандаТолько чтение списка веток, включая удалённые ссылки.
git branch -a
- 3. Изучите журнал перемещений HEADВыполните git reflog --date=iso и внимательно прочитайте записи checkout/switch/commit. Найдите последний коммит нужной ветки до удаления, запишите полный или сокращённый однозначный хеш. Если reflog не содержит искомую запись, используйте историю других клонов, резервные копии или журнал CI.
- Читает локальный reflog; не изменяет репозиторийLinux · Терминал (Bash)КомандаЧитает локальный reflog; не изменяет репозиторий.
git reflog --date=iso
- 4. Проверьте найденный коммит без переключенияДля конкретного ХЕШ запустите git show --stat ХЕШ. Посмотрите имя проекта, список изменённых файлов и дату, а при необходимости откройте diff. Если содержимое не соответствует утраченной ветке, продолжайте поиск, не создавая ветку вслепую.
- Замените ХЕШ идентификатором из reflog; показывает выбранный коммитLinux · Терминал (Bash)КомандаЗамените ХЕШ идентификатором из reflog; показывает выбранный коммит.
git show --stat ХЕШ
- 5. Восстановите ссылку на подтверждённый коммитКогда хеш подтверждён, выполните git branch ВОССТАНОВЛЕННАЯ_ВЕТКА ХЕШ. Это создаст новую локальную ветку на существующем коммите, не переписывая файлы текущей ветки. Проверьте отсутствие ветки с таким именем до выполнения.
- Создаёт локальную ветку recovered-feature на найденном коммите; замените ХЕШLinux · Терминал (Bash)КомандаСоздаёт локальную ветку recovered-feature на найденном коммите; замените ХЕШ.
git branch recovered-feature ХЕШ
- 6. Откройте восстановленную ветку и проверьте проектПри чистом рабочем дереве переключитесь git switch recovered-feature, затем сравните лог и необходимые файлы. Если есть незакоммиченные правки, прежде сохраните их; переключение может быть заблокировано, чтобы не потерять данные.
- Изменяет рабочую ветку; запускайте только после резервной копии и чистого statusLinux · Терминал (Bash)С осторожностьюИзменяет рабочую ветку; запускайте только после резервной копии и чистого status.
git switch recovered-featuregit log -5 --onelineКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 7. Зафиксируйте восстановление безопасноЕсли восстановленные изменения ценны, создайте резервную ветку или отметьте коммит в личной копии, прежде чем делать merge или push. Если reflog ничего не показывает и серверной копии нет, восстановление не гарантируется: не запускайте агрессивные команды очистки для «поиска».
#Проверка результата и действия при повторении
Успех: восстановленная локальная ветка указывает на проверенный коммит, файлы и история содержат нужные изменения. Если ветка существовала на сервере, дополнительно сверьте upstream перед публикацией.
Если на указанном шаге результат отличается, остановитесь и запишите первое полное сообщение об ошибке, версию инструментов и проверенное состояние до исправления. Не переходите к опасным действиям на действующем проекте: повторите проверку на отдельной копии, верните сохранённые файлы и только затем выбирайте следующую причину.