Git
Chapters ▾ 2nd Edition

2.6 Základy práce se systémem Git - Používání značek

Používání značek

Stejně jako většina systémů pro správu verzí nabízí i Git možnost označovat v historii určitá místa, jež považujete za důležitá. Tato funkce se nejčastěji používá k označení jednotlivých vydání (například v1.0 atd.). V této části vysvětlíme, jak pořídíte výpis všech dostupných značek, jak lze vytvářet značky nové a jaké typy značek se vám nabízejí.

Výpis značek

Pořízení výpisu dostupných značek (tags) je v systému Git jednoduché. Napište git tag:

$ git tag
v0.1
v1.3

Tento příkaz vypíše značky v abecedním pořadí. Pořadí zobrazení značek nenese žádnou důležitou informaci.

Značky lze vyhledávat také pomocí konkrétní masky. Například repozitář se zdrojovým kódem systému Git obsahuje více než 500 značek. Pokud se chcete podívat jen na sérii k verzi 1.8.5, můžete provést následující příkaz:

$ 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

Vytváření značek

Git používá dva hlavní typy značek: prosté (lightweight) a anotované (annotated).

Prostá značka se velmi podobá větvi, která se nemění — je to pouze ukazatel na konkrétní revizi.

Naproti tomu anotované značky jsou ukládány jako plné objekty v databázi Gitu. U anotovaných značek se provádí kontrolní součet. Obsahují jméno autora značky (tagger), e-mail a datum, nesou vlastní zprávu značky (tagging message) a mohou být podepsány (signed) a ověřeny (verified) v programu GNU Privacy Guard (GPG). Obecně se doporučuje používat v zájmu úplnosti informací spíše anotované značky. Pokud však vytváříte pouze dočasnou značku nebo z nějakého důvodu nechcete zadávat podrobnější informace, můžete využívat i prosté značky.

Anotované značky

Anotovaná značka se v Gitu vytváří jednoduše. Nejjednodušším způsobem je zadat k příkazu tag parametr -a:

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

Parametr -m udává zprávu značky, která bude uložena spolu se značkou. Pokud u anotované značky nezadáte žádnou zprávu, Git spustí textový editor, v němž zprávu zadáte.

Po zadání příkazu git show se informace značky zobrazí spolu s revizí, kterou značka označuje:

$ 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

Příkaz zobrazí informace o autorovi značky, datu, kdy byla revize označena, a zprávu značky ještě před informacemi o revizi.

Prosté značky

Další možností, jak označit revizi, je prostá značka. Jde v podstatě o kontrolní součet revize uložený v souboru — žádné další informace neobsahuje. Chcete-li vytvořit prostou značku, nezadávejte ani jeden z parametrů -a, -s nebo -m:

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

Pokud spustíte příkaz git show pro značku tentokrát, nezobrazí se k ní žádné další informace. Příkaz ukáže jen informaci o revizi:

$ 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

Dodatečné označení

Označit můžete i revize, které už máte za sebou. Předpokládejme, že vaše historie revizí vypadá takto:

$ 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

Nyní předpokládejme, že jste zapomněli označkovat projekt verze 1.2, který je zachycen revizí se zprávou „updated rakefile“. Značku můžete přidat dodatečně. Pro označkování revize zadejte na konec příkazu kontrolní součet revize (nebo jeho část):

$ git tag -a v1.2 9fceb02

Můžete se podívat, že revize byla označena:

$ 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
...

Sdílení značek

Příkaz git push nepřenáší značky na vzdálené servery automaticky. Po vytvoření značky ji musíte na sdílený server poslat explicitně. Tento proces se velmi podobá sdílení vzdálených větví — můžete provést git push origin [název-značky].

$ 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

Máte-li značek více a chcete je odeslat všechny najednou, můžete také u příkazu git push použít volbu --tags. Tím se na vzdálený server přenesou všechny vaše značky, které tam ještě nejsou.

$ 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

Pokud nyní někdo bude klonovat nebo stahovat z vašeho repozitáře, stáhne rovněž všechny vaše značky.

Získání označené pracovní kopie

V Gitu nemůžete získat pracovní kopii (check out) jen na základě značky (tag), protože značka se nedá posouvat. Pokud do pracovního adresáře chcete z repozitáře získat verzi s určitou značkou, můžete pro označkovaný snímek vytvořit novou větev příkazem git checkout -b [jméno-větve] [jméno-značky]:

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

Je jasné, že když teď zapíšete nějakou změnu, vaše větev version2 se bude od snímku se značkou v2.0.0 lišit, protože vás nové změny posunou dál. Takže buďte opatrní.