Тег в Git - это именованный указатель на объект с человекочитаемым именем. Почти всегда указывает на commit и используется для отметки релизов: «вот этот коммит - это версия 1.0». Формально annotated tag может указывать и на blob, tree или другой tag - но на практике это редкая экзотика.
В отличие от branch, тег не двигается. После создания тег привязан к коммиту, на который указывал в момент создания, и остаётся там навсегда (если только не удалить и не пересоздать заново).
Lightweight tag
Просто файл .git/refs/tags/<имя> с SHA коммита внутри. Никакого
объекта в .git/objects/ не создаётся:
git tag v1.0
cat .git/refs/tags/v1.0
# a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
По сути - то же, что branch, но не двигается с новыми коммитами.
Annotated tag
Полноценный объект в .git/objects/, с автором, датой, сообщением, и
опционально GPG-подписью:
git tag -a v1.0 -m "Первая стабильная версия"
git cat-file -p v1.0
# object a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
# type commit
# tag v1.0
# tagger Имя Фамилия <email@example.com> 1716817500 +0300
#
# Первая стабильная версия
Файл .git/refs/tags/v1.0 указывает не на коммит, а на этот
tag-объект, который в свою очередь указывает на коммит.
Какой использовать
- Для релизов и публичных меток - annotated. У них есть автор, дата, сообщение. Их можно подписать GPG. История релизов отслеживается.
- Для временных пометок («глянь на этот коммит», «здесь застряли, разобраться позже») - lightweight. Создаются мгновенно, без редактора.
Подписанные теги
Annotated-теги можно подписать GPG-ключом:
git tag -s v1.0 -m "Релиз 1.0"
Подпись хранится в самом tag-объекте. Проверить - git tag -v v1.0.
Это даёт криптографическое подтверждение, что тег создан именно тем
человеком, чей ключ указан, и не был подделан.
Отправка на сервер
Теги не пушатся автоматически вместе с коммитами. Чтобы отправить на сервер:
git push origin v1.0 # один конкретный тег
git push origin --tags # все локальные теги
git push origin --follow-tags # пушит annotated-теги, связанные с
# коммитами, которые тоже пушатся
Semver
Конвенция именования для релизов: vMAJOR.MINOR.PATCH. Подробнее -
semver.