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

By | 03/28/2018
 

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

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

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

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

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

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

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

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

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

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

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

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

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

Проверяем:

git tag
v1.0

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

git tag v1.0lw

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

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

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(+)

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

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

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

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

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

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

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

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

git show v1.0
tag v1.0
Tagger: Arseny <arseny@domain.tld>
Date:   Fri Mar 23 16:21:32 2018 +0200
Init version
commit eace4ed62fe2bbf6cf0f02d89449b58d8df82291 (HEAD -> master, tag: v1.0lw, tag: v1.0)
Author: Arseny <arseny@domain.tld>
Date:   Fri Mar 23 14:50:04 2018 +0200
Init commit
diff --git a/testfile b/testfile
new file mode 100644
index 0000000..e69de29

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

git show v1.0lw
commit eace4ed62fe2bbf6cf0f02d89449b58d8df82291 (HEAD -> master, tag: v1.0lw, tag: v1.0)
Author: Arseny <arseny@domain.tld>
Date:   Fri Mar 23 14:50:04 2018 +0200
Init commit
diff --git a/testfile b/testfile
new file mode 100644
index 0000000..e69de29

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

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

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

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

git clone git@github.com:setevoy2/tests.git

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

$ 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 не добавится.

Пушим:

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

Проверяем:

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

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

Проверяем:

checkout по тегам

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

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

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

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

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

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

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

git checkout master

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

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

Готово.