Git Reflog и восстановление истории
Освойте `git reflog`, чтобы восстанавливать потерянные фиксации или ветки и иметь надёжную страховку для своей работы.
«Git Reflog и восстановление истории» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.
Что такое Git Reflog?
Случайно удалили ветку или сбросили изменения не к тому коммиту? Не паникуйте! В Git есть мощный механизм защиты — Reflog.
Reflog (журнал ссылок) — это запись о том, где находились HEAD и указатели веток в вашем локальном репозитории.
Как Reflog отслеживает историю
В отличие от истории коммитов (git log), которая отслеживает изменения в файлах проекта, reflog отслеживает изменения ссылок репозитория.
Каждый раз, когда перемещается ваш HEAD (текущий коммит) или указатель ветки, Git записывает это событие в reflog. Сюда входят:
- Фиксация изменений
- Переключение веток
- Слияние или перебазирование
- Выполнение сброса
- Клонирование репозитория
Просмотр Reflog
Чтобы посмотреть reflog, достаточно использовать команду git reflog. Она показывает список действий и состояние HEAD в соответствующий момент.
Смоделируем несколько действий, а затем посмотрим reflog:
git init my_repo
cd my_repo
echo "First line" > file.txt
git add file.txt
git commit -m "Initial commit"
echo "Second line" >> file.txt
git add file.txt
git commit -m "Add second line"
git reflogРазбор записей Reflog
Каждая запись reflog имеет определённый формат. Разберём типичную запись, которую можно увидеть:
a1b2c3d HEAD@{0}: commit: Add new feature
a1b2c3d: хеш SHA-1 коммита, на котором в тот момент находилсяHEAD.HEAD@{0}: это «указатель записи reflog».@{0}— самое последнее состояние,@{1}— предыдущее, и так далее.commit: Add new feature: описание действия, из-за которого переместилсяHEAD.
Эти указатели крайне важны для восстановления!
Сценарий: восстановление потерянного коммита
Представьте, что вы создали коммит, а затем случайно отменили его с помощью git reset --soft HEAD~1. Теперь этого коммита нет в истории текущей ветки, но он не исчез окончательно!
Reflog его помнит. Смоделируем эту распространённую ошибку:
git init my_project_recovery
cd my_project_recovery
echo "Initial content" > start.txt
git add start.txt
git commit -m "Initial commit"
echo "Important feature" > feature.txt
git add feature.txt
git commit -m "Added an important feature"
# Oops! Accidentally reset
git reset --soft HEAD~1
git reflogВозвращение коммита
После сброса, если выполнить git reflog, вы увидите запись о коммите «Added an important feature», возможно, как HEAD@{1} или похожую запись.
Чтобы восстановить его, можно использовать git reset вместе с записью reflog. Например, если хеш потерянного коммита — abcdefg, а его запись reflog — HEAD@{1}:
# Assuming the lost commit was HEAD@{1} in the reflog
git reset --hard HEAD@{1}
# Or using the specific commit hash from reflog
# git reset --hard abcdefg
# Now, check your log. The commit is back!
git log --onelineСценарий: получение удалённой ветки
Что делать, если вы случайно удалили целую ветку до её слияния или решили, что она больше не нужна?
Ветки — это всего лишь указатели на коммиты. При удалении ветки коммиты, на которые она указывала, не удаляются из репозитория немедленно. Reflog по-прежнему помнит, где находился HEAD этой ветки!
Восстановление ветки из Reflog
Предположим, у вас была ветка с именем feature-x, вы работали в ней, а затем удалили её с помощью git branch -D feature-x.
При выполнении git reflog можно увидеть такую запись:
1234567 HEAD@{5}: branch: Created branch feature-x orabcdefg HEAD@{2}: checkout: moving from feature-x to master
Используйте хеш коммита (например, 1234567 или abcdefg) из записи reflog, в которой ветка была активна, чтобы создать её заново:
# Assume 'feature-x' was deleted and its last commit was '1234567'
# Create a new branch pointing to that commit
git branch feature-x-recovered 1234567
# Now, check out your recovered branch
git checkout feature-x-recovered
# Verify its history
git log --onelineСрок действия записей Reflog истекает
Хотя reflog — мощный механизм защиты, его записи не хранятся вечно. Через определённый период Git удаляет старые записи reflog.
- По умолчанию срок действия достижимых записей (из текущего
HEAD) истекает через 90 дней. - Срок действия недостижимых записей (например, записей удалённых веток или коммитов, на которые больше нет ссылок) истекает через 30 дней.
Поэтому «потерянную» работу лучше восстанавливать как можно скорее!
Задание на восстановление с помощью Reflog
Вы создали новую ветку для функции, сделали несколько коммитов, а затем случайно удалили её без слияния. Вы выполняете git reflog и видите такую запись:
...
c0ffee1 HEAD@{3}: commit: Implement new user profile page
bada55e HEAD@{4}: checkout: moving from feature/profile to main
...Какая последовательность команд правильно создаст ветку feature/profile, указав её на последний коммит, который в ней находился до удаления?
Reflog: ваша защита в Git
Вы освоили git reflog — важный инструмент для восстановления «потерянной» работы в локальном репозитории Git. Запомните:
- Он отслеживает, где находились
HEADи указатели веток. - Используйте
git reflog, чтобы просматривать эту историю. - Коммиты и ветки можно восстановить с помощью
git resetилиgit branch, указав записи reflog (HEAD@{n}или хеши коммитов). - Срок действия записей reflog истекает, поэтому действуйте быстро, если нужно что-то восстановить!
Поддерживайте историю Git в чистоте, но помните: reflog всегда готов помочь в экстренной ситуации!
Часто задаваемые вопросы
Урок «Git Reflog и восстановление истории» бесплатный?
Да — полный текст урока «Git Reflog и восстановление истории» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.
Чему я научусь в уроке «Git Reflog и восстановление истории»?
Освойте `git reflog`, чтобы восстанавливать потерянные фиксации или ветки и иметь надёжную страховку для своей работы. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать DevOps Bootcamp?
Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Git Reflog и восстановление истории»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке DevOps Bootcamp?
Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Git Reflog и восстановление истории
- Git Bisect для отладки
- Обслуживание и очистка репозитория
- Перезапись истории с помощью git filter-repo