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.
źródło
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.
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 linienew_rev
mogą nie pasować do następnejold_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
: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 samogit log
, ale niekoniecznie to samogit reflog
.źródło
Oto wyjaśnienie
reflog
z książki Pro Git :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
:źródło
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, wpiszgit 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ącgit checkout
i uruchamiajgit reflog
po każdym kasie. Za każdym razem zobaczysz, że pierwszy wpis jest aktualizowany jako „do kasy”. Nie widzisz tego typu wpisów wgit log
.Źródła: http://www.lornajane.net/posts/2014/git-log-all-branches
źródło
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:
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.
źródło
Właściwie reflog jest aliasem dla
więc odpowiedź powinna brzmieć: to konkretny przypadek.
źródło
git log
,-g
jest krótki formularz--walk-reflogs
. Więc to nic nie wyjaśnia.