W Git, gałęzie są tylko wskaźnikami (odnośnikami) do zatwierdzenia w skierowanym acyklicznym wykresie (DAG) zatwierdzeń. Oznacza to, że usunięcie gałęzi usuwa tylko odniesienia do zatwierdzeń, co może spowodować, że niektóre zatwierdzenia w DAG będą niedostępne, a więc niewidoczne. Ale wszystkie zatwierdzenia, które znajdowały się na usuniętej gałęzi, nadal znajdowałyby się w repozytorium, przynajmniej dopóki nieosiągalne potwierdzenia nie zostaną przycięte (np. Za pomocą git gc
).
Należy pamiętać, że git branch -d
odmówiłby usunięcia oddziału, jeśli nie może być pewien, że usunięcie go nie spowoduje pozostawienia nieosiągalnego zatwierdzenia. Musisz użyć silniejszego git branch -D
, aby wymusić usunięcie gałęzi, jeśli może ona pozostawić nieosiągalne zatwierdzenia.
Należy również zauważyć, że nieosiągalne zatwierdzenia, jeśli są obecne, są tylko tymi zatwierdzeniami między ostatnim wierzchołkiem usuniętego oddziału i zatwierdzeniem, które zostało scalone z inną istniejącą gałęzią, dowolnym oznaczonym zatwierdzeniem lub punktem rozgałęzienia; cokolwiek nastąpi później. Na przykład w następującej sytuacji:
----O----*----*----/M----* <-- master <-- HEAD
\ /
\--.----.--/--x---y <-- deleted branch
zobowiązuje „x” i „y” tylko staną się nieosiągalne po usunięciu oddział.
Jeśli operowano usuniętej gałęzi w okresie gc.reflogExpire
, domyślnie 90 dni, to masz ostatnią końcówkę usuniętego oddziału zarejestrowanego w HEAD reflog (patrz git reflog show HEAD
lub git log --oneline --walk-reflogs HEAD
). Powinieneś być w stanie użyć refela HEAD, aby odzyskać usunięty wskaźnik. Należy również zauważyć, że w tym przypadku nieosiągalne zatwierdzenia w usuniętym oddziale będą chronione przed przycinaniem (usuwaniem) w okresie gc.reflogExpireUnreachable
, który domyślnie wynosi 30 dni.
Jeśli nie można znaleźć końcówki po prostu usunięty oddział w reflog głowy, można spróbować użyć git fsck
znaleźć „nieosiągalny popełnić <SHA1>” i badać (przez git show <sha1>
lub git log <sha1>
), aby znaleźć wskazówka usuniętego oddziału.
Niezależne od tego, jak znaleźć końcówkę usuniętej gałęzi, można cofnąć usunięcie, lub raczej ponownie utworzyć właśnie usunął gałąź używając
git branch <deleted-branch> <found-sha1-id>
Należy jednak pamiętać, że reflog dla oddziału zostaną utracone.
Istnieje również git-resurrect.sh skrypt w contrib/
która pomaga znaleźć ślady końcówki gałęzi z podaną nazwą i wskrzesić (cofnąć) go.
Dzięki za odpowiedź. Czy możesz wyjaśnić, co masz na myśli, mówiąc, że "każde zatwierdzenie ma pełne drzewo źródłowe"? Jak rozumiem, każde zatwierdzenie w git jest zbiorem delt, które odwołują się do zatwierdzenia nadrzędnego, a nie całego drzewa. –
Nie, każde zatwierdzenie jest stanem drzewa w danym punkcie. Delty są obliczane później tylko w celu wyświetlania i zmiany nazwy, ale identyfikator zatwierdzenia jest hashem całego drzewa. – ben
@Ken Liu: Zatwierdzenie zawiera wskaźniki do zera lub więcej animacji rodzicielskich, obiektu drzewa i niektórych metadanych dotyczących zatwierdzenia. Zatwierdzenie w ten sposób jednoznacznie identyfikuje zarówno drzewo źródłowe pary, jak i, w stosunku do jego rodzica (rodziców), wprowadzane przez siebie zmiany. –