# Удаление и управление тегами в Git

Ниже описаны основные команды для удаления тегов в Git и различия между лёгкими и аннотированными тегами.

---

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

### 1. Локальное удаление тега

```bash
git tag -d v0.1.0
```

**Что делает**

- Удаляет локальную метку (тег) с именем `v0.1.0` из вашего репозитория.

**Как это работает “под капотом”**

1. Git хранит теги как файлы в каталоге `.git/refs/tags/`.
2. Команда удаляет файл:

```
   .git/refs/tags/v0.1.0
```

3. История коммитов не меняется, просто исчезает локальный указатель `v0.1.0`.

**Пример вывода**

```bash
$ git tag -d v0.1.0
Deleted tag 'v0.1.0' (was a1b2c3d)
```

Где `a1b2c3d` — SHA-1 коммита, на который указывал удалённый тег.

---

### 2. Удаление тега на удалённом сервере

```bash
git push --delete origin v0.1.0
```

**Что делает**

- Удаляет тег `v0.1.0` на удалённом репозитории `origin`.

**Как это работает “под капотом”**

1. Git преобразует команду в удалённый запрос удаления рефа:

```
   :refs/tags/v0.1.0
```

2. Отправляет запрос на сервер `origin`, где удаляется файл `refs/tags/v0.1.0`.
3. При последующем `git fetch` или новом клонировании этот тег больше не будет виден.

**Пример вывода**

```bash
$ git push --delete origin v0.1.0
To git@github.com:yourname/your-repo.git
 - [deleted]         v0.1.0
```

---

### 3. Полный сценарий: удаление и перевыпуск тега

```bash
# 1. Локально удаляем старый тег
git tag -d v0.1.0

# 2. Удаляем его на удалённом сервере
git push --delete origin v0.1.0

# 3. (Опционально) Создаём новый тег на другом коммите
git tag -a v0.1.0 -m "Release version 0.1.0"

# 4. Пушим новый тег на сервер
git push origin v0.1.0
```

---

## Типы тегов в Git

В Git существуют два основных вида тегов:

1. **Лёгкие (lightweight) теги**
2. **Аннотированные (annotated) теги**

---

### Лёгкий тег (`git tag v0.1.0`)

```bash
git tag v0.1.0
```

- Ярлык (символьная ссылка) на указанный коммит (по умолчанию на `HEAD`).
- Не создаёт отдельного объекта в хранилище Git.
- Не содержит метаданных (автор, дата, сообщение).
- Используется для быстрых личных “закладок”.

---

### Аннотированный тег

```bash
git tag -a v0.1.0 -m "Release version 0.1.0"
```

- Создаёт объект типа `tag` в `.git/objects/…`.
- Сохраняет: 
    - Имя автора (tagger) и дату создания.
    - Текстовое сообщение описания.
    - (Опционально) PGP-подпись (`git tag -s …`).
- Рекомендуется для официальных релизов.

---

### Сравнительная таблица

<table id="bkmrk-%D0%A5%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0-%D0%9B%D1%91%D0%B3%D0%BA%D0%B8"><thead><tr><th id="bkmrk-%D0%A5%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0">Характеристика</th><th id="bkmrk-%D0%9B%D1%91%D0%B3%D0%BA%D0%B8%D0%B9-%D1%82%D0%B5%D0%B3">Лёгкий тег</th><th id="bkmrk-%D0%90%D0%BD%D0%BD%D0%BE%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9-%D1%82%D0%B5%D0%B3-1">Аннотированный тег</th></tr></thead><tbody><tr><td>Объект в базе данных</td><td>Отсутствует</td><td>Присутствует (тип `tag`)</td></tr><tr><td>Метаданные (автор, дата)</td><td>Нет</td><td>Да</td></tr><tr><td>Сообщение</td><td>Нет</td><td>Да (через `-m`)</td></tr><tr><td>Возможность GPG-подписи</td><td>Нет</td><td>Да (ключ `-s`)</td></tr><tr><td>Вывод `git show <tag>`</td><td>Показывает сразу коммит</td><td>Сначала показывает данные тега, затем коммит</td></tr></tbody></table>

---

### Итог

- **`git tag v0.1.0`** — лёгкий, простой указатель без описания и метаданных.
- **`git tag -a v0.1.0 -m "…"`** — документированная, полнофункциональная и (опционально) подписанная метка, идеальная для релизов.