Компьютеры · Инструкция
git push --follow-tags: когда использовать и чем он отличается от --tags
git push --follow-tags полезен в release‑процессе, когда ветку и связанный с ней annotated tag хочется публиковать.
Короткий ответ
git push --follow-tags отправляет с веткой недостающие annotated tags из её истории. Чем отличается от --tags, lightweight tags и как проверить push.
Как опубликовать ветку и релизный тег одной командой
- Создайте или проверьте annotated tag, например `git tag -a v2.4.0 -m "Release 2.4.0"`. Аннотированный тег хранит отдельный tag object с автором, датой и сообщением; именно такие теги учитывает `--follow-tags` по своему назначению.
- Убедитесь, что tagged commit входит в историю ветки, которую вы собираетесь отправить: `git merge-base --is-ancestor v2.4.0 main` должен завершиться успешно для обычного релизного сценария. Если тег указывает на несвязанную историю, `--follow-tags` не обязан его подхватывать.
- Сначала выполните `git push --dry-run --follow-tags origin main`, если ваша версия Git и сервер поддерживают ожидаемый dry-run вывод. Просмотрите список refs: там должна быть ветка и нужный тег, но не набор случайных локальных тегов.
- Выполните `git push --follow-tags origin main`. После успеха проверьте `git ls-remote --tags origin` или веб-интерфейс GitHub/GitLab и убедитесь, что тег появился на remote.
- Если такое поведение нужно всегда, можно включить `git config --global push.followTags true` или настройку только в конкретном репозитории. Для разовой отмены используйте явное поведение команды, а не полагайтесь на память о глобальной конфигурации.
Важно: Для CI/release лучше явно писать `--follow-tags` в скрипте, даже если у разработчика включён `push.followTags=true`. Скрипт тогда не зависит от локальной конфигурации агента.
Почему lightweight tag может не отправиться с --follow-tags
Lightweight tag — это фактически ref, который прямо указывает на объект, без отдельного tag object. Annotated tag хранит дополнительный объект с метаданными и сообщением. Поведение `--follow-tags` в документации сформулировано именно для annotated tags, поэтому ожидать автоматической публикации каждой lightweight‑метки неправильно. Если команда релиза создала `git tag v2.4.0` без `-a`, а затем CI выполняет `git push --follow-tags`, ветка может уйти, а ожидаемый тег — нет. Исправление зависит от политики проекта: либо создавайте релизные теги как annotated, либо пушьте нужный тег явно `git push origin v2.4.0`. Не стоит заменять проблему на `git push --tags`, если репозиторий содержит локальные экспериментальные теги: такой push затронет гораздо более широкий набор refs.
Предупреждение: Если релиз уже опубликован без тега, безопаснее отправить конкретный проверенный тег явно, чем включать `--tags` ради одного отсутствующего ref.
Проверка перед release push
- Тег annotated: `git cat-file -t <tag>` показывает `tag`, а не только commit.
- Tagged commit достижим из ветки, которая входит в текущий push.
- Имя тега соответствует принятой в проекте схеме версий.
- Dry-run не показывает неожиданные refs.
- Remote и branch указаны явно в автоматизации.
- На сервере нет правила защиты, запрещающего создание тега этим токеном.
Что учитывать
Lightweight tag — это фактически ref, который прямо указывает на объект, без отдельного tag object. Annotated tag хранит дополнительный объект с метаданными и сообщением. Поведение `--follow-tags` в документации сформулировано именно для annotated tags, поэтому ожидать автоматической публикации каждой lightweight‑метки неправильно. Если команда релиза создала `git tag v2.4.0` без `-a`, а затем CI выполняет `git push --follow-tags`, ветка может уйти, а ожидаемый тег — нет. Исправление зависит от…
Источники и проверка
Фактическая часть сверена по первичным источникам (в т.ч. git-push Documentation). Пример и формулировки — редакция N1RO на 2026-09-21.