Яка різниця між git reflog та log?


158

На головній сторінці йдеться, що журнал показує журнали фіксації, а рефлог керує інформацією рефлогу. Що саме являє собою рефлогування інформації та що вона містить, що журнал не має? Журнал здається набагато детальнішим.

Відповіді:


221

git logпоказує поточну ГОЛОВУ та її предки. Тобто він друкує коміти, на які вказує HEAD, потім його батько, його батько тощо. Він проходить назад через родину репо, рекурсивно шукаючи батьків кожного комітету.

(На практиці в деяких комісіях є більше одного з батьків. Щоб побачити більш репрезентативний журнал, використовуйте команду, наприклад git log --oneline --graph --decorate.)

git reflogвзагалі не переживає походження голови. Reflog - це упорядкований список комісій, на які вказував HEAD: це скасування історії для вашого репо. Рефлог не є частиною самого репо-репортажу (він зберігається окремо до самих комітетів) і не входить до натискань, вибору чи клонів; це суто локально.

Убік: розуміння рефлогу означає, що ви не можете дійсно втратити дані з репо, після того, як це було здійснено. Якщо ви випадково перевстановились на більш стару версію, або перезавантажили помилково, або будь-яку іншу операцію, яка візуально "видаляє" коміти, ви можете скористатися рефлогом, щоб побачити, де ви були раніше, і git reset --hardповернутися до цього списку, щоб відновити попередній стан. Пам'ятайте, що рефлекси мають на увазі не лише зобов'язання, а всю історію, що стоїть за ним.


26
Слово застереження: іноді МОЖЕТЕ втратити дані, оскільки записи відкладених файлів не зберігаються вічно - вони очищаються за певних умов. Дивіться цю відповідь та документи для git-reflog та git-gc . Як правило, якщо деструктивна операція була не більше 2 тижнів тому, ви, швидше за все, в безпеці.
mcmlxxxvi

@mcmlxxxvi У мене є дві локальні папки для одного і того ж репо, чи можу я об'єднати рефлоги для двох папок?
Tmx

@Tmx, я не зовсім розумію твій випадок - що ти маєш на увазі під двома локальними папками для одного репо ? Якщо у вас є два клони того ж репо, які є актуальними, і ви хочете "об'єднати" їх історію редагування, .git/logs/refs/<branch>записи мають формат <old_rev> <new_rev> [...] <timestamp> [...]. Ви можете спробувати об'єднати та сортувати за часовою міткою. Однак деякі рядки ' new_revможуть не відповідати наступним old_rev, і в такому випадку я підозрюю, що відкладення буде недійсним. Потім ви можете спробувати вставити підроблені записи, щоб "виправити" послідовність, але мені це здається занадто великим клопотом.
mcmlxxxvi

62
  • 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 не показує, що ви шукаєте, це:

" Зберігайте спокій і використовуйтеgit reflog "

зберігай спокій

Знову ж таки, reflog - це локальний запис вашого SHA1.
На відміну від git log: якщо ви пересунете репо до верхнього репо , ви побачите те саме git log, але не обов'язково те саме git reflog.


14

Ось пояснення 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.
Ноїч

2
Git log - це запис ваших зобов’язань . Рефлог, як зазначається в книзі Pro Git, - це запис ваших посилань (в основному, ваших вказівників філій та вашого HEADвказівника), і на які зобов'язання вони вказували. Чи має це сенс? На стороні записки, logтакож може показати вам reflog інформації, але ви повинні пройти спеціальний прапор варіанту в якості аргументу до нього, --walk-reflogs.

3
Крім того, оскільки ви початківець Git, я настійно рекомендую вам прочитати книгу Pro Git, саме так я дізнався більшість того, що я дізнався про Git. Я рекомендую глави 1-3 та 6-6.5. Я також настійно рекомендую вам навчитися проводити перезавантаження як інтерактивного, так і неінтерактивного характеру.

8

Мені було цікаво і про це, і просто хочу трохи детальніше і резюмувати:

  1. git logпоказує історію всіх ваших зобов’язань для вашої галузі. Ознайомтеся з іншою філією, і ви побачите іншу історію фіксації. Якщо ви хочете бачити історію створення всіх гілок, введіть git log --all.

  2. git reflogпоказує запис ваших посилань, як казав Cupcake. Будь-який запис відбувається щоразу, коли це робиться чи здійснюють каси. Спробуйте кілька разів перемикатися між двома відділеннями, використовуючи git checkoutта запускайте git reflogпісля кожної каси. Ви побачите, що верхній запис щоразу оновлюється як запис "замовлення". Ви не бачите цих типів записів у git log.

Список літератури: http://www.lornajane.net/posts/2014/git-log-all-branches


1

Мені подобається вважати різницю між git log та reflog як різницю між приватним і публічним записом.

Приватне проти публічного

За допомогою git reflog він відстежує все, що ви зробили на місцевому рівні. Ви вчинили? Reflog відстежує його. Ви зробили жорсткий перезавантаження? Reflog відстежує його. Ви внесли зміни до комісії ? Reflog відстежує його. Все, що ви зробили на локальному рівні, є записом для цього в рефлозі.

Це не вірно для журналу. Якщо ви внесете зміни до комісії, у журналі відображається лише новий документ. Якщо зробити скидання та пропустити назад декілька комісій у своїй історії, ці записи, які ви пропустили, не відображатимуться в журналі. Коли ви натискаєте свої зміни до іншого розробника або до GitHub або чогось подібного, з'явиться лише вміст, відслідковуваний у журналі. Для іншого розробника це виглядатиме так, як скидання ніколи не відбувалися або поправки ніколи не відбувалися.

Колода шліфована. Рефлог є лапідарним.

Тож так, мені подобається аналогія "приватне проти публічного". А може, краща аналогія log vs reflog - це «відшліфований проти лапідарій». Рефлог показує всі ваші випробування та помилки. Журнал просто показує чисту та відшліфовану версію вашої історії роботи.

Погляньте на це зображення, щоб підкреслити суть. З моменту ініціалізації репозиторію відбулося декілька поправок та перезавантажень. Рефлог показує все це. І все ж команда журналу виглядає так, ніби проти repo було колись лише одне:

Колода шліфується.  Рефлог є лапідарним.

Повернення до ідеї "безпечної мережі"

Крім того, оскільки рефлог відстежує зміни, внесені вами, і зобов’язує вас скинути , він дозволяє повернутися назад і знайти ці зобов'язання, оскільки він надасть вам ідентифікатори комісій. Якщо припустити, що ваш сховище не очищено від старих комітетів, це дозволяє відновити елементи, які більше не відображаються в журналі. Ось так іноді рефлог закінчується рятуванням шкіри когось, коли їм потрібно повернути те, що вони думали, що вони ненавмисно втратили.


-6

Насправді, релогінг - псевдонім для

 git log -g --abbrev-commit --pretty=oneline

тому відповідь повинна бути: це конкретний випадок.


9
В git log, -gце коротка форма для --walk-reflogs. Отже, це нічого не пояснює.
Адріан Ш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.