Удаление тега в Git - команда git tag -d

17 декабря 2025
Автор

Олег Марков

Введение

Удаление тегов в Git вызывает много вопросов именно потому, что тег обычно связан с релизами, сборками и интеграциями. Если просто удалить тег не разобравшись, легко сломать CI, скрипты деплоя или запутать команду.

В этой статье вы увидите, как работает команда git tag -d, когда ее правильно применять, чем локальные теги отличаются от тегов в удаленном репозитории и как безопасно удалить тег так, чтобы не создать лишних проблем.

Давайте разбираться пошагово, на практических примерах.

Что такое тег в Git и зачем его удалять

Кратко о тегах

Тег в Git — это именованная ссылка на конкретный commit.

Смотрите, теги чаще всего используют для:

  • пометки релизов (v1.0.0, v2.3.1);
  • фиксации важных состояний кода (например, после крупного рефакторинга);
  • отметки версий, которые используют внешние системы.

По сути, тег — это удобная «этикетка» на историю репозитория: вы всегда можете быстро вернуться к нужному состоянию кода.

Почему может понадобиться удалить тег

Причин несколько:

  • тег создан с опечаткой в имени (v1.0.0 вместо v1.0.0-rc1);
  • тег указывает на неверный commit (релиз собрали не из той ветки);
  • нужно переименовать тег (переименование в Git делается через создание нового и удаление старого);
  • нужно освободить имя тега под другую версию;
  • тег не должен больше использоваться (например, ошибочный релиз отозван).

Обратите внимание: удаление тега не удаляет сам commit из истории. Вы удаляете только метку, которая на него указывает. История проекта остается целой.

Виды тегов и их особенности при удалении

Локальные и удаленные теги

Здесь важно разделять два понятия:

  • локальный тег — существует только в вашем локальном репозитории;
  • удаленный тег — тег, который уже отправлен на сервер (GitHub, GitLab, Bitbucket и т.п.).

Команда git tag -d работает только с локальными тегами. Если вы удалите тег локально, он останется в удаленном репозитории, пока вы не выполните отдельную команду для его удаления на сервере.

Аннотированные и легковесные теги

Теги в Git бывают:

  • аннотированные (annotated) — содержат сообщение, автора, дату;
  • легковесные (lightweight) — просто имя, указывающее на commit, без дополнительной метаинформации.

С точки зрения удаления это не играет роли — git tag -d удаляет и те, и другие одинаково. Но полезно помнить, что часто релизы помечают аннотированными тегами, а экспериментальные версии — легковесными.

Базовое использование git tag -d

Просмотр существующих тегов

Перед удалением тега удобно сначала посмотреть список всех тегов.

Вы можете это сделать так:

git tag
# Вывод может быть таким:
# v0.9.0
# v1.0.0
# v1.1.0-beta

Если тегов много, можно отфильтровать их по шаблону:

git tag -l "v1.*"
# Фильтруем все теги, начинающиеся с v1.

Это помогает быстро найти нужный тег перед удалением.

Удаление одного тега

Теперь давайте посмотрим, как удалить один конкретный тег локально.

git tag -d v1.0.0
# -d означает delete - удалить тег с именем v1.0.0

Если тег существует, Git покажет примерно такой вывод:

Deleted tag 'v1.0.0' (was 1a2b3c4)
# Здесь 1a2b3c4 - это сокращенный хеш commit, на который указывал тег

Если вы ошиблись в имени и такого тега нет, вы увидите ошибку:

git tag -d v1.0.1
# error: tag 'v1.0.1' not found.

В такой ситуации проверьте список тегов командой git tag и убедитесь, что имя написано без опечаток.

Удаление нескольких тегов за раз

Смотрите, вам не нужно вызывать git tag -d для каждого тега по отдельности. Можно удалить несколько тегов одним вызовом:

git tag -d v0.9.0 v1.0.0 v1.1.0-beta
# Здесь мы удаляем сразу три тега

Git удалит каждый указанный тег и выведет сообщения по каждому:

Deleted tag 'v0.9.0' (was 9f8e7d6)
Deleted tag 'v1.0.0' (was 1a2b3c4)
Deleted tag 'v1.1.0-beta' (was 5d6e7f8)

Такой подход полезен, когда вы чистите старые или тестовые теги.

Удаление тегов по шаблону и скриптами

Массовое удаление по шаблону

Git не поддерживает «маску» прямо в git tag -d, но вы можете использовать shell-комбинации.

Например, вам нужно удалить все теги, начинающиеся с test-:

git tag -d $(git tag -l "test-*")
# Сначала git tag -l "test-*" выводит список тегов
# Затем оболочка подставляет их в команду git tag -d

Обратите внимание: если по шаблону не найдено ни одного тега, конструкция с $(...) может выдать ошибку в некоторых оболочках. В таких случаях удобно сначала проверить, что команда git tag -l что-то нашла.

Удаление с использованием xargs

Еще один вариант — через xargs:

git tag -l "test-*" | xargs git tag -d
# Слева мы получаем список тегов
# xargs берет эти имена и передает их в git tag -d

Этот подход хорошо подходит для сложных фильтров и массовых операций.

Давайте посмотрим пример чуть сложнее: удаляем все теги, содержащие слово draft:

git tag -l "*draft*" | xargs git tag -d
# Удаляем все теги, в имени которых есть подстрока draft

Такие конструкции уже ближе к скриптам, и здесь важно относиться к ним аккуратно: перед запуском лучше сначала просто посмотреть список:

git tag -l "*draft*"
# Смотрите список и убеждаетесь, что именно эти теги нужно удалить

Удаление тега в удаленном репозитории

Важное различие: локально и на сервере

Команда git tag -d не трогает теги в удаленном репозитории. Это принципиальный момент.

Если вы уже пушили тег на сервер (например, на origin), его нужно удалить отдельно с помощью git push.

Сценарий такой:

  1. удалить тег локально — git tag -d;
  2. удалить тег на удаленном репозитории — git push origin :refs/tags/ или git push origin --delete .

Давайте разберем эти варианты детальнее.

Удаление тега на удаленном репозитории через ref-нотацию

Классический способ:

git push origin :refs/tags/v1.0.0
# Слева перед двоеточием пусто - это означает "удалить" соответствующую ссылку
# refs/tags/v1.0.0 - полное имя ссылки на тег

Здесь Git понимает: раз мы «отправляем» пустую ссылку в место refs/tags/v1.0.0, тег нужно удалить на сервере.

Часто перед этим вы уже удалили тег локально:

git tag -d v1.0.0        # удаляем локальный тег
git push origin :refs/tags/v1.0.0   # удаляем тег на сервере

Удаление тега на удаленном репозитории с --delete

Современный и более читаемый вариант:

git push origin --delete v1.0.0
# Здесь Git сам поймет что нужно удалить тег с именем v1.0.0 на ремоуте origin

Этот синтаксис проще запомнить и использовать. Внутренне он делает то же самое, что и вариант с :refs/tags/...

Удаление нескольких удаленных тегов

Чтобы удалить сразу несколько тегов на удаленном репозитории, вы можете передать несколько имен:

git push origin --delete v0.9.0 v1.0.0 v1.1.0-beta
# Удаляем сразу три тега на репозитории origin

Но помните: удаление на удаленном репозитории уже может повлиять на других разработчиков, а также на CI и автодеплой. Лучше сначала обсудить такие изменения с командой.

Проверка результата на удаленном репозитории

После удаления тега на сервере убедитесь, что он действительно исчез:

git fetch --tags
# Обновляем информацию о тегах с сервера

git tag -l
# Смотрим текущий список тегов в локальном репозитории

Если тег больше не отображается — удаление прошло успешно.

На GitHub и других платформах вы также можете проверить список тегов в веб-интерфейсе.

Типичные сценарии использования git tag -d

1. Исправление тега, который указывает не на тот commit

Это одна из самых частых ситуаций: релизный тег создали, но потом обнаружили, что он указывает не на нужный commit.

Смотрите, как это исправить:

  1. Удаляем старый тег локально:
git tag -d v1.2.0
# Удаляем неправильный локальный тег
  1. Удаляем тот же тег на удаленном репозитории:
git push origin --delete v1.2.0
# Удаляем тег на сервере
  1. Создаем новый тег на правильном commit:
git checkout release-branch
# Переходим в ветку где лежит правильный commit

git tag -a v1.2.0 -m "Release v1.2.0"
# Создаем аннотированный тег на текущем commit с сообщением
  1. Отправляем новый тег на сервер:
git push origin v1.2.0
# Публикуем исправленный тег

Так вы «переопределяете» тег, причем делаете это явно и контролируемо.

2. Переименование тега

В Git нет прямой команды для переименования тега, но вы можете реализовать это через создание нового и удаление старого.

Пример: хотите переименовать тег v1.0.0-beta в v1.0.0-rc1.

# Сначала узнаем commit на который указывает старый тег
git show v1.0.0-beta
# В выводе увидите хеш commit, например 1234abcd

# Cоздаем новый тег на тот же commit
git tag -a v1.0.0-rc1 1234abcd -m "Release candidate 1"
# Здесь мы явно указываем commit хеш

# Удаляем старый тег локально
git tag -d v1.0.0-beta

Если старый тег уже есть на сервере, продолжим:

# Удаляем старый тег на удаленном репозитории
git push origin --delete v1.0.0-beta

# Отправляем новый тег
git push origin v1.0.0-rc1

Давайте обратим внимание: так вы сохраняете связь с исходным commit, но меняете только имя тега.

3. Удаление временных или тестовых тегов

Иногда вы создаете теги для тестов или временной фиксации. Например, test-build-1, test-build-2 и так далее. Такие теги можно периодически чистить.

Пример:

# Смотрим все тестовые теги
git tag -l "test-build-*"

# Удаляем их локально
git tag -d $(git tag -l "test-build-*")

# При необходимости удаляем с сервера
git tag -l "test-build-*" | xargs -I {} git push origin --delete {}
# Здесь {} - подстановочное место для имени тега

Здесь я привожу пример с xargs -I {}, чтобы вам было проще увидеть, как имя тега подставляется в команду git push origin --delete.

Важные нюансы и безопасность при удалении тегов

Удаление тега не удаляет commit

Это ключевой момент:
когда вы выполняете команду:

git tag -d v1.0.0
# Удаляем только имя тега

Исходный commit по-прежнему остается в истории. Если вы знаете его хеш, вы можете:

  • посмотреть его через git show ;
  • создать на нем новый тег;
  • перейти к нему через git checkout .

Тег — это всего лишь «ярлык» на уже существующий commit.

Что если тег уже используют другие

Если тег используется:

  • в CI-пайплайнах;
  • в скриптах деплоя;
  • внешними сервисами (например, Docker-автоматизацией);
  • другими разработчиками как ориентир на определенную версию,

то его удаление (особенно на удаленном репозитории) может привести к непредвиденным эффектам.

Перед тем как удалять такой тег на сервере, стоит:

  • обсудить изменения с командой;
  • убедиться, что его действительно нужно убрать или переопределить;
  • при необходимости — заранее уведомить ответственных за инфраструктуру.

Конфликтующие теги при клонировании и fetch

Иногда возникает ситуация:

  • вы удалили локальный тег;
  • на сервере он остался;
  • вы делаете git fetch --tags, и тег снова появляется локально.

Это ожидаемое поведение.

Если вы хотите, чтобы тег исчез полностью, нужно удалить его и локально, и на сервере. Только в этом случае следующие fetch или clone уже его не создадут.

Практические примеры пошагово

Пример 1. Полный цикл: удалить локальный и удаленный тег

Давайте разберем полный цикл удаления тега v2.0.0, который уже есть и у вас локально, и на сервере.

  1. Проверяем, есть ли тег:
git tag -l "v2.0.0"
# Если в выводе видите v2.0.0 - тег существует локально
  1. Удаляем локально:
git tag -d v2.0.0
# Удаляем тег в локальном репозитории
  1. Удаляем на удаленном репозитории:
git push origin --delete v2.0.0
# Удаляем тег на репозитории origin
  1. Проверяем:
git fetch --tags
# Обновляем список тегов с сервера

git tag -l "v2.0.0"
# Если выход пустой - тега больше нет ни локально, ни на сервере

Пример 2. Удалить все теги, кроме определенных

Представьте, что у вас огромное количество тегов, но вы хотите оставить только теги v2.* и удалить все остальные.

Здесь я показываю один из возможных подходов:

# Сначала посмотрим какие теги у нас вообще есть
git tag -l
# Допустим, видим теги v1.*, v2.*, test-*, old-*

# Теперь сформируем список тегов не начинающихся с v2.
git tag -l | grep -v "^v2\." > tags-to-delete.txt
# grep -v отфильтровывает все строки НЕ начинающиеся с v2.
# Результат сохраняем в файл tags-to-delete.txt

Проверяем содержимое файла:

cat tags-to-delete.txt
# Здесь вы можете убедиться что список вас устраивает

Удаляем теги из файла локально:

xargs git tag -d < tags-to-delete.txt
# xargs возьмет имена тегов из файла и передаст их в git tag -d

При желании так же можно удалить их на сервере:

xargs -I {} git push origin --delete {} < tags-to-delete.txt
# Для каждого тега {} подставится в команду удаления на ремоуте

Этот пример показывает, как можно комбинировать git tag -d с обычными утилитами командной строки.

Пример 3. Отмена случайно созданного тега

Иногда случается так: вы случайно создали тег с неправильным именем или на неверном commit, но еще не успели его запушить.

Допустим, вы выполнили:

git tag wrong-tag
# Создали легковесный тег с именем wrong-tag

Понимаете, что он вам не нужен:

git tag -d wrong-tag
# Просто удаляем его локально

На этом все: поскольку тег не был отправлен на сервер, никаких дополнительных действий делать не нужно.

Рекомендации по работе с тегами и git tag -d

Документируйте политику тегов в проекте

Чтобы не приходилось часто удалять или переопределять теги, полезно заранее договориться в команде:

  • как именно называются релизные теги (семантическое версионирование, префиксы и т.п.);
  • кто имеет право создавать и удалять теги в удаленном репозитории;
  • что делать с тегами ошибочных релизов — переопределять или помечать особыми именами.

Чем понятнее политика, тем реже вам придется использовать git tag -d для критичных тегов.

Не переопределяйте публичные релизные теги без крайней необходимости

Если тег уже использован для реального релиза, его переопределение (удаление и создание заново на другом commit) может запутать пользователей и систему.

Иногда надежнее:

  • оставить старый тег как есть;
  • создать новый тег (например, v1.0.1 вместо v1.0.0);
  • в описании релиза явно указать, что предыдущая версия не рекомендуется к использованию.

Команда git tag -d в таких случаях нужна больше для тестовых, промежуточных и ошибочных тегов.

Всегда проверяйте, какой commit помечен тегом, перед удалением

Вы можете использовать:

git show v1.0.0
# Показывает commit, на который указывает тег, и его контекст

Смотрите на сообщение commit и изменения. Это помогает убедиться, что вы удаляете именно тот тег, который хотели.

Заключение

Команда git tag -d — это простой, но важный инструмент управления тегами в Git. Она позволяет:

  • удалять один или несколько локальных тегов;
  • сочетаться с другими командами (git push --delete) для удаления тегов на удаленном репозитории;
  • поддерживать чистоту и порядок в системе версий.

Вы увидели, что при удалении тегов важно четко понимать:

  • различие между локальными и удаленными тегами;
  • влияние удаления на команду и инфраструктуру;
  • какие commit остаются в истории и как к ним можно вернуться.

Используя git tag -d осознанно и аккуратно, вы сможете без лишних проблем исправлять ошибки в тегах, переименовывать их и поддерживать репозиторий в аккуратном состоянии.

Частозадаваемые технические вопросы по теме и ответы

Как удалить тег только на удаленном репозитории, не трогая локальный

Если вы хотите убрать тег с сервера, но сохранить его локально, сделайте так:

git push origin --delete v1.0.0
# Удаляем тег только на ремоуте origin

Локальный тег при этом останется. При следующих fetch и push Git не восстановит его на сервере автоматически, пока вы сами не запушите тег обратно:

git push origin v1.0.0
# Вернет тег на сервер

Что делать, если после git tag -d тег все равно появляется снова

Скорее всего, тег существует на удаленном репозитории и подтягивается при git fetch --tags. Нужно удалить его и там:

git tag -d v1.0.0           # удаляем локально
git push origin --delete v1.0.0   # удаляем на сервере
git fetch --tags            # обновляем список тегов

После этого тег больше не должен появляться.

Как узнать, на какой commit указывал уже удаленный тег

Если вы только что удалили тег, в выводе git tag -d Git обычно показывает хеш commit:

Deleted tag 'v1.0.0' (was 1a2b3c4)
# Здесь 1a2b3c4 - нужный вам commit

Если вы уже потеряли это сообщение, можно посмотреть reflog тега (если он еще хранится в локальной истории):

git reflog refs/tags/v1.0.0
# Показывает историю перемещения ссылки тега

Из reflog вы сможете взять хеш commit и при необходимости создать новый тег на нем.

Можно ли отменить удаление тега

Да, если вы знаете commit, на который указывал тег. Просто создайте его заново:

git tag v1.0.0 <commit-hash>
# Восстанавливаем тег с прежним именем на прежнем commit

Если commit до сих пор в истории, тег восстановится без проблем. Если вы ранее удалили тег и на локальном, и на удаленном репозитории, то после восстановления не забудьте запушить его:

git push origin v1.0.0

Как безопасно удалить теги только в текущем локальном репозитории, не влияя на других разработчиков

Все, что вы делаете с тегами в своем локальном репозитории через git tag -d, не влияет на других, пока вы не выполняете команды git push.

Чтобы гарантированно не затронуть других:

  • используйте только git tag -d без git push --delete;
  • не выполняйте git push --tags после локальной «чистки», если не хотите обновлять теги на сервере;
  • при необходимости можете откатить локальные изменения, пересоздав нужные теги.
Стрелочка влевоЛегковесный тег в Git - работа с командой git tag -lСоздание тега в Git с помощью git tagСтрелочка вправо

Постройте личный план изучения Git до уровня Middle — бесплатно!

Git — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Git

Открыть базу знаний

Лучшие курсы по теме

изображение курса

Основы Git

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий