Какая разница между git reflog и log?

В справочной странице говорится, что журнал показывает журналы фиксации, а reflog управляет информацией reflog. Что такое информация reflog и что у нее есть, что нет в журнале? Журнал выглядит гораздо более подробно.

Ответ 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>.

safety net

git reflog часто ссылается как " ваша защитная сетка"

В случае возникновения проблем общий совет, когда журнал git не показывает вам то, что вы ищете, это:

" Сохраняйте спокойствие и используйте git reflog"

keep calm

Опять же, 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