Pochodzący z svn, dopiero zaczynam się zapoznawać z git.
Czy gałąź usuwana w git jest usuwana z historii?
W svn możesz łatwo odzyskać gałąź, cofając operację usuwania (scalanie odwrócone). Podobnie jak wszystkie usunięcia w svn, gałąź tak naprawdę nigdy nie jest usuwana, po prostu jest usuwana z bieżącego drzewa.
Jeśli gałąź faktycznie zostanie usunięta z historii w git, co stanie się ze zmianami, które zostały scalone z tej gałęzi? Czy są zatrzymane?
źródło
W Git gałęzie są tylko wskaźnikami (referencjami) zatwierdzeń na ukierunkowanym wykresie acyklicznym (DAG) zatwierdzeń. Oznacza to, że usunięcie gałęzi usuwa tylko odwołania do zatwierdzeń, co może sprawić, że niektóre zatwierdzenia w DAG będą nieosiągalne, a tym samym niewidoczne. Ale wszystkie zatwierdzenia, które znajdowały się w usuniętej gałęzi, nadal znajdowałyby się w repozytorium, przynajmniej do momentu przycięcia nieosiągalnych zatwierdzeń (np. Za pomocą
git gc
).Zauważ,
git branch -d
że odmówiłoby usunięcia gałęzi, jeśli nie ma pewności, że usunięcie go nie pozostawi nieosiągalnych zatwierdzeń. Musisz użyć silniejszego,git branch -D
aby wymusić usunięcie gałęzi, jeśli może pozostawić nieosiągalne zatwierdzenia.Zauważ też, że nieosiągalne zatwierdzenia, jeśli są obecne, są tylko zatwierdzeniami między ostatnią końcówką usuniętej gałęzi a albo zatwierdzeniem, które zostało scalone z innym istniejącym oddziałem, dowolnym oznaczonym zatwierdzeniem lub punktem rozgałęzienia; cokolwiek jest później. Na przykład w następującej sytuacji:
tylko zatwierdzenia „x” i „y” stałyby się nieosiągalne po usunięciu gałęzi.
Jeśli działałeś na usuniętym oddziale w tym
gc.reflogExpire
okresie, domyślnie 90 dni, ostatnia wskazówka usuniętego oddziału zostanie zapisana w dzienniku HEAD (patrzgit reflog show HEAD
lubgit log --oneline --walk-reflogs HEAD
). Powinieneś być w stanie użyć HEAD reflog do odzyskania usuniętego wskaźnika. Należy również pamiętać, że w tym przypadku nieosiągalne zatwierdzenia w tylko usuniętej gałęzi byłyby chronione przed przycinaniem (usuwaniem) wgc.reflogExpireUnreachable
okresie, który domyślnie wynosi 30 dni.Jeśli nie możesz znaleźć końcówki właśnie usuniętej gałęzi w reflog dla HEAD, możesz spróbować użyć
git fsck
„nieosiągalnego zatwierdzenia <sha1>” i zbadać te (przezgit show <sha1>
lubgit log <sha1>
), aby znaleźć końcówkę usuniętej gałęzi.Niezależnie od tego, jak znaleźć końcówkę usuniętej gałęzi, możesz cofnąć usunięcie, a raczej odtworzyć właśnie usuniętą gałąź za pomocą
Należy jednak pamiętać, że dziennik logowania dla gałęzi zostałby utracony.
Istnieje również skrypt git-resurrect.sh, w
contrib/
którym pomaga znaleźć ślady wierzchołka gałęzi o podanej nazwie i wskrzesić (cofnąć).źródło
git reflog show HEAD
wymieniłem zatwierdzenie i stworzyłem nowy oddział, tak jak powiedziałeś, idealnie.Jeśli martwisz się przypadkowo usuniętymi gałęziami i nie masz już lokalnej kopii repozytorium, istnieją rozszerzenia do korporacyjnych serwerów Git, takich jak Gerrit, które wykrywają przepisywanie historii i usuwanie gałęzi, wykonują kopie zapasowe pod specjalnym ref, aby mogły może zostać przywrócony w razie potrzeby i nie będzie przycinany przez zbieranie śmieci. Administratorzy Gerrit mogą nadal usuwać wybrane zatwierdzenia, jeśli jest to konieczne ze względów prawnych.
źródło