Представим, что вы работаете над своим проектом и набираете текст
git reset --hard HEAD~N
Затем вы нажали Enter ️ по ошибке, возможно…
В основном это означает, что вы потеряли последние N коммитов, и сейчас у вас чистое рабочее дерево.
Не бойтесь, для этой ситуации есть решение.
Представляем git reflog
Рефлог строго локален и не является частью репозитория. Он также не включается в pushes, fetches или clones. Git использует инструмент git reflog для отслеживания изменений, внесенных в советы ветвей. Он позволяет вернуться к любому коммиту, даже если на него не ссылается ни одно ответвление или метка.
Подробнее о рефлогах вы можете прочитать в Gitprotect.
Итак, как восстановить потерянный коммит?
Чтобы восстановить потерянный коммит, используйте
git reflog, чтобы увидеть свои локальные изменения:Здесь, в основном, вы можете увидеть локальные действия, зарегистрированные Git’ом.
Затем вы можете выбрать SHA коммита, к которому вы хотите вернуться, и затем выполнить команду
git reset --hard e4dd6f6
или
git cherry-pick e4dd6f6
Не забывайте, что вы можете использовать grep
с git reflog
для поиска по сообщению коммита или имени ветки… 😉.
Это круто, но есть ли у git reflog какие-то недостатки?
Рефлоги или ссылочные журналы хранятся только на вашей машине, это означает, что вы не можете нажать или вытащить их из удаленного хранилища.
И, что более важно, они становятся просроченными через некоторое время git-gc (git garbage collector).
Записи, срок действия которых истек, удаляются, а время истечения срока действия берется из настройки конфигурации gc.reflogExpire
(по умолчанию 90 дней).
Подробнее об этом вы можете прочитать здесь
Демонстрация