Czy usunięcie gałęzi w git usuwa ją z historii?

Pochodzi z svn, dopiero zaczynam poznawać Gita.

Kiedy gałąź jest usuwana w git, czy jest usuwana z historii?

W svn, możesz łatwo odzyskać gałąź poprzez odwrócenie operacji delete (reverse merge). Podobnie jak wszystkie delety w svn, gałąź nigdy tak naprawdę nie jest usuwana, jest po prostu usuwana z bieżącego drzewa.

Jeśli gałąź jest rzeczywiście usunięta z historii w git, co się stanie ze zmianami, które zostały scalone z tą gałąź? Czy oni zatrzymani?

Author: Sam, 2010-04-10

3 answers

Gałęzie są tylko wskaźnikami do commitów w git. W git każdy commit ma pełne drzewo źródłowe, jest to zupełnie inna struktura niż svn, gdzie wszystkie gałęzie i tagi (według konwencji) żyją w osobnych 'folderach' repozytorium obok specjalnego 'trunku'.

Jeśli gałąź została scalona w inną gałąź przed usunięciem, to wszystkie commity będą nadal dostępne z drugiej gałęzi, gdy pierwsza gałąź zostanie usunięta. Pozostają dokładnie takie, jakie były.

Jeśli gałąź jest usuwana bez połączenia z inną gałęzią, wtedy commity w tej gałęzi (aż do momentu, w którym rozwidlony z commita, który jest nadal osiągalny) przestaną być widoczne.

Commity nadal będą przechowywane w repozytorium i możliwe jest ich odzyskanie natychmiast po usunięciu, ale ostatecznie zostaną zbierane śmieci.

 199
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-10 15:57:03

W Git, gałęzie są po prostu wskaźnikami (referencjami) do commitów w ukierunkowanym grafie acyklicznym (dag) commitów. Oznacza to, że usunięcie gałęzi usuwa tylko odniesienia do commitów, co może sprawić, że niektóre commity w DAG będą nieosiągalne, a tym samym niewidoczne. Ale wszystkie commity, które znajdowały się w usuniętej gałęzi, nadal byłyby w repozytorium, przynajmniej dopóki nie zostaną przycięte nieosiągalne commity (np. używając git gc).

Zauważ, że git branch -d odmówi usunięcia gałęzi, jeśli nie może być pewien, że usunięcie to nie pozostawi nieosiągalnych commitów. Musisz użyć silniejszego git branch -D, Aby wymusić usunięcie gałęzi, jeśli może ona pozostawić nieosiągalne commity.

Zauważ również, że nieosiągalne commity, jeśli są obecne, są tylko tymi commitami pomiędzy ostatnim wierzchołkiem usuniętej gałęzi a zatwierdzeniem, które zostało scalone z inną istniejącą gałęzią, dowolnym oznaczonym zatwierdzeniem lub punktem rozgałęzienia; w zależności od tego, co nastąpi później. Na przykład w następującej sytuacji:

----O----*----*----/M----*    <-- master <-- HEAD
     \            /
      \--.----.--/--x---y     <-- deleted branch

Tylko commity ' x ' i 'y' stają się nieosiągalne po usunięciu gałęzi.

Jeśli operujesz na usuniętej gałęzi w okresie gc.reflogExpire, domyślnie 90 dni, ostatnia końcówka usuniętej gałęzi zostanie zapisana w head reflog (zobacz git reflog show HEAD lub git log --oneline --walk-reflogs HEAD). Powinieneś być w stanie użyć HEAD reflog, aby odzyskać usunięty wskaźnik. Zauważ również, że w tym przypadku nieosiągalne commity w usuniętej gałęzi 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 usuniętej gałęzi w reflog for HEAD, możesz spróbować użyć git fsck, aby znaleźć "unreachable commit " i sprawdzić je (poprzez git show <sha1> lub git log <sha1>), aby znaleźć końcówkę usuniętej gałęzi.

Niezależnie od tego, jak znajdujesz 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>

Zauważ jednak, że reflog dla gałęzi zostanie utracony.


Jest też git-resurrect.sh skrypt w contrib/ który pomaga odnaleźć ślady końcówki gałęzi z daną nazwą i wskrzesić (przywrócić) ją.

 71
Author: Jakub Narębski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-06 11:41:49

Jeśli martwisz się o przypadkowo usunięte gałęzie i nie masz już lokalnej kopii repo, istnieją rozszerzenia do firmowych serwerów Git, takich jak Gerrit, które wykrywają zmiany historii i usunięcia gałęzi, wykonują ich kopię zapasową pod specjalnym ref, aby mogły zostać przywrócone w razie potrzeby i nie zostaną przycinane przez garbage collection. Administratorzy Gerrit mogą nadal usuwać wybrane commity, jeśli jest to konieczne ze względów prawnych.

 1
Author: Johanned Nicolai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-07 19:40:31