Олег Марков
Удаление тега в Git - команда git tag -d
Введение
Удаление тегов в 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.
Сценарий такой:
- удалить тег локально — git tag -d;
- удалить тег на удаленном репозитории — 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.
Смотрите, как это исправить:
- Удаляем старый тег локально:
git tag -d v1.2.0
# Удаляем неправильный локальный тег
- Удаляем тот же тег на удаленном репозитории:
git push origin --delete v1.2.0
# Удаляем тег на сервере
- Создаем новый тег на правильном commit:
git checkout release-branch
# Переходим в ветку где лежит правильный commit
git tag -a v1.2.0 -m "Release v1.2.0"
# Создаем аннотированный тег на текущем commit с сообщением
- Отправляем новый тег на сервер:
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, который уже есть и у вас локально, и на сервере.
- Проверяем, есть ли тег:
git tag -l "v2.0.0"
# Если в выводе видите v2.0.0 - тег существует локально
- Удаляем локально:
git tag -d v2.0.0
# Удаляем тег в локальном репозитории
- Удаляем на удаленном репозитории:
git push origin --delete v2.0.0
# Удаляем тег на репозитории origin
- Проверяем:
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 до уровня Middle — бесплатно!
Git — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Git
Лучшие курсы по теме

Основы Git
Антон Ларичев
TypeScript с нуля
Антон Ларичев