Jaka jest różnica między git reflog a log?

158

Strona podręcznika mówi, że dziennik wyświetla dzienniki zatwierdzeń, a reflog zarządza informacjami reflog. Czym dokładnie są informacje reflog, a czego nie zawiera dziennik? Dziennik wydaje się znacznie bardziej szczegółowy.

Noich
źródło

Odpowiedzi:

221

git logpokazuje aktualny HEAD i jego pochodzenie. Oznacza to, że wypisuje zatwierdzenie wskazuje HEAD, a następnie jego rodzica, rodzica i tak dalej. Przechodzi wstecz przez pochodzenie repozytorium, rekurencyjnie wyszukując rodzica każdego zatwierdzenia.

(W praktyce niektóre zatwierdzenia mają więcej niż jednego rodzica. Aby wyświetlić bardziej reprezentatywny dziennik, użyj polecenia podobnego do git log --oneline --graph --decorate).

git reflogw ogóle nie przechodzi przez przodków HEAD. Reflog to uporządkowana lista zatwierdzeń, na które wskazał HEAD: jest to historia cofania repozytorium. Reflog nie jest częścią samego repozytorium (jest przechowywany oddzielnie od samych zatwierdzeń) i nie jest uwzględniany w wypychaniu, pobieraniu ani klonach; jest czysto lokalny.

Poza tym: zrozumienie reflogu oznacza, że ​​tak naprawdę nie możesz stracić danych z repozytorium po jego zatwierdzeniu. Jeśli przypadkowo zresetujesz do starszego zatwierdzenia lub dokonasz błędnego ponownego bazowania lub jakakolwiek inna operacja, która wizualnie „usuwa” zatwierdzenia, możesz użyć reflog, aby zobaczyć, gdzie byłeś wcześniej i git reset --hardwrócić do tego odniesienia, aby przywrócić poprzedni stan. Pamiętaj, że odniesienia oznaczają nie tylko zobowiązanie, ale całą historię, która za nim stoi.

ben_h
źródło
26
Słowo ostrzeżenia: czasami MOŻESZ utracić dane, ponieważ wpisy reflog nie trwają wiecznie - są usuwane pod pewnymi warunkami. Zobacz tę odpowiedź i dokumenty dotyczące git-reflog i git-gc . Generalnie, jeśli destrukcyjna operacja miała miejsce nie wcześniej niż 2 tygodnie temu, najprawdopodobniej jesteś bezpieczny.
mcmlxxxvi
@mcmlxxxvi Mam dwa lokalne foldery dla tego samego repozytorium, czy mogę scalić reflogs dla dwóch folderów?
Tmx
@Tmx, nie do końca rozumiem twój przypadek - co masz na myśli mówiąc o dwóch lokalnych folderach dla tego samego repozytorium ? Jeśli masz dwa klony tego samego repozytorium, które są aktualne i chcesz „scalić” ich historię edycji, .git/logs/refs/<branch>wpisy mają format <old_rev> <new_rev> [...] <timestamp> [...]. Możesz spróbować połączyć i posortować według sygnatury czasowej. Jednak niektóre linie new_revmogą nie pasować do następnej old_rev, w takim przypadku podejrzewam, że reflog będzie nieprawidłowy. Możesz wtedy spróbować wstawić fałszywe wpisy, aby „naprawić” sekwencję, ale wydaje mi się to zbyt kłopotliwe.
mcmlxxxvi
62
  • git log pokazuje dziennik zatwierdzeń dostępny z referencji (głowice, tagi, piloty)
  • git reflogto zapis wszystkich zatwierdzeń, które są lub były przywoływane w repozytorium w dowolnym momencie.

Dlatego git reflog( lokalne nagranie, które jest domyślnie przycinane po 90 dniach) jest używane, gdy wykonujesz "destrukcyjną" operację (np. Usuwanie gałęzi), aby odzyskać SHA1, do którego odwoływała się ta gałąź.
Zobacz git config:

gc.reflogexpire
gc.<pattern>.reflogexpire

git reflogexpire usuwa wpisy reflog starsze niż ten czas; domyślnie 90 dni.
Z " <pattern>" (np. " refs/stash") W środku ustawienie dotyczy tylko referencji, które pasują do <pattern>.

sieć bezpieczeństwa

git reflogjest często określany jako „ Twoja sieć bezpieczeństwa

W razie problemów ogólna rada, gdy dziennik git nie pokazuje, czego szukasz, to:

Zachowaj spokój i używajgit reflog

zachowaj spokój

Ponownie, reflog to lokalne nagranie twojego SHA1.
W przeciwieństwie do git log: jeśli wypchniesz repozytorium do repozytorium wyższego rzędu , zobaczysz to samo git log, ale niekoniecznie to samo git reflog.

VonC
źródło
14

Oto wyjaśnienie reflogz książki Pro Git :

Jedną z rzeczy, które Git robi w tle podczas Twojej pracy poza domem, jest prowadzenie reflogu - dziennika, w którym znajdowały się odwołania do HEAD i gałęzi w ciągu ostatnich kilku miesięcy.

Możesz zobaczyć swój reflog za pomocą 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

Za każdym razem, gdy wskazówka dotycząca oddziału jest aktualizowana z dowolnego powodu, Git przechowuje te informacje w tej tymczasowej historii. Możesz również określić starsze zatwierdzenia z tymi danymi.

reflogKomenda może być również stosowany do usuwania wpisów lub wygasają wpisy z reflog które są zbyt stare. Z oficjalnej dokumentacji Linux Kernel Git dlareflog :

Podkomenda expiresłuży do usuwania starszych wpisów reflog.

Aby usunąć pojedyncze wpisy z reflogu, użyj komendy deletei określ dokładny wpis (np git reflog delete master@{2}.).

Społeczność
źródło
Ale czy nie git logzawierają one tych samych informacji? Przepraszam, jeśli wydaje się to oczywiste, jestem bardzo nowy w GIT i chciałbym poznać podstawy tuż przed moim pierwszym OMG.
Noich,
2
Dziennik Git to rejestr twoich zatwierdzeń . Reflog, jak stwierdza książka Pro Git, jest zapisem twoich referencji (w zasadzie twoich wskaźników gałęzi i HEADwskaźnika) i które commity wskazywały. Czy to ma sens? Na marginesie, logmoże również pokazać reflog informacje, ale trzeba przejść specjalną flagę funkcji jako argument do niej --walk-reflogs.
3
Ponieważ jesteś początkującym użytkownikiem Git, bardzo polecam przeczytanie książki Pro Git, w której nauczyłem się większości tego, czego nauczyłem się o Git. Polecam rozdziały 1-3 i 6-6.5. Gorąco polecam również nauczenie się ponownego bazowania zarówno w trybie interaktywnym, jak i nieinteraktywnym.
8

Też mnie to zaciekawiło i chciałem po prostu trochę rozwinąć i podsumować:

  1. git logpokazuje historię wszystkich zmian w gałęzi, w której się znajdujesz. Sprawdź inną gałąź, a zobaczysz inną historię zmian. Jeśli chcesz zobaczyć historię zatwierdzeń dla wszystkich gałęzi, wpisz git log --all.

  2. git reflogpokazuje zapis twoich odniesień, jak powiedział Cupcake. Za każdym razem, gdy dokonano zatwierdzenia lub wyewidencjonowania, pojawia się wpis. Spróbuj kilka razy przełączać się między dwoma gałęziami, używając git checkouti uruchamiaj git reflogpo każdym kasie. Za każdym razem zobaczysz, że pierwszy wpis jest aktualizowany jako „do kasy”. Nie widzisz tego typu wpisów w git log.

Źródła: http://www.lornajane.net/posts/2014/git-log-all-branches

mitch
źródło
1

Lubię myśleć o różnicy między git log i reflog jako o różnicy między prywatnym rekordem a publicznym rekordem.

Prywatne vs publiczne

Dzięki reflogowi git śledzi wszystko, co zrobiłeś lokalnie. Popełniłeś? Reflog śledzi to. Czy wykonałeś twardy reset? Reflog śledzi to. Czy poprawiłeś zobowiązanie ? Reflog śledzi to. Wszystko, co zrobiłeś lokalnie, jest na to wpis w reflogu.

Nie dotyczy to dziennika. Jeśli zmienisz zatwierdzenie, dziennik pokaże tylko nowe zatwierdzenie. Jeśli wykonasz reset i pominiesz kilka zatwierdzeń w swojej historii, te zatwierdzenia, które pominęłeś, nie pojawią się w dzienniku. Kiedy przesyłasz swoje zmiany do innego programisty lub do GitHub lub czegoś podobnego, pojawi się tylko zawartość śledzona w dzienniku. Innemu deweloperowi będzie wyglądało to, że resety nigdy nie miały miejsca lub poprawki nigdy się nie wydarzyły.

Dziennik jest wypolerowany. Reflog jest lapidarny.

Więc tak, podoba mi się analogia „prywatny kontra publiczny”. A może lepszą analogią log vs reflog jest „wypolerowany vs lapidarny”. Reflog pokazuje wszystkie twoje próby i błędy. Dziennik pokazuje tylko czystą i dopracowaną wersję historii pracy.

Spójrz na ten obraz, aby podkreślić ten punkt. Od czasu zainicjowania repozytorium nastąpiło wiele poprawek i resetów. Reflog pokazuje to wszystko. Jednak polecenie log sprawia, że ​​wygląda na to, że kiedykolwiek wystąpiło tylko jedno zatwierdzenie repozytorium:

Log jest wypolerowany.  Reflog jest lapidarny.

Wracając do idei „siatki bezpieczeństwa”

Ponadto, ponieważ reflog śledzi rzeczy, które poprawiłeś i zatwierdza, które zresetowałeś , pozwala ci wrócić i znaleźć te zatwierdzenia, ponieważ poda ci identyfikatory zatwierdzeń. Zakładając, że twoje repozytorium nie zostało usunięte ze starych zatwierdzeń, co pozwala ci wskrzesić elementy, które nie są już widoczne w dzienniku. W ten sposób reflog czasami kończy się ratowaniem czyjejś skóry, gdy trzeba odzyskać coś, o czym myśleli, że przypadkowo zgubili.

Cameron McKenzie
źródło
-6

Właściwie reflog jest aliasem dla

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

więc odpowiedź powinna brzmieć: to konkretny przypadek.

user10028634
źródło
9
W git log, -gjest krótki formularz --walk-reflogs. Więc to nic nie wyjaśnia.
Adrian W,