Что происходит с тегами Git, указывающими на удаленную фиксацию
Скажем, я делаю следующее:
- Создать ветку
X
- Создать тег
t
(к ветке X
)
- Нажмите
- Удалить ветку
X
Что происходит с тегом t
? он просто плавает? он считается мусором?
Должен ли я удалить все теги, указывающие на ветку, прежде чем удалить ветвь?
Ссылка
От Git Основы - тегирование:
Git использует два основных типа тегов: легкий и аннотированный. легкий тег очень похож на ветку, которая не меняется - ее просто указатель на конкретную фиксацию.
Ответы
Ответ 1
Что случилось с тегом t?
Скажем, вы создали ветвь x
из commit E
, а затем пометили, что commit с тегом t
. Например.
x (branch)
|
V
A-----B------C------D------E
^
|
t (tag)
Если вы удаляете ветку x
, ничего не происходит с тегом t
.
git branch -D x
Тег по-прежнему указывает на фиксацию E
.
A-----B------C------D------E
^
|
t (tag)
считается ли он мусором?
Нет, потому что фиксация по-прежнему ссылается на тег t
.
Что делать, если фиксация удалена?
Вы не удаляете фиксации. Вы удаляете указатели на фиксации, и если коммиты больше не ссылаются на git, то мусор собирает их когда-нибудь (в зависимости от вашей конфигурации).
См. git gc
Даже если вы удалите все обычные ссылки, например ветки и теги, коммиты будут по-прежнему ссылаться в форме reflog некоторое время, и вы можете получить к ним доступ, например. снова создайте ветвь, пометьте их или вишневый выбор и т.д.
Вы можете увидеть reflog, используя git reflog
. Также взгляните на gc.reflogExpireUnreachable
и gc.reflogExpire
Ответ 2
Я не рассматриваю конкретный сценарий в вопросе OP, а скорее вопрос в заголовке: что происходит с тегом git, указывающим на удаленную фиксацию?
Если вы каким-то образом удалили фиксацию, на которую ссылался тег (не знаете, как вы могли это сделать - см. ответ René Link), тег будет просто указатель на недействительный фиксатор (вы можете проверить это, вручную отредактировав тег из .git/refs/tags).
В таком случае вывод git tag
будет примерно таким:
$ git tag
error: refs/tags/v1.0 does not point to a valid object!
v1.1
...etc
Checkout также приведет к ошибке:
$ git checkout v1.0
fatal: reference is not a tree: v1.0
Итак, ответ на вопрос "Что происходит с тегом git, который ссылается на удаленную фиксацию?" это... ничего. Он останется там, указывая на недопустимую ссылку, пока вы не удалите его с помощью git tag -d <tag>
.
Ответ 3
Если вы удалите ветку, из которой был создан тег, это не повлияет на тег. Тег не содержит ссылки на то, откуда он был создан.
Если вы хотите узнать больше о тегах против веток, я бы порекомендовал посмотреть на этот вопрос: Как тег отличается от ветки? Что мне следует использовать здесь?