Удаляет ли ветка в git ее из истории?
Исходя из SVN, только начинает знакомиться с Git.
Когда ветка удаляется в git, удаляется ли она из истории?
В svn вы можете легко восстановить ветку, вернув операцию удаления (обратное слияние). Как и все удаления в SVN, ветвь действительно никогда не удаляется, она просто удаляется из текущего дерева.
Если ветка фактически удалена из истории в git, что происходит с изменениями, которые были объединены с этой веткой? Они сохранены?
3 ответа
Ветви - это просто указатели на коммиты в git. В git каждый коммит имеет полное дерево исходных текстов, это очень отличная структура от svn, где все ветви и теги (по соглашению) находятся в отдельных "папках" хранилища рядом со специальным "стволом".
Если ветвь была объединена с другой ветвью до того, как она была удалена, тогда все коммиты будут по-прежнему доступны из другой ветки, когда удаляется первая ветвь. Они остаются именно такими, какими они были.
Если ветвь удалена без слияния с другой ветвью, то коммиты в этой ветке (вплоть до момента, когда разветвленный от коммита, который еще доступен), перестанут быть видимыми.
Коммиты по-прежнему будут храниться в репозитории, и их можно восстановить сразу после удаления, но в конечном итоге они будут собирать мусор.
В Git ветви - это просто указатели (ссылки) на коммиты в направленном ациклическом графе (DAG) коммитов. Это означает, что удаление ветви удаляет только ссылки на коммиты, что может сделать некоторые коммиты в группе доступности базы данных недоступными, а значит, невидимыми. Но все коммиты, которые были в удаленной ветке, все еще будут в репозитории, по крайней мере до тех пор, пока недостижимые коммиты будут удалены (например, с использованием git gc
).
Обратите внимание, что git branch -d
отказался бы удалить ветку, если не может быть уверен, что удаление не оставит недоступных коммитов. Вам нужно использовать сильнее git branch -D
принудительно удалить ветку, если она может оставить недоступные коммиты.
Также обратите внимание, что недоступные коммиты, если они присутствуют, - это только те коммиты, которые находятся между последним кончиком удаленной ветви и коммитом, который был объединен с другой существующей ветвью, любым теговым коммитом или точкой ветвления; что будет позже. Например, в следующей ситуации:
---- O ---- * ---- * ---- / M ---- * <- master <- HEAD \ / \ --. ----.-- / - x --- y<- удаленная ветка
только коммиты 'x' и 'y' станут недоступными после удаления ветки.
Если вы работали на удаленной ветви в gc.reflogExpire
период, по умолчанию 90 дней, последний совет удаленной ветви будет записан в журнале HEAD (см. git reflog show HEAD
, или же git log --oneline --walk-reflogs HEAD
). Вы должны быть в состоянии использовать HEAD reflog для восстановления удаленного указателя. Также обратите внимание, что в этом случае недоступные коммиты только в удаленной ветке будут защищены от удаления (удаления) в пределах gc.reflogExpireUnreachable
период, который по умолчанию составляет 30 дней.
Если вы не можете найти подсказку только что удаленной ветки в reflog для HEAD, вы можете попробовать использовать git fsck
найти "недостижимый коммит git show <sha1>
или же git log <sha1>
) найти подсказку удаленной ветки.
Независимо от того, как вы найдете подсказку удаленной ветви, вы можете отменить удаление или, скорее, заново создать только что удаленную ветку, используя
git branch <deleted-branch> <found-sha1-id>
Однако обратите внимание, что reflog для ветки будет потерян.
Есть также скрипт git-resurrect.sh в contrib/
которая помогает найти следы кончика ветви с указанным именем и воскресить (восстановить) его.
Если вы беспокоитесь о случайно удаленных ветвях и у вас больше нет локальной копии вашего репо, существуют расширения для корпоративных Git-серверов, такие как Gerrit, которые будут обнаруживать перезаписи истории и удаления веток, будут создавать резервные копии под специальными ссылками, чтобы они может быть восстановлен при необходимости и не будет удален сборщиком мусора. Администраторы Gerrit могут по-прежнему удалять выбранные коммиты, если это необходимо по юридическим причинам.