Страница man говорит, что log показывает журналы фиксации, а reflog управляет информацией reflog. Что такое информация reflog и что она имеет, чего нет в журнале? Журнал кажется гораздо более подробным.
источник
Страница man говорит, что log показывает журналы фиксации, а reflog управляет информацией reflog. Что такое информация reflog и что она имеет, чего нет в журнале? Журнал кажется гораздо более подробным.
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
:git reflog
часто упоминается как « ваша сеть безопасности »В случае проблем общий совет, когда git log не показывает то, что вы ищете:
Опять же, reflog - это локальная запись вашего SHA1.
В противоположность этому
git log
: если вы подтолкнете свое репо к обратному репо , вы увидите то же самоеgit log
, но не обязательно то же самоеgit reflog
.источник
Вот объяснение из
reflog
книги Pro Git :reflog
Команда также может быть использована для удаления записей или истекает записи из reflog, которые слишком стары. Из официальной документации Linux Kernel Git дляreflog
:источник
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
это краткая форма для--walk-reflogs
. Итак, это ничего не объясняет.