# Tag _Объектная модель · GitLab Knowledge Base_ **TL;DR:** Именованный указатель на коммит. Два вида: lightweight (просто файл с SHA в `refs/tags/`) и annotated (отдельный объект в `objects/` с автором, датой, подписью). Для релизов - annotated. Тег в Git - это именованный указатель на объект с человекочитаемым именем. Почти всегда указывает на commit и используется для отметки релизов: «вот этот коммит - это версия 1.0». Формально annotated tag может указывать и на blob, tree или другой tag - но на практике это редкая экзотика. В отличие от [branch](/courses/git/kb/branch.md), тег не двигается. После создания тег привязан к коммиту, на который указывал в момент создания, и остаётся там навсегда (если только не удалить и не пересоздать заново). ## Lightweight tag Просто файл `.git/refs/tags/<имя>` с SHA коммита внутри. Никакого объекта в `.git/objects/` не создаётся: ```bash git tag v1.0 cat .git/refs/tags/v1.0 # a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0 ``` По сути - то же, что [branch](/courses/git/kb/branch.md), но не двигается с новыми коммитами. ## Annotated tag Полноценный объект в `.git/objects/`, с автором, датой, сообщением, и опционально GPG-подписью: ```bash git tag -a v1.0 -m "Первая стабильная версия" git cat-file -p v1.0 # object a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0 # type commit # tag v1.0 # tagger Имя Фамилия 1716817500 +0300 # # Первая стабильная версия ``` Файл `.git/refs/tags/v1.0` указывает не на коммит, а на этот tag-объект, который в свою очередь указывает на коммит. ## Какой использовать - **Для релизов и публичных меток** - annotated. У них есть автор, дата, сообщение. Их можно подписать GPG. История релизов отслеживается. - **Для временных пометок** («глянь на этот коммит», «здесь застряли, разобраться позже») - lightweight. Создаются мгновенно, без редактора. ## Подписанные теги Annotated-теги можно подписать GPG-ключом: ```bash git tag -s v1.0 -m "Релиз 1.0" ``` Подпись хранится в самом tag-объекте. Проверить - `git tag -v v1.0`. Это даёт криптографическое подтверждение, что тег создан именно тем человеком, чей ключ указан, и не был подделан. ## Отправка на сервер Теги **не пушатся** автоматически вместе с коммитами. Чтобы отправить на сервер: ```bash git push origin v1.0 # один конкретный тег git push origin --tags # все локальные теги git push origin --follow-tags # пушит annotated-теги, связанные с # коммитами, которые тоже пушатся ``` ## Semver Конвенция именования для релизов: `vMAJOR.MINOR.PATCH`. Подробнее - [semver](/courses/git/kb/semver.md). ## Команды ```bash git tag v1.0 ``` Создать lightweight tag на HEAD ```bash git tag -a v1.0 -m "..." ``` Создать annotated tag ```bash git tag -s v1.0 -m "..." ``` Создать подписанный annotated tag ```bash git tag -l ``` Список всех тегов ```bash git tag -d v1.0 ``` Удалить тег локально ```bash git push origin --tags ``` Запушить все теги на сервер ## См. также - [Commit](/courses/git/kb/commit.md) - [Ветка (branch)](/courses/git/kb/branch.md) - [GPG-подпись коммитов](/courses/git/kb/gpg-signing.md)