Удаляет ли ветка в 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 могут по-прежнему удалять выбранные коммиты, если это необходимо по юридическим причинам.

Другие вопросы по тегам