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:
---- O ---- * ---- * ---- / M ---- * <- master <- HEAD
\ /
\ --. ---- .-- / - x --- y <- usunięty oddział
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 (patrz git reflog show HEAD
lub git 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) w gc.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 (przez git show <sha1>
lub git 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ą
git branch <deleted-branch> <found-sha1-id>
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ąć).