Использование тегов

В этом документе описываются концепция использования тегов в Git и команда git tag. Теги — это ссылки, указывающие на определенные точки в истории Git. Обычно теги служат для захвата некой точки в истории, которая используется для релиза нумерованной версии (например, v1.0.1). Теги похожи на неизменяемые ветки, но они, в отличие от веток, не имеют истории коммитов после создания. Подробнее о ветках см. на странице, посвященной git branch. В этом документе описываются различные виды тегов, способы их создания, просмотра, удаления, предоставления доступа к ним и многое другое.

Создание тега

Для создания нового тега выполните следующую команду:

git tag <имя_тега>

Замените <имя_тега> семантическим идентификатором состояния репозитория на момент создания тега. Общеупотребительный шаблон для указания номеров версий выглядит как git tag v1.4. Git поддерживает два типа тегов: аннотируемые и облегченные. В предыдущем примере был создан облегченный тег. Облегченные и аннотируемые теги отличаются объемом хранящихся в них сопроводительных метаданных. Рекомендуется рассматривать аннотируемые теги как публичные, а облегченные — как частные. В аннотируемых тегах хранятся дополнительные метаданные, такие как имя создателя тега, адрес электронной почты и дата. Это важные данные для публичного релиза. Облегченные теги по сути являются «закладками» к коммитам, это просто имя и указатель на коммит, что удобно для создания быстрых ссылок на соответствующие коммиты.

Аннотируемые теги

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

git tag -a v1.4

При выполнении этой команды будет создан аннотируемый тег с идентификатором v1.4. Затем команда откроет настроенный текстовый редактор по умолчанию, чтобы запросить ввод дальнейших метаданных.

git tag -a v1.4 -m "my version 1.4"

Эта команда аналогична предыдущей, однако в этой версии передаются параметр -m и комментарий. Этот удобный способ похож на команду git commit -m, так как с его помощью новый тег создается без открытия локального текстового редактора. Вместо этого применяется комментарий, переданный вместе с параметром -m.

Облегченные теги

git tag v1.4-lw

При выполнении этой команды создается облегченный тег с идентификатором v1.4-lw. Облегченные теги создаются, когда не используются параметры -a, -s или -m. Этот тип тегов создает новую контрольную сумму тега и сохраняет ее в каталоге .git/ репозитория проекта.

Просмотр тегов

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

git tag

Она выведет список тегов:

v0.10.0
v0.10.0-rc1
v0.11.0
v0.11.0-rc1
v0.11.1
v0.11.2
v0.12.0
v0.12.0-rc1
v0.12.1
v0.12.2
v0.13.0
v0.13.0-rc1
v0.13.0-rc2

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

$ git tag -l *-rc*
v0.10.0-rc1
v0.11.0-rc1
v0.12.0-rc1
v0.13.0-rc1
v0.13.0-rc2
v0.14.0-rc1
v0.9.0-rc1
v15.0.0-rc.1
v15.0.0-rc.2
v15.4.0-rc.3

В указанном выше примере используются параметр -l и выражение с подстановочными знаками -rc, возвращающее список всех тегов с префиксом -rc, который обычно используется для обозначения предвыпускных релизов.

Применение тегов к старым коммитам

В предыдущих примерах использования тегов демонстрируются операции без указания коммита. По умолчанию команда git tag создает тег для коммита, на который ссылается указатель HEAD. Вместо этого в git tag можно передать ссылку на конкретный коммит. В этом случае тег будет создан для указанного коммита, а не для коммита, на который ссылается указатель HEAD. Чтобы просмотреть список предыдущих коммитов, запустите команду git log.

$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'feature'
a6b4c97498bd301d84096da251c98a07c7723e65 add update method for thing
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'

При выполнении команды git log будет выведен список коммитов. В этом примере мы создадим тег для самого верхнего коммита Merge branch 'feature'. Нам понадобится ссылка на SHA-хеш коммита, который мы передадим Git:

git tag -a v1.2 15027957951b64cf874c3557a0f3547bd83b3ff6

При выполнении приведенной выше команды git tag будет создан аннотируемый тег с идентификатором v1.2 для коммита, который мы выбрали в предыдущем примере с командой git log.

Переназначение тегов. Замена старых тегов

Если вы попытаетесь создать тег с таким же идентификатором, как у существующего тега, Git выдаст ошибку, как показано ниже:

fatal: tag 'v0.4' already exists

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

Если вам необходимо обновить существующий тег, используйте параметр -f FORCE.

git tag -a -f v1.4 15027957951b64cf874c3557a0f3547bd83b3ff6

Указанная выше команда сопоставит коммит 15027957951b64cf874c3557a0f3547bd83b3ff6 с идентификатором тега v1.4 и переопределит любой существующий контент для тега v1.4.

Публикация: отправка тегов в удаленный репозиторий

Публикация тегов похожа на отправку веток. По умолчанию команда git push не отправляет теги. Их необходимо указать в команде git push явным образом.

$ git push origin v1.4
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@bitbucket.com:atlasbro/gittagdocs.git
* [new tag] v1.4 -> v1.4

Для одновременной отправки сразу нескольких тегов необходимо указать в команде git push параметр --tags. Когда другие пользователи будут клонировать или осуществлять pull репозитория, они получат новые теги.

Переключение тегов

Вы можете просмотреть состояние репозитория по тегу с помощью команды git checkout.

git checkout v1.4

Указанная выше команда выполнит переход к тегу v1.4. При этом репозиторий перейдет в состояние открепленного указателя HEAD. Это значит, что любые внесенные изменения не будут добавлены в этот тег. Они попадут в новый открепленный коммит, который не будет принадлежать ни к какой ветке, и перейти на него можно будет только напрямую по SHA-хешу этого коммита. Поэтому рекомендуется создавать новую ветку каждый раз, когда вы вносите изменения, находясь в состоянии открепленного указателя HEAD.

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

Удаление тегов — довольно простая операция. Чтобы удалить определенный тег, передайте команде git tag параметр -d и идентификатор этого тега.

$ git tag
v1
v2
v3
$ git tag -d v1
$ git tag
v2
v3

В этом примере при выполнении команды git tag отобразился список тегов: v1, v2, v3. Затем была запущена команда git tag -d v1, которая удалила тег v1.

Резюме

Итак, теги — это дополнительный механизм для создания снимков состояния репозитория Git. Обычно теги используются для создания семантических идентификаторов номера версии, которые соответствуют циклам релизов программного обеспечения. Для создания, изменения и удаления тегов используется команда git tag. Существует два типа тегов: аннотируемые и облегченные. Обычно рекомендуется использовать аннотируемые теги, поскольку в них хранятся дополнительные важные метаданные об этом теге. В этом документе также упоминаются другие команды Git — git push и git checkout. Более подробную информацию об их использовании см. на соответствующих страницах.

Готовы изучить Git?

Попробуйте это интерактивное учебное руководство.

Начните прямо сейчас