Ç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.
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
Note
|
Joker etiket karakterlerini listelemek
-l veya --list gerektirirEğer tüm etiketlerin toplu bir listesini istiyorsanız Ancak etiket adlarıyla eşleştirmek üzere bir karakter deseni yazacaksanız, |
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.
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 <[email protected]>
Date: Sat May 3 20:19:12 2014 -0700
my version 1.4
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <[email protected]>
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.
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 <[email protected]>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
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 <[email protected]>
Date: Mon Feb 9 15:32:16 2009 -0800
version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <[email protected]>
Date: Sun Apr 27 20:43:35 2008 -0700
updated rakefile
...
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 [email protected]: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 [email protected]: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.
Note
|
git push her iki türde etiketi de iterEtiketleri |
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 /[email protected]: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>
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.