Git: co to jest wiszący commit / blob i skąd się one biorą?

148

Szukam podstawowych informacji o wiszących zatwierdzeniach i obiektach blob.

Moje repozytorium wydaje się w porządku. Ale pobiegłem git fsckpo raz pierwszy, aby zobaczyć, co się stało i mam długą listę „wiszących plamek” i jedno „wiszące zatwierdzenie”.

Co to za rzeczy? Skąd oni przyszli? Czy wskazują na coś niezwykłego (dobrego lub złego) w stanie mojego repozytorium?

wątpliwość
źródło

Odpowiedzi:

95

Podczas pracy z repozytorium git możesz skończyć z wycofywaniem się z operacji i wykonywaniem innych ruchów, które powodują pośredniczące obiekty blob, a nawet niektóre rzeczy, które git robi dla ciebie, aby uniknąć utraty informacji.

Ostatecznie (warunkowo, zgodnie ze stroną podręcznika git gc ) dokona czyszczenia pamięci i wyczyści te rzeczy. Można także zmusić go powołując się proces zbierania śmieci, git gc.

Aby uzyskać więcej informacji na ten temat, zobacz Konserwacja i odzyskiwanie danych w witrynie git-scm.

Ręczne uruchomienie GC domyślnie pozostawia 2 tygodnie przed uruchomieniem tego polecenia sieci bezpieczeństwa. W rzeczywistości zachęcamy do sporadycznego uruchamiania GC, aby zapewnić wydajne wykorzystanie repozytorium git. Jednak jak wszystko, powinieneś zrozumieć, co robi, zanim zniszczysz te rzeczy, które mogą być dla ciebie ważne.

vgoff
źródło
10
Więc można uczciwie powiedzieć, że 1) jeśli uważam, że coś jest nie tak z moim repozytorium, można je bezpiecznie usunąć git gc, i 2) nie muszę się tym wcale martwić, ponieważ te zwisające bity są normalne i już git uchwyt jest nimi?
wątpliwość1ejack
7
To byłaby uczciwa ocena.
vgoff
9
Ponadto za każdym razem, gdy „git dodajesz” plik, ale nie zatwierdzasz tej dokładnej wersji pliku, kończy się na wiszącym blobie. Nie ma się czym martwić.
kanton 7
7
wątpliwość1ejack - Ogólnie rzecz biorąc, nie powinieneś ręcznie uruchamiać czyszczenia pamięci. To zły nawyk, aby się w to dostać, a git i tak zbiera śmieci, gdy jest to potrzebne. Wadą ręcznego uruchamiania jest to, że utraciłeś możliwość odzyskiwania wiszących obiektów blob i zatwierdzeń, których możesz nie chcieć teraz, ale możesz chcieć w przyszłości. Po uruchomieniu czyszczenia pamięci pozbawiasz gita całkiem potężnej funkcji przywracania. Używaj ostrożnie i jako wyjątek, a nie reguła. --- Po prostu pozwól gitowi robić swoje.
Elijah Lynn
95

Dangling blob = zmiana, która dotarła do obszaru przejściowego / indeksu, ale nigdy nie została zatwierdzona. Jedną z niesamowitych rzeczy w git jest to, że gdy zostanie dodany do obszaru przejściowego, zawsze możesz go odzyskać, ponieważ te obiekty zachowują się jak commity, ponieważ mają też hash !!

Dangling commit = Zatwierdzenie, do którego nie ma bezpośredniego połączenia z żadnym zatwierdzeniem podrzędnym, rozgałęzieniem, znacznikiem ani innym odniesieniem. Te też możesz odzyskać!

Elijah Lynn
źródło
5
Czy „przodkowie” powinni czytać „potomkowie”? Ogólnie rzecz biorąc, nie możesz osiągnąć żadnego zobowiązania git za pośrednictwem jego przodków.
Phil Miller,
@Novelocrat Miałem taką samą myśl, zgadzam się, że prawdopodobnie powinienem przeczytać potomków.
stkent
1
W Twojej odpowiedzi wciąż czytam „wstępnych”. Wygląda na to, że Twoje wydanie z 2 lipca nie poprawiło literówki.
iclman
Jak odzyskać wiszącą kroplę?
HelloGoodbye
1
@ElijahLynn Masz rację. Myślę, że trochę za szybko czytam dyskusje. Wiszące zatwierdzenie nie ma żadnego elementu podrzędnego / podrzędnego i nie ma do niego odniesienia znacznika ani gałęzi.
iclman
44

JAK usunąć wszystkie wiszące zatwierdzenia z repozytorium git z http://www.tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git-repository/

git reflog expire --expire=now --all
git gc --prune=now

Upewnij się, że naprawdę chcesz je usunąć, ponieważ w końcu możesz zdecydować, że ich potrzebujesz.

qxo
źródło
5
W rzeczywistości większość użytkowników nigdy nie powinna tego potrzebować, a jeśli to robią, to prawdopodobnie w przypadku użycia programistycznego. Moim zdaniem zaoszczędzone miejsce na dysku lub prędkość zwiększona przez usunięcie wiszących zatwierdzeń nie jest warte wysiłku.
Elijah Lynn
1
To odpowiada na inne pytanie.
Elijah Lynn
5

Wiszące zatwierdzenie to zatwierdzenie, które nie jest powiązane z odniesieniem, tj. Nie ma sposobu, aby do niego dotrzeć.

Weźmy na przykład pod uwagę poniższy diagram. Załóżmy, że usuniemy gałąź featureX bez scalania jej zmian, a następnie zatwierdzenie D stanie się wiszącym zatwierdzeniem, ponieważ nie ma z nim skojarzonego odniesienia. Gdyby został scalony ze wzorcem, to odniesienia HEAD i wzorcowe wskazywałyby na zatwierdzenie D i przestałyby wisieć, nawet gdybyśmy usunęli featureX. Przeczytaj uwagę po diagramie, aby lepiej to zrozumieć.

Git automatycznie zbiera śmieci (tj. Usuwa) wiszące zatwierdzenia. Możemy użyć git reflogdo odzyskania gałęzi (z wiszących zatwierdzeń), która została usunięta bez jej scalania. Możemy odzyskać usunięte zatwierdzenia tylko wtedy, gdy są obecne w lokalnej składnicy obiektów. Jeśli został zebrany jako śmieci, nie możemy go odzyskać.

wprowadź opis obrazu tutaj

UWAGA że nazwa gałęzi, tj. Etykieta gałęzi, jest w rzeczywistości odniesieniem do ostatniego zatwierdzenia gałęzi, tj. Końcówki gałęzi. Na powyższym diagramie, featureX, master i HEAD są po prostu odniesieniami do konkretnych zatwierdzeń. Etykiety featureX i główne odnoszą się do najnowszych zatwierdzeń w odpowiednich gałęziach. HEAD ogólnie odnosi się do końcówki aktualnie wyewidencjonowanej gałęzi (w tym przypadku master). Jeśli wyrejestrujesz starsze zatwierdzenie w swojej bieżącej gałęzi, to HEAD będzie w stanie odłączonym, tj. Będzie wskazywał na starsze zatwierdzenie zamiast najnowszego. Zwróć również uwagę, że HEAD jest nazywany symbolicznym odniesieniem, ponieważ w rzeczywistości wskazuje na etykietę bieżącej gałęzi, a każda etykieta gałęzi zawsze wskazuje na jej koniec. Zatem w normalnych okolicznościach HEAD pośrednio wskazuje na ostatnie zatwierdzenie.

Na marginesie, zauważ, że Git przedstawia swój wykres / historię zatwierdzeń jako skierowany graf acykliczny . Każde zatwierdzenie ma odniesienie do swojego rodzica. Stąd strzałki na diagramie zatwierdzeń wskazują od zatwierdzenia podrzędnego do zatwierdzenia rodzica. Potrzebujemy odniesienia do najnowszego zatwierdzenia podrzędnego, aby dotrzeć do starszych zatwierdzeń w gałęzi.

PS - Powyższy schemat i zrozumienie uzyskano z tego bezpłatnego kursu . Chociaż kurs jest dość stary, wiedza jest nadal aktualna.

MasterJoe2
źródło