В справочной странице говорится, что журнал показывает журналы фиксации, а reflog управляет информацией reflog. Что такое информация reflog и что у нее есть, что нет в журнале? Журнал выглядит гораздо более подробно.
Какая разница между git reflog и log?
Ответ 1
git log
показывает текущий HEAD и его родословную. То есть, он печатает точки фиксации HEAD, затем ее родительский элемент, его родительский элемент и т.д. Он проходит через репо-родословную, рекурсивным образом просматривая каждого родителя-фиксатора.
(На практике некоторые коммиты имеют более одного родителя. Чтобы увидеть более типичный журнал, используйте команду типа git log --oneline --graph --decorate
.)
git reflog
не пересекает предков HEAD. Reflog - это упорядоченный список коммитов, на которые указывает HEAD: он отменяет историю вашего репо. Reflog не является частью самого репо (он хранится отдельно для самих коммитов) и не включается в нажатия, выборки или клоны; это чисто локально.
Кроме того, понимание reflog означает, что вы не можете действительно потерять данные из своего репо после его совершения. Если вы случайно reset для более старой фиксации или неверной переадресации или любой другой операции, которая визуально "удаляет" совершает, вы можете использовать reflog, чтобы увидеть, где вы были раньше, и git reset --hard
вернуться к этому ref для восстановления предыдущего состояния, Помните, ref ref подразумевает не только фиксацию, но и всю историю за ней.
Ответ 2
-
git log
показывает журнал фиксации, доступный из ссылок refs (head, tags, remotes) - git reflog - это запись всех коммитов, которые были или были указаны в вашем репо в любое время.
Вот почему git reflog
(локальная запись, которая обрезается по умолчанию через 90 дней) используется, когда вы выполняете "разрушительную" операцию (например, удаление ветки), чтобы вернуть SHA1, на который ссылались эта ветка.
См. git config
:
gc.reflogexpire
gc.<pattern>.reflogexpire
git reflog
expire удаляет записи журнала, старше этого времени; по умолчанию - 90 дней.
Если "<pattern>
" (например, "refs/stash
" ) в середине, параметр применяется только к refs, которые соответствуют<pattern>
.
git reflog
часто ссылается как " ваша защитная сетка"
В случае возникновения проблем общий совет, когда журнал git не показывает вам то, что вы ищете, это:
Опять же, reflog - это локальная запись вашего SHA1.
В отличие от git log
: если вы нажмете свое репо на upstream repo, вы увидите тот же git log
, но не обязательно тот же git reflog
.
Ответ 3
Здесь объяснение reflog
из книги Pro Git:
Одна из вещей, которые Git делает в фоновом режиме, пока вы работаете, хранит reflog - журнал того, где ваши ссылки HEAD и ветки были в течение последних нескольких месяцев.
Вы можете просмотреть свой рефлок с помощью
git reflog
:$ git reflog 734713b... [email protected]{0}: commit: fixed refs handling, added gc auto, updated d921970... [email protected]{1}: merge phedders/rdocs: Merge made by recursive. 1c002dd... [email protected]{2}: commit: added some blame and merge stuff 1c36188... [email protected]{3}: rebase -i (squash): updating HEAD 95df984... [email protected]{4}: commit: # This is a combination of two commits. 1c36188... [email protected]{5}: rebase -i (squash): updating HEAD 7e05da5... [email protected]{6}: rebase -i (pick): updating HEAD
Каждый раз, когда подсказка вашего ветки обновляется по любой причине, Git хранит эту информацию для вас в этой временной истории. И вы также можете указать более старые коммиты с этими данными.
Команда reflog
также может использоваться для удаления записей или истечения записей из слишком старых журналов. Из официальной документации ядра Linux Git для reflog
:
Подкоманда
expire
используется для сокращения старых записей reflog.Чтобы удалить отдельные записи из рефлога, используйте подкоманду
delete
и укажите точную запись (например,git reflog delete [email protected]{2}
).
Ответ 4
Мне также было интересно об этом, и я просто хочу немного уточнить и подвести итог:
-
git log
показывает историю всех ваших фиксаций для ветки, в котором вы находитесь. Оформить заказ в другой ветке, и вы увидите другую историю фиксации. Если вы хотите, чтобы вы фиксировали историю для всех ветвей, введитеgit log --all
. -
git reflog
показывает запись ваших ссылок, как сказал Cupcake. Каждый раз, когда происходит фиксация или выписка, выполняется запись. Несколько раз переключайтесь между двумя ветвями, используяgit checkout
, и запуститеgit reflog
после каждой проверки. Вы увидите, что верхняя запись обновляется каждый раз как запись "checkout". Вы не видите эти типы записей вgit log
.
Литература: http://www.lornajane.net/posts/2014/git-log-all-branches