Что такое тег (tag) в Git?

«Что такое тег (tag) в Git?» — вопрос из категории Git, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Git tag — это статическая ссылка, которая указывает на конкретный коммит в истории репозитория. В отличие от ветки, которая перемещается вперед при новых коммитах, тег после создания остается закрепленным за тем же коммитом. В DevOps-практиках теги являются основным механизмом для отметки релизов (например, v1.2.3, release-2024-05-15).

Типы тегов и их применение:

  1. Аннотированные теги (Annotated Tags):

    • Это полноценные объекты в базе данных Git. Они содержат метаданные: имя теггера, email, дату создания и аннотационное сообщение (часто changelog).
    • Используются для публичных релизов.
    • Создание: git tag -a v2.1.0 -m "Release version 2.1.0. Adds new billing API and fixes security vulnerability CVE-2024-1234."
  2. Легковесные теги (Lightweight Tags):

    • Это просто указатель на коммит, не содержащий дополнительной информации.
    • Используются для локальных или временных меток.
    • Создание: git tag temp-bugfix-commit

Рабочий процесс с тегами в CI/CD:

# 1. Создание аннотированного тега для релиза после тестирования
git tag -a v1.5.0 -m "Production release 1.5.0"

# 2. Отправка тега в удаленный репозиторий (по умолчанию `git push` теги не отправляет)
git push origin v1.5.0
# Или все теги разом:
git push origin --tags

# 3. В пайплайне CI/CD (например, GitLab CI) триггер сборки на тег
# В файле .gitlab-ci.yml:
# deploy_production:
#   stage: deploy
#   only:
#     - /^vd+.d+.d+$/  # Запускать только для тегов, похожих на версию
#   script:
#     - echo "Deploying version $CI_COMMIT_TAG to production..."

# 4. Получение (checkout) кода по тегу для развертывания или отладки
git checkout v1.5.0

# 5. Просмотр информации о теге
git show v1.5.0

# 6. Удаление тега (локально и удаленно, если ошиблись)
git tag -d v1.5.0
git push origin --delete v1.5.0

Почему это важно для DevOps: Теги создают неизменяемые точки в истории кода, которые соответствуют артефактам (Docker-образам app:v1.5.0), документации и состоянию инфраструктуры. Это основа практик GitOps и детерминированных развертываний — вы всегда можете точно знать, какая версия кода работает в production.