Время эффективно переписать историю Git с помощью git reflog

Время эффективно переписать историю Git с помощью git reflog

9 мая 2022 г.

Git — наиболее широко используемая система контроля версий на сегодняшний день, и она отслеживает изменения различными способами, чтобы гарантировать, что вы никогда не потеряете зафиксированное изменение. Кроме того, контроль, который он дает вам над рабочими процессами разработки, означает, что вы можете точно определить, как выглядит история вашего проекта. В Git есть несколько механизмов для перезаписи истории коммитов, в том числе git commit --amend, git rebase и git reflog.


В этой статье вы узнаете, как использовать git reflog, чтобы эффективно и легко реорганизовать и переписать историю коммитов Git, снизив при этом риск, который часто возникает при переписывании истории коммитов.


Что такое журнал ссылок?


Git использует систему под названием журнал ссылок или просто «reflog», чтобы отслеживать изменения в ветках. подсказки. Ссылка, часто известная как «ref», представляет собой указатель на фиксацию или ветку, которую многие команды Git принимают в качестве параметра. git checkout, git reset и git merge являются примерами некоторых распространенных команд git, которые принимают ссылки в качестве параметров.


По умолчанию журналы ссылок отслеживают каждую позицию HEAD за последние 90 дней. Кроме того, история журналов ссылок является эксклюзивной для репозитория и недоступна удаленно. Помимо рефлогов ветки, есть отдельный рефлог для [Git stash] (https://git-scm.com/docs/git-stash).


Журналы ссылок хранятся в определенных каталогах в каталоге .git локального репозитория. Эти каталоги git reflog можно найти в .git/logs/refs/heads/., .git/logs/HEAD, а также .git/logs/refs/stash, если git stash был использован в репозитории.


Базовая конфигурация


Основные команды reflog следующие:


``` ударить


Чтобы увидеть активность в HEAD


git рефлог показать


Вывод приведенной выше команды выглядит примерно так:


``` ударить


0a2e358 HEAD@{0}: сброс: переход к HEAD~2


0254ea7 HEAD@{1}: проверка: переход с версии 2.2 на главную


c10f740 HEAD@{2}: проверка: переход с основного на 2.2


Другие распространенные варианты использования следующие:


``` ударить


Чтобы увидеть активность в HEAD, включая отметку времени


git reflog show --date=относительный


или


git reflog --относительная дата


то же самое, на some_branch


git reflog show --date=относительная часть_ветки


Ссылки на Reflog


По умолчанию git reflog выводит reflog ссылки HEAD. Символ HEAD обозначает текущую активную ветвь. Также доступны рефлоги для других рефов. Синтаксис, используемый для доступа к git ref: name@{qualifier}, например, otherbranch@{0}. В дополнение к ссылкам `HEAD можно также ссылаться на другие ветки, теги, удаленные файлы и тайник Git.


Чтобы увидеть полный reflog всех ссылок, вы можете выполнить:


``` ударить


git reflog показать --все


Помимо упорядоченных индексов, к каждой записи журнала ссылок прикреплена временная метка, которую также можно использовать в качестве маркера квалификатора для синтаксиса указателя Git ref. Это то, что позволяет фильтровать эти записи журнала ссылок по времени. Примеры часто используемых квалификаторов времени включают:


  • @{0}

  • @{6.minutes.ago}

  • @{2.hour.ago}

  • @{3.day.ago}

  • @{5.weeks.ago}

  • @{8.years.ago}

  • @{сегодня}

  • @{2022-01-23.08:30:00}

  • @{1.day.10.hours.ago}

Эти квалификаторы времени можно комбинировать (например, «1.день.3.час.назад»). Также допустимы формы множественного числа этих определителей времени (например, «5.minutes.ago»). Их можно использовать вместе с командой git reflog следующим образом:


``` ударить


git reflog show development@{3.days.ago}


Подкоманды и параметры конфигурации


git reflog принимает некоторые дополнительные аргументы, которые, таким образом, рассматриваются как подкоманды, такие как show, expire и delete. Давайте обсудим эти подкоманды подробно.


git reflog показать


Как обсуждалось ранее, show по умолчанию неявно передается. Выполнение git reflog show отобразит журнал для переданных аргументов.


Например:


```javascript


git reflog разработки@{0}


такой же как


```javascript


git reflog показать development@{0}


Кроме того, git reflog show – это псевдоним для git log -g --abbrev-commit --pretty=oneline.


git reflog истекает


Подкоманда expire помогает очистить старые или недоступные записи журнала ссылок.


Подкоманда expire может привести к потере данных.


Однако эта подкоманда обычно используется не конечными пользователями, а внутри git.


«Пробный запуск» можно выполнить, передав опцию -n или --dry-run в git reflog expire, чтобы вывести, какие записи reflog помечены как подлежащие удалению, так что они не будут фактически удалены. Это может помочь в качестве подстраховки при очистке просроченных записей журнала ссылок.


Более того, время истечения можно указать, передав аргумент командной строки --expire=time в git reflog expire или установив имя конфигурации git gc.reflogExpire.


git reflog удалить


Подкоманда удаления, как следует из ее названия, удаляет переданную запись reflog. Удалить, как и срок действия, может привести к потере данных и не часто используется конечными пользователями.


git reflog и git log


«git reflog» и «git log» — это два компонента с одинаковыми названиями, предоставляемые Git, которые позволяют нам проникнуть в историю коммитов, журналы и журналы ссылок репозитория. Тот факт, что два компонента часто демонстрируют одну и ту же историю, особенно когда разработчик выполняет несколько локальных коммитов без выборки или извлечения, является одной из причин путаницы Git reflog и log.


Однако они принципиально разные и имеют разные варианты использования.


Давайте разберемся в основных различиях, а также в сходстве двух вышеуказанных команд.


Наиболее заметное различие между Git reflog и журналом заключается в том, что журнал — это общедоступная запись истории коммитов репозитория, тогда как журнал ссылок — это частная, специфичная для рабочей области запись локальных коммитов репо.


После отправки, получения или извлечения журнал Git реплицируется как часть репозитория Git. Журнал ссылок Git, с другой стороны, не включен в дублированный репозиторий. Без физического доступа к компьютеру, на котором хранится локальный репозиторий, разработчик не может просмотреть журнал ссылок.


Журнал ссылок — это файл, находящийся в .git\logs\refs\heads, который отслеживает историю локальных коммитов для конкретной ветки и исключает любые коммиты, которые могли быть удалены процессами сборки мусора Git. Журнал Git, с другой стороны, обеспечивает исторический обход ветки, начиная с самой последней фиксации и заканчивая самой первой фиксацией в истории ветки.


Git reflog как ваша подушка безопасности


Git reflog можно использовать в качестве подстраховки во время разработки, поскольку вы не можете потерять данные из репозитория после его фиксации, если правильно понимаете концепцию reflog. Вы можете использовать reflog, чтобы увидеть, где вы были раньше, и git reset --hard, чтобы вернуться к этой ссылке, чтобы восстановить свое предыдущее состояние, если вы непреднамеренно сбросили до более старой фиксации, неправильно перебазировали или выполнили любую другую операцию, которая явно " удаляет" фиксирует.


Помните, что ссылки относятся ко всей истории фиксации, а не только к самой фиксации.


Вывод


В этой статье мы обсудили расширенные параметры конфигурации git reflog, распространенные варианты использования и подводные камни git reflog.


Подводя итог, Git ведет reflog, который представляет собой журнал того, где ваши HEAD и ссылки на ветки были за последние несколько месяцев (90 дней), в фоновом режиме, пока вы работаете. Git сохраняет информацию в этой временной истории каждый раз, когда ваша подсказка по какой-либо причине изменяется.


Команду reflog также можно использовать для удаления или истечения срока действия слишком старых записей из журнала ссылок. Подкоманда expire используется для удаления устаревших записей журнала ссылок, а подкоманда delete используется для удаления и указания конкретной записи, которая должна быть удалена из журнала ссылок.



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE