Git reflog

Продвинутый Git

Amanda Crawford-Adamo

Software and Data Engineer

Что такое Git Reflog?

  1. Локальная запись ВСЕХ обновлений ссылок в репозитории
  2. Reflog хранится на локальной машине в директории .git/logs/refs/heads/
  3. Фиксирует изменения верхушек веток и положения HEAD
  4. Служит защитным механизмом для операций Git
  5. Помогает восстановить случайно изменённые или удалённые данные

Пример графа изменений истории git

Продвинутый Git

Git Reflog и Git Log: сравнение

Параметр Git Reflog Git Log
Назначение Показывает обновления ссылок и перезаписи в локальном репозитории Показывает только историю коммитов
Область Только локальный репозиторий Локальный и удалённые репозитории
Содержимое Все обновления ссылок (коммиты, сбросы, слияния и т. д.) Только коммиты
Хранение Временно (обычно 90 дней) Постоянно (часть истории репозитория)
Применение Восстановление потерянных коммитов, анализ последних действий Просмотр истории проекта, анализ разработки функций
Продвинутый Git

Команды Reflog

  • Отображает данные лога и активность HEAD
    git reflog
    git reflog show
    
  • Удаляет устаревшие или недостижимые записи лога
    git reflog expire
    
Продвинутый Git

Структура вывода Reflog

Разбор структуры вывода reflog

Пример вывода reflog в терминале

Компонент Описание
short-hash Сокращённый хеш коммита
ref Обычно HEAD, но может быть именем ветки
index Позиция в reflog (0 — самая последняя)
action Тип действия (commit, reset, merge и т. д.)
descriptions Описание действия
1 https://hackernoon.com/time-to-rewrite-your-git-history-effectively-with-git-reflog
Продвинутый Git

Фильтрация: since и until

  • since = показать записи начиная с этого момента

    git reflog --since "time-qualifer"
    
  • until = показать записи до этого момента

    git reflog --until "time-qualifer"
    
Использование
git reflog --since="1 week ago"
git reflog --until="yesterday"
git reflog --until="2024-01-01"
Продвинутый Git

Восстановление удалённых веток

Сценарий

  • Создана ветка etl-feature
  • В эту ветку закоммичены изменения ETL-функции
  • Ветка была случайно удалена
  • Все изменения кода потеряны

Как восстановить ветку etl-feature?

Решение

  1. Найдите хеш коммита на верхушке удалённой ветки с помощью git reflog
  2. Выполните git checkout, чтобы переместить HEAD на хеш этого коммита
  3. Создайте новую ветку из коммита, на который указывает HEAD
git reflog
git checkout <hash>
git checkout -b <branch-name>
1 https://stackoverflow.com/questions/3640764/can-i-recover-a-branch-after-its-deletion-in-git
Продвинутый Git

Git Reset

  • Перемещает HEAD на указанный объект коммита.
  • В зависимости от типа сброса обновляются рабочая директория и индекс.
Тип сброса Команда Рабочая директория Индекс (staging)
Soft git reset --soft <commit> Без изменений Изменения остаются в индексе
Mixed (по умолчанию) git reset --mixed <commit> Без изменений Изменения убраны из индекса
Hard git reset --hard <commit> Изменения удалены Изменения удалены
Продвинутый Git

Поиск утерянного коммита

Сценарий

  • После коммитов и rebase тесты начали падать
  • Причина сбоя неизвестна
  • Нужно вернуться к рабочему состоянию

Как откатиться к предыдущей версии ETL-скрипта?

Решение

  1. Найдите хеш утерянного коммита с помощью Git Reflog
  2. Выполните git reset, чтобы откатиться к коммиту с прошедшими тестами
git reflog
git reset --soft HEAD@{1}
Продвинутый Git

Рекомендации

  • Эффективно восстанавливает потерянный код и коммиты
  • Используйте информативные сообщения коммитов
  • Регулярно отправляйте изменения в удалённый репозиторий
  • Будьте осторожны с принудительными push-операциями

Reflog — локальная машина времени на случай ошибок

Изображение часов, идущих назад

Продвинутый Git

Давайте потренируемся!

Продвинутый Git

Preparing Video For Download...