Git
Chapters ▾ 2nd Edition

2.6 Основе програма Гит - Означавање

Означавање

Као и већина VCS система, програм Гит има могућност означавања (таговања, обележавања) одређених тачака у историји као важних. Ова функционалност се обично користи да би се обележиле тачке издања нових верзија (v1.0, v2.0 и тако даље). У овом одељку ћете научити како да прикажете постојеће ознаке, како да направите и бришете ознаке, као и које различите врсте ознака постоје.

Испис ознака

Исписивање постојећих ознака у програму Гит је прилично једноставно. Само треба да откуцате git tag (уз необавезно -l или --list):

$ git tag
v1.0
v2.0

Ова команда ће приказати ознаке сортиране по абецедном редоследу; редослед у којем се приказују нема посебну важност.

Ознаке можете и да претражујете по неком одређеном обрасцу. На пример, репозиторијум изворног кода програма Гит садржи преко 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
Белешка
За приказ ознака помоћу џокера морате да користите опцију -l или --list

Ако вам је потребна само комплетна листа ознака, извршавање команде git tag имплицитно подразумева да то желите листу, па вам то и приказује; у овом случају није обавезна употреба -l или --list.

Међутим, ако наводите шаблон са џокером којим желите да гађате више имена ознака, обавезна је употреба -l или --list.

Креирање ознака

Програм Гит користи две основне врсте ознака: лаке (lightweight) и прибележене (annotated).

Лаке ознаке доста личе на грану која се не мења — то је само показивач на одређени комит.

С друге стране, прибележене ознаке се у бази података програма Гит чувају као пуни објекти. Они добијају своју контролну суму; садрже име и мејл особе која је поставила ознаку као и датум када је то учињено; имају поруку означавања; и могу да се потпишу и верификују помоћу GNU Privacy Guard (GPG). Углавном се препоручује да правите прибележене ознаке како бисте имали све ове информације; али ако желите привремену ознаку, или из неког разлога не желите да чувате остале податке о ознаци, доступне су вам и лаке ознаке.

Прибележене ознаке

Креирање прибележене ознаке у програму Гит је једноставно. Најлакши начин је да наведете -a када извршавате команду tag:

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

Са -m наводите поруку означавања која се чува заједно са ознаком. Ако не наведете поруку за прибележену ознаку, програм Гит покреће едитор да бисте могли да је унесете.

Податке о ознаци можете видети заједно са комитом који је њоме обележен командом 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

    Change version number

Ово приказује информације о особи која је додала ознаку, датум када је комит означен и прибележену поруку пре него што прикаже податке о самом комиту.

Лаке ознаке

Други начин за означавање комитова је помоћу лаких ознака. Ово је у суштини контролна сума комита смештена у фајл — не чувају се никакве друге информације. Ако желите да направите лаку ознаку, једноставно немојте да додате ниједну од опција -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

    Change version number

Накнадно означавање

Комитове можете да означавате и након што их прођете. Претпоставимо да историја ваших комитова изгледа овако:

$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 Create write support
0d52aaab4479697da7686c15f77a3d64d9165190 One more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc Add commit function
4682c3261057305bdd616e23b64b0857d832627b Add todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a Create write support
9fceb02d0ae598e95dc970b74767f19372d61af8 Update rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc Commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a Update readme

Претпоставимо сада да сте заборавили да означите пројекат код верзије v1.2, која треба да је уз комит „Update 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

    Update rakefile
...

Дељење ознака

Са подразумеваним подешавањима, команда git push не преноси ознаке удаљеним серверима. Мораћете експлицитно да гурнете ознаке дељеном серверу након што их креирате. Овај процес је исти као дељење удаљених грана — можете да га покренете са git push origin <име-ознаке>.

$ 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. Ово ће пренети све ознаке на удаљени сервер који тренутно нису тамо.

$ 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

Сада, када неко клонира или повуче са вашег репозиторијума, добиће и све ваше ознаке.

Белешка
git push гура обе врсте ознака

git push <име_удаљеног> --tags ће гурнути и лаке и прибележене ознаке. Тренутно не постоји опција да се гурну само лаке ознаке, али ако употребите git push <име_удаљеног> --follow-tags на удаљени репозиторијум се гурају само прибележене ознаке.

Брисање ознака

Ако желите да обришете ознаку у свом локалном репозиторијуму, можете употребити git tag -d <име_ознаке>. На пример, могли бисмо да уклонимо лаку ознаку из горњег примера на следећи начин:

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

Имајте на уму да ово не уклања ознаку са удаљених сервера. Постоје две уобичајене варијације брисања ознаке са удаљеног сервера.

Прва је git push <име_удаљеног> :refs/tags/<име_ознаке>:

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

Начин на који се интерпретира ова команда је да се чита као нулта вредност испред двотачке која се гура на име удаљене ознаке, што у суштини брише ту ознаку.

Други (и интуитивнији) начин за брисање удаљене ознаке је:

$ git push origin --delete <име_ознаке>

Одјављивање ознака

Ако желите да погледате верзије фајлова на које показује ознака, можете да извршите git checkout те ознаке, мада ово поставља ваш репозиторијум у „detached HEAD” стање, што има неке лоше споредне ефекте:

$ git checkout v2.0.0
Note: switching to 'v2.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 -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

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

$ git checkout v2.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 ознаке, јер ће се вашим новим изменама померити унапред, па будите опрезни.