Odpowiedzi:
git log
pokazuje 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 reflog
w 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 --hard
wró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.
.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_rev
mogą 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.
git log
pokazuje dziennik zatwierdzeń dostępny z referencji (głowice, tagi, piloty)git reflog
to 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 reflog
expire 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>
.
git reflog
jest często określany jako „ Twoja sieć bezpieczeństwa ”
W razie problemów ogólna rada, gdy dziennik git nie pokazuje, czego szukasz, to:
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
.
Oto wyjaśnienie reflog
z 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.
reflog
Komenda 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
expire
służy do usuwania starszych wpisów reflog.Aby usunąć pojedyncze wpisy z reflogu, użyj komendy
delete
i określ dokładny wpis (npgit reflog delete master@{2}
.).
git log
zawierają 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.
HEAD
wskaźnika) i które commity wskazywały. Czy to ma sens? Na marginesie, log
może również pokazać reflog informacje, ale trzeba przejść specjalną flagę funkcji jako argument do niej --walk-reflogs
.
Też mnie to zaciekawiło i chciałem po prostu trochę rozwinąć i podsumować:
git log
pokazuje 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
.
git reflog
pokazuje 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 checkout
i uruchamiaj git reflog
po 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
Lubię myśleć o różnicy między git log i reflog jako o różnicy między prywatnym rekordem a publicznym rekordem.
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.
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:
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.
Właściwie reflog jest aliasem dla
git log -g --abbrev-commit --pretty=oneline
więc odpowiedź powinna brzmieć: to konkretny przypadek.
git log
, -g
jest krótki formularz --walk-reflogs
. Więc to nic nie wyjaśnia.