Git
Chapters ▾ 2nd Edition

2.6 Git Temelleri - Etiketleme

Etiketleme

Çoğu VCS gibi Git de bir reponun geçmişindeki belirli noktaları "önemli" şeklinde etiketleme (tagging) yeteneğine sahiptir. Genellikle geliştiriciler bu işlevi her bir sürümü (v1.0, v2.0 vb.) işaretlemek için kullanır. Bu bölümde mevcut etiketlerin nasıl listeleneceğini, etiketlerin nasıl oluşturulacağını ve silineceğini ve farklı etiket türlerinin neler olduğunu öğreneceksiniz.

Etiketlerinizi Listeleme

Git’te mevcut etiketleri listelemek çok basittir. Sadece git tag (isterseniz -l veya --list seçenekleriyle) yazmanız yeterlidir:

$ git tag
v1.0
v2.0

Bu komut, etiketleri alfabetik sıraya göre listeler ama görüntülenme sırasının aslında bir önemi yoktur.

Ayrıca belli kalıplarla eşleşen etiketleri de arayabilirsiniz. Örneğin Git kaynak reposu 500’den fazla etiket içerir. Eğer sadece 1.8.5 serisine bakmak istiyorsanız şunu çalıştırabilirsiniz:

$ 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
Not
Joker etiket karakterlerini listelemek -l veya --list gerektirir

Eğer tüm etiketlerin toplu bir listesini istiyorsanız git tag komutunu çalıştırabilirsiniz. Git bu durumda sizin bir liste istediğinizi varsayar ve size bu listeyi verir. Böyle bir durumda -l veya --list kullanımı isteğe bağlıdır.

Ancak etiket adlarıyla eşleştirmek üzere bir karakter deseni yazacaksanız, -l veya --list kullanımı zorunludur.

Etiket Oluşturma

Git, iki çeşit etiketi destekler: lightweight (hafif) ve annotated (açıklamalı).

Hafif bir etiket, değişmeyen bir Git dalı gibidir; yalnızca belirli bir katkının işaretçisidir.

Ancak açıklamalı etiketler Git veritabanında tam nesneler olarak depolanır. Bunlar sağlamalı (checksummed) verilerdir. Etiketi koyan kişinin adını, e-postasını ve etiketleme tarihini içerir, etiketleme mesajınız yer alır ve GNU Privacy Guard (GPG) ile imzalanıp, doğrulanabilir. Tüm bu bilgilere sahip olabilmeniz için genellikle açıklamalı etiketler oluşturmanız önerilir, ancak geçici bir etiket istiyorsanız veya herhangi bir nedenle diğer bilgileri saklamak istemiyorsanız, hafif etiketler de mevcuttur.

Açıklamalı Etiketler

Git’te açıklamalı bir etiket oluşturmak basittir. En kolay yol, tag komutunu çalıştırdığınızda -a (annotated) bayrağı da belirtmektir:

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

-m (message) bayrağı etiketle birlikte saklanan bir etiketleme mesajı belirtir. Eğer bu etiket için bir mesaj belirtmezseniz Git, mesajı yazabilmeniz için otomatik olarak düzenleyicinizi başlatır.

Etiket verilerini git show komutunu kullanarak etiketlediğiniz katkıyla birlikte görebilirsiniz:

$ 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

Bu katkı bilgisini göstermeden önce etiketleme bilgisini, etiketleme tarihini ve açıklama mesajını gösterir.

Hafif Etiketler

Katkıları etiketlemenin başka bir yolu da hafif (lightweight) etiketler kullanmaktır. Bu metodda "katkı sağlaması" dışında hiçbir veri saklanmaz. Hafif etiket oluşturmak için -a, -s veya -m seçeneklerinden hiçbirini kullanmaksızın sadece bir etiket adı yazarsınız:

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

Bu sefer etiket üzerinde git show komutunu çalıştırırsanız ekstra etiket bilgilerini göremezsiniz. Komut sadece katkıyı gösterir:

$ 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

Sonradan Etiketleme

Katkıları, işledikten sonra da etiketleyebilirsiniz. Katkı geçmişinizin şöyle göründüğünü varsayalım:

$ 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

Şimdi, projeyi ``updated rakefile`` katkısını işlerken "v1.2" şeklinde etiketlemeyi unuttuğunuzu varsayalım. Bunu sonradan da ekleyebilirsiniz. Bu katkıyı etiketlemek için, komutun sonunda katkı sağlamasının (checksum) tamamını veya bir kısmını belirtirsiniz:

$ git tag -a v1.2 9fceb02

Artık katkıyı etiketlediğinizi görebilirsiniz:

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

Etiketleri Paylaşma

Varsayılan olarak git push komutu, etiketleri uzak sunuculara aktarmaz. Etiketleri oluşturduktan sonra paylaşıma açık bir sunucuya (shared server) göndermeniz gerekecektir. Bu süreç tıpkı uzak dalları paylaşmaya benzer: git push origin <tagname> komutunu çalıştırabilirsiniz (tagname: etiket adı).

$ 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

Aynı anda göndermek istediğiniz çok sayıda etiketiniz varsa, git push komutunun yerine --tags seçeneğini de kullanabilirsiniz. Bu, tüm etiketlerinizi, halihazırda orada olmayan uzak sunucuya aktaracaktır.

$ 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

Artık başka biri reponuzu kopyaladığında veya reponuzdan bilgi aldığında tüm etiketlerinizi de alacaktır.

Not
git push her iki türde etiketi de iter

Etiketleri git push <remote> --tags kullanarak itmek, hafif ve açıklamalı etiketler arasında bir ayrım yapmaz. İtme işlemi için, tür seçmenize olanak tanıyan basit bir seçenek veya bayrak yoktur.

Etiketleri Silme

Yerel reponuzdaki bir etiketi silmek için git tag -d <tagname> komutunu kullanabilirsiniz (tagname: etiket adı). Örneğin yukarıdaki hafif etiketimizi şu şekilde kaldırabiliriz:

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

Bunun, etiketi herhangi bir uzak sunucudan kaldırmadığını unutmayın. Uzak sunucudan etiket silmenin iki yaygın çeşidi vardır.

İlk yöntem git push <remote> :refs/tags/<tagname> komutudur (remote: uzak sunucu adı, tagname: etiket adı):

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

Aslında yaptığımız şey: uzak sunucudaki etiket adının üstüne boş (null) bir değer yazmaktır (":" dan önceki boşluğa dikkat edin). Böylece eski etiket silinecektir.

Uzak etiketi silmenin ikinci (ve daha sezgisel) yolu ise --delete <tagname> kullanmaktır (tagname: etiket adı):

$ git push origin --delete <tagname>

Etiketleri Denetlemek

Bir etiketin işaret ettiği sürümleri görüntülemek istiyorsanız, bu etiketi git checkout komutuyla kontrol edebilirsiniz. Ancak bunu yapmak reponuzu ``detached HEAD`` (ayrık uç) durumuna sokar ve bu da bazı olumsuz yan etkilere neden olur:

$ 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

Normalde her bir dalda bir uç (HEAD) bulunur ve bu uç en son katkıya iliştirilmiştir. ``detached HEAD`` durumundayken bu uç en son katkı yerine etikete sabitlendiğinden, yeni bir katkı işleseniz bile katkıniz hiçbir dala ait olmayacağı için "katkı karması" (hash) dışında erişilemez olacaktır. Bu nedenle, değişiklik yapmanız gerekiyorsa (mesela eski bir sürümdeki bir hatayı düzelttiniz) yeni bir dal oluşturmanız gerekecektir:

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

Bunu yapıp bir katkı işlerseniz, "version2" dalınız, yeni değişikliklerinizle ilerleyeceği için "v2.0.0" etiketinizden biraz farklı olacaktır. Bu yüzden dikkatli olun.

scroll-to-top