Подтвердить что ты не робот

Что происходит с тегами Git, указывающими на удаленную фиксацию

Скажем, я делаю следующее:

  • Создать ветку X
  • Создать тег t (к ветке X)
  • Нажмите
  • Удалить ветку X

Что происходит с тегом t? он просто плавает? он считается мусором?

Должен ли я удалить все теги, указывающие на ветку, прежде чем удалить ветвь?

Ссылка

От Git Основы - тегирование:

Git использует два основных типа тегов: легкий и аннотированный. легкий тег очень похож на ветку, которая не меняется - ее просто указатель на конкретную фиксацию.

4b9b3361

Ответ 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

Если вы удалите ветку, из которой был создан тег, это не повлияет на тег. Тег не содержит ссылки на то, откуда он был создан.

Если вы хотите узнать больше о тегах против веток, я бы порекомендовал посмотреть на этот вопрос: Как тег отличается от ветки? Что мне следует использовать здесь?