Git: работа с тегами (метками)

Автор: | 28/03/2018

Документация тут>>>, ниже примеры работы с тегами.

Кратко о метках в примерах.

Создаём каталог для тестового репозитория:

[simterm]

$ mkdir git-tag-test-repo
$ cd git-tag-test-repo/

[/simterm]

Инициализируем пустой репозиторий:

[simterm]

$ git init .
Initialized empty Git repository in /home/setevoy/Temp/git-tag-test-repo/.git/

[/simterm]

Создаём тестовый файл:

[simterm]

$ touch testfile
$ git add testfile 
$ git commit -m "Init commit"
[master (root-commit) eace4ed] Init commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 testfile

[/simterm]

Добавление тегов

Теги в Git есть двух основных типов:

  • теги с аннотациями, содержат сообщение, и имя и почту автора тега, как при коммите
  • легковесные теги – просто указатель на определённый коммит, без всякой допонительной информации

Для добавления тега с аннотацией – используем -a или --annotate:

[simterm]

$ git tag -a v1.0 -m "Init version"

[/simterm]

Проверяем:

[simterm]

$ git tag
v1.0

[/simterm]

Для добавления легковесного тега – просто пропускаем -a и -m:

[simterm]

$ git tag v1.0lw

[/simterm]

Можно добавить тег на старые коммиты.

Вносим изменения:

[simterm]

$ echo line1 > testfile 
$ git add testfile && git commit -m "change 1"
[master 96012d8] change 1
 1 file changed, 1 insertion(+)
$ echo line2 >> testfile 
$ git add testfile && git commit -m "change 2"
[master adceccd] change 2
 1 file changed, 1 insertion(+)

[/simterm]

Проверяем историю коммитов:

[simterm]

$ git log --pretty=oneline
adceccdbec2c604c190d0013d946edea24252e3b (HEAD -> master) change 2
96012d8d14f80695339a3d215b2c1f5f2475f040 change 1
eace4ed62fe2bbf6cf0f02d89449b58d8df82291 (tag: v1.0lw, tag: v1.0) Init commit

[/simterm]

Добавляем тег на предыдущий коммит – 96012d8d14f80695339a3d215b2c1f5f2475f040:

[simterm]

$ git tag -a v2.0 -m "2.0 version - change 1" 96012d8d14f80695339a3d215b2c1f5f2475f040

[/simterm]

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

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

[simterm]

$ git tag
v1.0
v1.0lw
v2.0

[/simterm]

Для просмотра информации о теге – show:

[simterm]

$ git show v1.0
tag v1.0
Tagger: Arseny <[email protected]>
Date:   Fri Mar 23 16:21:32 2018 +0200

Init version

commit eace4ed62fe2bbf6cf0f02d89449b58d8df82291 (HEAD -> master, tag: v1.0lw, tag: v1.0)
Author: Arseny <[email protected]>
Date:   Fri Mar 23 14:50:04 2018 +0200

    Init commit

diff --git a/testfile b/testfile
new file mode 100644
index 0000000..e69de29

[/simterm]

И просмотр легковесной метки:

[simterm]

$ git show v1.0lw
commit eace4ed62fe2bbf6cf0f02d89449b58d8df82291 (HEAD -> master, tag: v1.0lw, tag: v1.0)
Author: Arseny <[email protected]>
Date:   Fri Mar 23 14:50:04 2018 +0200

    Init commit

diff --git a/testfile b/testfile
new file mode 100644
index 0000000..e69de29

[/simterm]

В случае легковесного тега сохраняется информация только о самом коммите, но нет ничего об авторе тега.

push тегов в репозиторий

Что бы сохранить теги в удалённый репозиторий – их необходимо пушить отдельно от коммитов.

Клоним тестовый репозиторий с Гитхаба:

[simterm]

$ git clone [email protected]:setevoy2/tests.git

[/simterm]

Добавляем файлик, коммитим, добавляем тег:

$ touch testfile
$ git add testfile 
$ git commit -m "Tesfile added"
[master 2b1d03e] Tesfile added
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 testfile
$ git tag -a 1.0 -m "Init version"
$ git tag
1.0

[/simterm]

Если выполнить git push сейчас без указания тега – он в Gihub не добавится.

Пушим:

[simterm]

$ git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 249 bytes | 249.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:setevoy2/tests.git
   04e6fc1..2b1d03e  master -> master

[/simterm]

Проверяем:

А теперь повторяем push, но указываем origin и тег:

[simterm]

$ git push origin 1.0
Counting objects: 1, done.
Writing objects: 100% (1/1), 169 bytes | 169.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To github.com:setevoy2/tests.git
 * [new tag]         1.0 -> 1.0

[simterm]

Если тегов несколько – можно все, указав --tags:

$ git tag -a 2.0 -m "Version 2.0"
$ git tag -a 3.0 -m "Version 3.0"
$ git push origin --tags
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 214 bytes | 214.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To github.com:setevoy2/tests.git
 * [new tag]         2.0 -> 2.0
 * [new tag]         3.0 -> 3.0

[/simterm]

Проверяем:

checkout по тегам

Что бы получить версию кода по тегам – используем checkout и путь к tags:

[simterm]

$ echo test > testfile
$ git tag -a 4.0 -m "Version 4.0"
$ cat testfile
test

[/simterm]

Коммитим изменения:

[simterm]

$ git add testfile && git commit -m "test word added"
[master b588586] test word added
 1 file changed, 1 insertion(+)

[/simterm]

И чекаутим старую версию – 1.0:

[simterm]

$ git checkout tags/1.0
Note: checking out 'tags/1.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 2b1d03e Tesfile added

[/simterm]

Возвращаемся в master:

[simterm]

$ git checkout master

[/simterm]

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

[simterm]

$ git checkout tags/1.0 -b init_branch
Switched to a new branch 'init_branch'

[/simterm]

Готово.