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
Призначення Показує оновлення посилань і переписування в локальному репо Показує лише історію комітів
Охоплення Лише локальний репозиторій Локальні та віддалені репозиторії
Вміст Усі оновлення посилань (коміти, reset, merge тощо) Лише коміти
Сталість Тимчасово (зазвичай 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 до вказаного об'єкта коміту.
  • Залежно від типу reset оновлюються робочий каталог і індекс.
Тип reset Команда Вплив на робочий каталог Вплив на індекс
Soft git reset --soft <commit> Без змін Зміни лишаються staged
Mixed (типово) git reset --mixed <commit> Без змін Зміни знімаються зі staging
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...