Как создать и отправить тег (tag) в Git?

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

Ответ

В DevOps теги Git используются для маркировки релизов, контрольных точек (например, образов контейнеров) и управления версиями. Работа с ними ведется через CLI.

1. Создание тега

  • Аннотированный тег (Annotated Tag): Рекомендуется для релизов. Содержит автора, дату, сообщение и может быть подписан GPG.

    # Создать аннотированный тег для текущего коммита
    git tag -a v1.5.0 -m "Release version 1.5.0: Added feature X and fixed critical bug Y"
    
    # Создать тег для конкретного прошлого коммита
    git tag -a v1.4.2 -m "Hotfix for login issue" abc123def
  • Легковесный тег (Lightweight Tag): Просто указатель на коммит. Подходит для временных меток.

    git tag build-1234

2. Отправка тегов на удаленный сервер (например, GitHub, GitLab, Bitbucket) Теги по умолчанию не отправляются при git push. Нужно делать это явно.

# Отправить один конкретный тег
git push origin v1.5.0

# Отправить все локальные теги, которых еще нет на удаленном сервере
git push origin --tags
# Внимание: `--tags` отправит и аннотированные, и легковесные теги.

3. Просмотр и управление тегами

# Список всех тегов
git tag
# Список тегов по шаблону (например, v1.x)
git tag -l "v1.*"

# Показать информацию о конкретном теге
git show v1.5.0

# Удалить локальный тег
git tag -d v0.9-beta

# Удалить тег с удаленного сервера
git push origin --delete v0.9-beta
# Или
git push origin :refs/tags/v0.9-beta

4. Использование в CI/CD пайплайнах Теги часто триггерят сборку релиза. Пример для GitLab CI:

release_job:
  stage: deploy
  rules:
    - if: $CI_COMMIT_TAG  # Запускается только если сделан push тега
  script:
    - echo "Building release $CI_COMMIT_TAG"
    - docker build -t myapp:$CI_COMMIT_TAG .

Рекомендация: Следуйте Семантическому Версионированию (SemVer) (MAJOR.MINOR.PATCH, например, 2.1.13) для аннотированных тегов. Это стандарт де-факто для автоматизации.