Git
Chapters ▾ 2nd Edition

2.6 Основи на Git - Тагове в Git

Тагове в Git

Подобно на повечето VCS системи, Git позволява да маркирате (тагвате) специфични точки от историята на хранилището като важни. Обикновено това се използва за маркиране на различни версии на проекта (v1.0, v2.0 и т.н.). В тази секция, ще научите как да показвате наличните тагове, да създавате и премахвате тагове и да ги различавате по тип.

Показване на таговете

Показването на налични тагове в Git е просто. Просто напишете git tag (с опционални параметри -l или --list):

$ 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

Създаване на тагове

Git поддържа два основни типа тагове: lightweight и annotated.

Lightweight тагът прилича на branch, който не се променя — това е просто указател към специфичен къмит.

Annotated таговете обаче, се съхраняват като пълни обекти в базата данни - те съдържат имейла и името на тагващия, дата, описателно съобщение и дори могат да се подписват и проверяват с GNU Privacy Guard (GPG). Хубаво е да се създават annotated тагове, защото тогава съхранявате всичката описана информация за тях, но ако искате временен такъв или по някаква причина не искате да пазите подробните описания, lightweight таговете също са вариант.

Annotated тагове

Създаването на анотиран таг в Git е лесно. Най-лесният начин е да подадете флага -a, когато пускате командата tag:

$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4

Флагът -m указва съобщението за тага, което ще се съхранява заедно с него. Ако не укажете такова, Git ще стартира редактора ви, така че да можете да го напишете, точно както при къмитите.

Можете да разгледате данните за тага с къмита, който е бил тагнат с командата git show:

$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

Тя показва информация за тагващия разработчик, датата на която къмитът е бил тагнат и съобщението на тага преди да покаже информацията за самия къмит.

Lightweight тагове

Другият начин да тагвате даден къмит е с lightweight таг. Това най-просто казано е чексумата на къмита записана във файл - не се съхранява друга информация. За да създадете такъв олекотен таг, не подавайте флаговете -a, -s, или -m - просто укажете името на тага:

$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5

Този път, ако пуснете git show за тага, няма да виждате допълнителна информация за него. Командата просто показва къмита:

$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

Тагване на предишни къмити

Можете да тагвате къмити и след като сте приключили с тях. Представете си, че историята на вашите къмити изглежда така:

$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme

Да предположим, че сте забравили да тагнете проекта като версия v1.2, която е трябвало да бъде маркирана в къмита регистриран като “updated rakefile”. Можете да го направите и в по-късен момент. За да тагнете този стар къмит, подайте чексумата му (или част от нея) в края на командата:

$ git tag -a v1.2 9fceb02

Сега можете да проверите дали сте тагнали къмита успешно:

$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5

$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Feb 9 15:32:16 2009 -0800

version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gee-mail.com>
Date:   Sun Apr 27 20:43:35 2008 -0700

    updated rakefile
...

Споделяне на тагове

По подразбиране, git push не изпраща таговете към отдалечените сървъри. Ще трябва ръчно да ги изпратите след като сте ги създали. Този процес е точно като споделяне на отдалечени клонове — можете да изпълните git push origin <tagname>.

$ git push origin v1.5
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@github.com:schacon/simplegit.git
 * [new tag]         v1.5 -> v1.5

Ако имате много тагове и искате да ги изпратите наведнъж, подайте на командата флага --tags. Това ще трансферира всички ваши тагове, които не са били налични на сървъра наведнъж.

$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw

Сега, ако някой клонира или издърпва от вашето хранилище, ще получи и таговете ви.

Note
git push публикува и двата вида тагове

Публикуването на тагове с git push <remote> --tags не прави разлика между lightweight и annotated тагове; не съществува проста опция, с която да изберете конкретен тип, който да се публикува.

Изтриване на тагове

За да изтриете таг от локалното си хранилище, може да използвате командата git tag -d <tagname>. Например, можем да изтрием lightweight тага отгоре така:

$ git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)

Това обаче не изтрива тага от никой отдалечен сървър. Съществуват два начина за изтриване на таг от отдалечен сървър.

Първият е да използвате git push <remote> :refs/tags/<tagname>:

$ git push origin :refs/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
 - [deleted]         v1.4-lw

Начинът да изтълувате горното странно изписване е да го възприемете като изпращане на нулева стойност преди двуеточието към името на отдалечения таг, което ефективно го изтрива.

Вторият (и по-интуитивен) начин е с команда като тази:

$ git push origin --delete <tagname>

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

Ако искате да видите версиите на файловете, към които сочи даден таг, можете да направите git checkout на този таг, въпреки че това ще постави хранилището в статус “detached HEAD”, което има някои неприятни странични ефекти:

$ git checkout 2.0.0
Note: checking out '2.0.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>

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git checkout 2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... add atlas.json and cover image

В режим “detached HEAD”, ако направите промени и след това създадете къмит, тагът ще остане същия, но новия ви къмит няма да принадлежи към никой клон и няма да бъде достъпен освен по точния хеш на къмита. Затова, ако трябва да правите промени, например да поправите грешка в стара версия например — вероятно ще искате да създадете клон:

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

Разбира се, ако направите това и направите къмит, вашият version2 клон ще бъде леко различен от тага v2.0.0, защото ще се премести напред с вашите промени, така че бъдете внимателни.