GitHub -- Releases и теги

Git tag — именованная метка на конкретный коммит; GitHub Release — публикация версии с описанием изменений, прикреплёнными файлами и автоматической ссылкой на архив кода.

Зачем нужно

Теги фиксируют конкретный момент в истории как «версия 1.2.0». GitHub Releases делают версии публичными: пользователи видят changelog, могут скачать архив. Для npm-пакетов публикация версии неотделима от тега. Без тегов невозможно откатиться к точной версии в продакшне.

Где используется

  • npm-пакеты: каждая публикация в npm привязана к тегу
  • Продуктовые приложения: фиксация версий для деплоя
  • Open source: пользователи следят за Releases для обновлений
  • CI/CD: триггер деплоя по тегу v*.*.*

Основной контент

Git теги

# Создать легковесный тег (просто указатель)
git tag v1.0.0

# Создать аннотированный тег (с автором, датой, сообщением)
git tag -a v1.0.0 -m "Release version 1.0.0"

# Тег для конкретного коммита
git tag -a v1.0.0 a1b2c3d -m "Release 1.0.0"

# Просмотр тегов
git tag                    # список всех
git tag -l "v1.*"          # по паттерну
git show v1.0.0            # детали тега

# Запушить теги в remote
git push origin v1.0.0     # один тег
git push origin --tags     # все теги

Семантическое версионирование (SemVer)

Формат: MAJOR.MINOR.PATCHv1.2.3

Часть Когда увеличивать Пример
MAJOR Ломающие изменения (breaking changes) 1.0.0 → 2.0.0
MINOR Новые фичи (обратно совместимые) 1.0.0 → 1.1.0
PATCH Исправления багов 1.0.0 → 1.0.1

Предрелизные: v1.0.0-beta.1, v2.0.0-rc.1

GitHub Release

На GitHub: ReleasesDraft a new release → выбрать тег (или создать новый) → написать описание.

Хорошее описание Release:

## What's Changed

### New Features
- Добавлена тёмная тема (#123)
- Поддержка OAuth 2.0 (#145)

### Bug Fixes
- Исправлен краш при пустом списке (#167)

### Breaking Changes
- `init` теперь возвращает Promise (ранее void)

**Full Changelog**: https://github.com/user/repo/compare/v1.1.0...v1.2.0

Автоматическое создание тегов в CI

# GitHub Actions: создать релиз при пуше тега
name: Release
on:
  push:
    tags:
      - 'v*'

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Create Release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}

npm publish по тегу

npm version patch    # обновляет package.json + создаёт тег
git push --follow-tags
npm publish          # публикует на npmjs.com

Частые ошибки

  • Тег без pushgit tag создаёт тег локально; нужен git push origin --tags
  • Не следовать SemVer — произвольные версии (v1, v2, v9000) ломают ожидания пользователей
  • Не удалять ошибочный тег — тег можно удалить: git tag -d v1.0.0 + git push origin --delete v1.0.0; на npm — нельзя, только deprecate

Связанные темы

Ресурсы