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