← Git: рабочие процессы
9 мин · просто · Урок 2 из 3

Теги и релизы в git

Lightweight vs annotated теги, как пометить версию, запушить тег и из чего собирается release.

Зачем помечать коммиты

Ветка — это движущийся указатель: main сегодня показывает на один коммит, завтра на другой. Для релиза такое не годится. Нужна неподвижная метка на конкретном коммите, чтобы через год точно знать, из чего собрана версия 2.4.1. Этим и занимается тег.

Тег ставится на коммит один раз и больше не двигается. По соглашению тег версии начинается с v: v2.4.1.

Lightweight и annotated

Теги бывают двух видов.

Lightweight — просто имя для коммита, без метаданных:

git tag v2.4.1

Annotated — полноценный объект с автором, датой и сообщением:

git tag -a v2.4.1 -m "release 2.4.1"

Для релизов используют annotated: видно, кто и когда выпустил версию, и тег можно подписать GPG. Lightweight оставляют для временных личных пометок.

Посмотреть, что внутри:

$ git show v2.4.1
tag v2.4.1
Tagger: Ivan <ivan@example.com>
Date:   Thu Jun 18 12:00:00 2026
release 2.4.1
commit a3f1c...

Теги не уходят при обычном push

Важный момент: git push отправляет коммиты, но не теги. Тег нужно толкнуть явно:

git push origin v2.4.1        # один тег
git push origin --tags        # все теги сразу

Частая ошибка: версию выпустили локально, а на сервере её нет, потому что забыли запушить тег. Скачать чужие теги: git fetch --tags.

Из тега собирается release

На GitLab и GitHub поверх тега строится release: страница с описанием версии, changelog и прикреплённые артефакты (собранные бинарники, архивы).

В CI это обычно автоматизируют: push тега v* запускает пайплайн, который собирает артефакт, прогоняет тесты и публикует release. Так номер версии, коммит, собранный образ и release-страница оказываются жёстко связаны одним тегом.

# фрагмент .gitlab-ci.yml
build-release:
  rules:
    - if: $CI_COMMIT_TAG =~ /^v/
  script:
    - docker build -t "myapp:$CI_COMMIT_TAG" .

CI_COMMIT_TAG — встроенная переменная с именем тега, GitLab подставляет её сам, когда пайплайн запущен пушем тега.

Что важно запомнить

Тег — неподвижная метка на коммите; для релизов берут annotated-тег (-a), у него есть автор, дата и сообщение.

git push сам теги не отправляет: нужен git push origin <tag> или --tags. Из-за забытого тега и получается «релиз есть локально, на сервере нет».

Поверх тега v* CI собирает release: артефакт, changelog, страница версии, всё связано одним тегом.

В следующих треках теги встретятся в CI/CD и при выкатке образов в registry.

Прошли материал до конца? Отметьте урок пройденным.