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?
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.
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ą.
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.
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