Удаляет ли ветка в git ее из истории?

190

Исходя из SVN, только начинает знакомиться с GIT.

Когда ветка удаляется в git, удаляется ли она из истории?

В SVN вы можете легко восстановить ветку, вернув операцию удаления (обратное объединение). Как и все удаления в SVN, ветвь действительно никогда не удаляется, она просто удаляется из текущего дерева.

Если ветка фактически удалена из истории в git, что произойдет с изменениями, которые были объединены с этой веткой? Они сохранены?

Кен Лю
источник

Ответы:

251

Ветви - это просто указатели на коммиты в git. В git каждый коммит имеет полное дерево исходных текстов, это очень отличная структура от svn, где все ветви и теги (по соглашению) находятся в отдельных «папках» хранилища рядом со специальным «стволом».

Если ветвь была объединена с другой ветвью до того, как она была удалена, тогда все коммиты будут по-прежнему доступны из другой ветки, когда удаляется первая ветвь. Они остаются именно такими, какими они были.

Если ветвь удалена без слияния с другой ветвью, то коммиты в этой ветке (вплоть до момента, когда разветвленный от коммита все еще достижимый) перестанут быть видимыми.

Коммиты по-прежнему будут храниться в репозитории, и их можно восстановить сразу после удаления, но в конечном итоге они будут собираться мусором.

CB Bailey
источник
3
Спасибо за ответ. Не могли бы вы уточнить, что вы подразумеваете под «каждый коммит имеет полное дерево исходников»? Насколько я понимаю, каждый коммит в git - это набор дельт, которые ссылаются на родительский коммит, а не на целое дерево.
Кен Лю
2
@Ken Liu: коммит содержит указатели на ноль или более родительских коммитов, объект дерева и некоторые метаданные о коммите. Таким образом, фиксация однозначно идентифицирует как исходное дерево пар, так и, если рассматривать их родительские элементы, внесенные изменения.
CB Bailey
9
@ Кен Лю: Это зависит от того, кем именно вы были «содержать», но, по сути, каждый коммит содержит полное дерево. В объектной базе данных объекты индексируются по id, поэтому объекты распределяются между всеми объектами (деревьями и коммитами), которые ссылаются на них, поэтому подразумеваемая нагрузка на хранилище не так плоха, как кажется на первый взгляд. У git также есть эффективная оптимизация хранения (упакованные файлы), которая делает использование дискового пространства еще более эффективным.
CB Bailey
22
«в конце концов они будут собирать мусор» - в конце концов, когда?
BadHorsie
7
@ BadHorsie, это зависит .
АлиОли