Відповіді:
git log
показує поточну ГОЛОВУ та її предки. Тобто він друкує коміти, на які вказує HEAD, потім його батько, його батько тощо. Він проходить назад через родину репо, рекурсивно шукаючи батьків кожного комітету.
(На практиці в деяких комісіях є більше одного з батьків. Щоб побачити більш репрезентативний журнал, використовуйте команду, наприклад git log --oneline --graph --decorate
.)
git reflog
взагалі не переживає походження голови. Reflog - це упорядкований список комісій, на які вказував HEAD: це скасування історії для вашого репо. Рефлог не є частиною самого репо-репортажу (він зберігається окремо до самих комітетів) і не входить до натискань, вибору чи клонів; це суто локально.
Убік: розуміння рефлогу означає, що ви не можете дійсно втратити дані з репо, після того, як це було здійснено. Якщо ви випадково перевстановились на більш стару версію, або перезавантажили помилково, або будь-яку іншу операцію, яка візуально "видаляє" коміти, ви можете скористатися рефлогом, щоб побачити, де ви були раніше, і git reset --hard
повернутися до цього списку, щоб відновити попередній стан. Пам'ятайте, що рефлекси мають на увазі не лише зобов'язання, а всю історію, що стоїть за ним.
.git/logs/refs/<branch>
записи мають формат <old_rev> <new_rev> [...] <timestamp> [...]
. Ви можете спробувати об'єднати та сортувати за часовою міткою. Однак деякі рядки ' new_rev
можуть не відповідати наступним old_rev
, і в такому випадку я підозрюю, що відкладення буде недійсним. Потім ви можете спробувати вставити підроблені записи, щоб "виправити" послідовність, але мені це здається занадто великим клопотом.
git log
показує журнал фіксації, доступний із списку (заголовки, теги, пульти)git reflog
- це запис про всі комісії, на які у будь-який час є посилання на ваші репортажі.Ось чому git reflog
( локальний запис, який обрізається після 90 днів за замовчуванням) використовується, коли ви робите "руйнівну" операцію (наприклад, видалення гілки), щоб повернути SHA1, на який посилалася ця гілка.
Дивіться git config
:
gc.reflogexpire
gc.<pattern>.reflogexpire
git reflog
закінчується термін видалення записів релогів, старших за цей час; за замовчуванням до 90 днів.
З "<pattern>
" (наприклад, "refs/stash
") в середині налаштування застосовується лише до посилань, які відповідають<pattern>
.
git reflog
часто посилається на " вашу мережу безпеки "
У разі неприємностей загальна порада, коли git log не показує, що ви шукаєте, це:
Знову ж таки, reflog - це локальний запис вашого SHA1.
На відміну від git log
: якщо ви пересунете репо до верхнього репо , ви побачите те саме git log
, але не обов'язково те саме git reflog
.
Ось пояснення reflog
з книги Pro Git :
Одне з речей, які Git робить у фоновому режимі, поки ви працюєте, - це вести рефлог - журнал про те, де ваші керівники та посилання на відділення були останні кілька місяців.
Ви можете побачити свій рефлог, скориставшись
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.Щоб видалити окремі записи з рефлогу, скористайтеся підкомандою
delete
та вкажіть точний запис (наприкладgit reflog delete master@{2}
).
git log
надає вам однакової інформації? Вибачте, якщо це здається очевидним, я дуже новачок у GIT і хотів би отримати деякі основи перед моїм першим OMG.
HEAD
вказівника), і на які зобов'язання вони вказували. Чи має це сенс? На стороні записки, log
також може показати вам reflog інформації, але ви повинні пройти спеціальний прапор варіанту в якості аргументу до нього, --walk-reflogs
.
Мені було цікаво і про це, і просто хочу трохи детальніше і резюмувати:
git log
показує історію всіх ваших зобов’язань для вашої галузі. Ознайомтеся з іншою філією, і ви побачите іншу історію фіксації. Якщо ви хочете бачити історію створення всіх гілок, введіть git log --all
.
git reflog
показує запис ваших посилань, як казав Cupcake. Будь-який запис відбувається щоразу, коли це робиться чи здійснюють каси. Спробуйте кілька разів перемикатися між двома відділеннями, використовуючи git checkout
та запускайте git reflog
після кожної каси. Ви побачите, що верхній запис щоразу оновлюється як запис "замовлення". Ви не бачите цих типів записів у git log
.
Список літератури: http://www.lornajane.net/posts/2014/git-log-all-branches
Мені подобається вважати різницю між git log та reflog як різницю між приватним і публічним записом.
За допомогою git reflog він відстежує все, що ви зробили на місцевому рівні. Ви вчинили? Reflog відстежує його. Ви зробили жорсткий перезавантаження? Reflog відстежує його. Ви внесли зміни до комісії ? Reflog відстежує його. Все, що ви зробили на локальному рівні, є записом для цього в рефлозі.
Це не вірно для журналу. Якщо ви внесете зміни до комісії, у журналі відображається лише новий документ. Якщо зробити скидання та пропустити назад декілька комісій у своїй історії, ці записи, які ви пропустили, не відображатимуться в журналі. Коли ви натискаєте свої зміни до іншого розробника або до GitHub або чогось подібного, з'явиться лише вміст, відслідковуваний у журналі. Для іншого розробника це виглядатиме так, як скидання ніколи не відбувалися або поправки ніколи не відбувалися.
Тож так, мені подобається аналогія "приватне проти публічного". А може, краща аналогія log vs reflog - це «відшліфований проти лапідарій». Рефлог показує всі ваші випробування та помилки. Журнал просто показує чисту та відшліфовану версію вашої історії роботи.
Погляньте на це зображення, щоб підкреслити суть. З моменту ініціалізації репозиторію відбулося декілька поправок та перезавантажень. Рефлог показує все це. І все ж команда журналу виглядає так, ніби проти repo було колись лише одне:
Крім того, оскільки рефлог відстежує зміни, внесені вами, і зобов’язує вас скинути , він дозволяє повернутися назад і знайти ці зобов'язання, оскільки він надасть вам ідентифікатори комісій. Якщо припустити, що ваш сховище не очищено від старих комітетів, це дозволяє відновити елементи, які більше не відображаються в журналі. Ось так іноді рефлог закінчується рятуванням шкіри когось, коли їм потрібно повернути те, що вони думали, що вони ненавмисно втратили.
Насправді, релогінг - псевдонім для
git log -g --abbrev-commit --pretty=oneline
тому відповідь повинна бути: це конкретний випадок.
git log
, -g
це коротка форма для --walk-reflogs
. Отже, це нічого не пояснює.