Работа с тегами

Как и большинство систем контроля версий, Git имеет возможность помечать определенные моменты в истории как важные.

Как правило, эта функциональность используется для того, чтобы пометить моменты выпуска версий (v1.0, и т. п.). Такие пометки в Git называются тегами.

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

Просмотреть теги

Поскольку тегами помечаются те или иные коммиты, увидеть теги можно в разделе Граф системы управления версиями (Source Control Graph), если открыть подробную информацию о коммите. На картинке коммит помечен тегом v2.0.

В расширении Git Graph теги отображаются удобнее, прямо в общем списке коммитов. К тому же поиск работает и по тегам, что позволяет быстро находить нужные коммиты.

Если вы хотите увидеть список всех имеющихся тегов, то для этого можно воспользоваться командной строкой и командой git tag:

> git tag
v1.0
v2.0

Данная команда перечисляет теги в алфавитном порядке.

Так же можно выполнить поиск тега по шаблону. Например, репозиторий Git содержит более 500 тегов. Если вы хотите посмотреть теги версий 1.8.5, то выполните следующую команду:

> git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5

Для отображения тегов согласно шаблону требуются параметры -l или --list.

Если вы хотите посмотреть весь список тегов, стандартный запуск команды git tag подразумевает это и выводит полный список. В этом случае параметры -l или --list можно не использовать.

Если вы хотите отфильтровать список тегов согласно шаблону, использование параметров -l или --list становится обязательным.

Создать тег

Git использует два основных типа тегов: легковесные и аннотированные.

Легковесный тег?—?это что-то очень похожее на ветку, которая не изменяется. Просто указатель на определенный коммит.

А вот аннотированные теги хранятся в базе данных Git как полноценные объекты. Они имеют контрольную сумму, содержат имя автора, адрес его электронной почты и дату создания, имеют комментарий и могут быть подписаны и проверены с помощью GNU Privacy Guard (GPG).

Обычно рекомендуется создавать аннотированные теги, чтобы иметь всю перечисленную информацию, но если вы хотите сделать временную метку или по какой-то причине не хотите сохранять остальную информацию, то для этого годятся и легковесные.

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

Создать аннотированный тег для текущего коммита легко. Просто нажмите Теги > Создать тег... (Tags > Create Tag...) в дополнительном меню репозитория в представлении Система управления версиями (Source Control).

В палитре команд введите имя тега и нажмите Ввод.

Затем введите сообщение тега и снова нажмите Ввод.

Посмотреть данные аннотированного тега можно в расширении Git Graph или в командной строке.

В расширении Git Graph нажмите View Details в контекстном меню тега.

Вы увидите подробную информацию о хранимом теге.

Посмотреть данные аннотированного тега в командной строке можно с помощью команды git show.

> git show v2.0
tag v2.0
Tagger: devmaster <devmaster@example.com>
Date:   Mon Nov 11 11:33:44 2024 +0300

Финальная версия

commit 2c9f3642bd29b3ace4b5aa76443ac714dc4963a0 (HEAD -> main, tag: v2.0, origin/main)
Author: devmaster <devmaster@example.com>
Date:   Wed Nov 6 11:55:26 2024 +0300

    Изменил сообщения, выводимые в консоль
...

Здесь приведена информация об авторе тега, дате его создания и аннотирующее сообщение перед информацией о коммите.

Легковесные теги

Легковесный тег?—?это еще один способ пометить коммит. По сути, это контрольная сумма коммита, сохраненная в файл. Больше никакой информации не хранится.

Легковесный тег можно создать той же командой, что и аннотированный, просто не вводите аннотирующее сообщение, а нажмите Ввод.

В расширении Git Graph у такого тега будет отсутствовать контекстная команда, а в командной строке вы не увидите дополнительной информации. Команда просто покажет коммит.

> git show v1.0
commit 4c30ca536b7ac24502f40405fdebdbcee9c103a2 (tag: v1.0)
Author: devmaster <devmaster@example.com>
Date:   Sat Nov 2 14:13:45 2024 +0300

    Первый коммит
...

Выставить теги позже

Также можно помечать уже пройденные коммиты. Для этого в разделе Граф системы управления версиями (Source Control Graph) найдите нужный коммит и в его контекстном меню нажмите Создать тег... (Create Tag...).

Затем, как и в предыдущих сценариях, с помощью палитры команд вы можете создать аннотированный либо легковесный тег.

Обменяться тегами

В стандартном варианте команда Отправка (Push) не отправляет теги на удаленные серверы. После создания тега его нужно отправить на удаленный сервер в явном виде.

Это можно сделать в расширении Git Graph или с помощью командной строки.

В расширении Git Graph нажмите Push Tag... в контекстном меню тега.

В командной строке выполните команду git push с указанием имени удаленного репозитория и имени отправляемого тега.

> git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
To https://github.com/1C-EDT-Developer/coldevexremote.git
 * [new tag]         v1.0 -> v1.0

Если у вас много тегов, и вам хотелось бы отправить все за один раз, то можно использовать параметр --tags для команды git push. В таком случае все ваши теги отправятся на удаленный сервер (если только их уже там нет).

> git push origin --tags
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 186 bytes | 186.00 KiB/s, done. 
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
To https://github.com/1C-EDT-Developer/coldevexremote.git
 * [new tag]         v1.0 -> v1.0
 * [new tag]         v2.0 -> v2.0

Теперь, если кто-то клонирует (Git: Клонировать (Git: Clone)) или выполнит Вытягивание (Pull) из вашего репозитория, то он получит вдобавок к остальному и ваши метки.

Отправка тегов командой git push <remote> --tags не различает аннотированные и легковесные теги. В настоящее время не существует опции чтобы отправить только легковесные теги, но если использовать команду git push <remote> --follow-tags, то отправятся только аннотированные теги.

Удалить теги

Для удаления тега в локальном репозитории достаточно нажать Теги > Удаление тега... (Tags > Delete Tag...) в дополнительном меню репозитория в представлении Система управления версиями (Source Control).

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

Обратите внимание, что при удалении тега не происходит его удаления с удаленных серверов.

Чтобы удалить тег на удаленном сервере нажмите Теги > Удалить удаленный тег... (Tags > Delete Remote Tag...) в дополнительном меню репозитория.

Затем в палитре команд выберите тот тег, который нужно удалить, и нажмите Ввод.

Перейти на тег

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

После этого в палитре команд выберите тег, на который нужно перейти, например, v1.0, и нажмите Ввод.

Есть и другой способ. В разделе Граф системы управления версиями (Source Control Graph) выберите коммит, помеченный нужным тегом, и нажмите Извлечение (в отключенном режиме) (Checkout (Detached)).

В результате в рабочий каталог будет извлечена версия, соответствующая этому коммиту, но репозиторий перейдет в состояние «отсоединенный HEAD» («detached HEAD»), которое имеет ряд неприятных побочных эффектов.

«Отсоединенный HEAD» («detached HEAD»)

«Отсоединенный HEAD» это такое состояние локального репозитория, при котором он содержит проект, соответствующий некоторому коммиту, но нет локальной ветки, извлеченной в рабочий каталог. О том, что локальной ветки нет, сигнализирует значок тега в строке репозитория.

Например, у вас есть ветка main, извлеченная в рабочий каталог.

Если теперь вы извлечете коммит, соответствующий тегу v1.0, то локальный репозиторий у вас окажется в состоянии «отсоединенный HEAD», ему не будет соответствовать ни одна ветка.

В таком состоянии вы можете просматривать все, что находится в рабочем каталоге. Например для того, чтобы узнать, как выглядели разрабатываемые скрипты на момент коммита v1.0.

Однако в состоянии «отсоединенный HEAD» не нужно изменять проект, так как вы не сможете зафиксировать свои изменения. Они не будут принадлежать ни одной ветке.

Если вы хотите что-то изменять, сначала создайте новую ветку, находясь в таком состоянии, например new_branch.

Затем измените проект и зафиксируйте свои изменения.

По материалам книги Pro Git (авторы Scott Chacon и Ben Straub, издательство Apress). Книга распространяется по лицензии Creative Commons Attribution Non Commercial Share Alike 3.0 license.