Ders 15 / 15
Etiketleme
Tarihçedeki belirli noktalara kalıcı ad verme; hafif etiket ile etiket nesnesinin farkı, dördüncü nesne türü, etiketle konum belirleme ve anlamlı sürümleme.
İçindekiler
Tarihçedeki noktalar buraya kadar kırk karakterlik kimliklerle ya da HEAD~1 gibi göreli
gösterimlerle anıldı. İkisi de kalıcı ad değildir: kimlik akılda tutulamaz, göreli gösterim
tarihçe büyüdükçe başka bir işlemeyi gösterir.
Etiket (tag), belirli bir işlemeye verilen sabit addır. Dal uçlarından farkı, yeni işleme yazıldığında yerinden kıpırdamamasıdır: dal ilerler, etiket durur.
Hafif Etiket
En yalın biçim, bir ada bir işleme kimliği bağlar:
git tag v1.0.0 498105a git tag -l
v1.0.0
cat .git/refs/tags/v1.0.0
498105a461806443b43bf3287f41a9fe045f7ef8
Dosyanın içeriği doğrudan işleme kimliğidir. Hafif etiket (lightweight tag), nesne veritabanında yeni bir nesne oluşturmaz; yalnızca bir başvuru dosyası yazar.
git cat-file -t v1.0.0
commit
Ad bir işlemeyi gösteriyor. Etiketin kimin, ne zaman ve neden koyduğu hiçbir yerde kayıtlı değil. Yayımlanan bir sürümü işaretlemek için bu yetersizdir.
git tag -d v1.0.0
Deleted tag 'v1.0.0' (was 498105a)
Etiket Nesnesi
git tag -a v1.0.0 -m "İlk kararlı sürüm: arama, harf duyarsızlığı, hata kodu" 498105a git cat-file -t v1.0.0
tag
Nesne türü değişti. Açıklamalı etiket (annotated tag), ikinci konuda tanıtılan dört nesne türünün sonuncusudur ve nesne veritabanına yazılır:
git cat-file -p v1.0.0
object 498105a461806443b43bf3287f41a9fe045f7ef8 type commit tag v1.0.0 tagger Deniz Kaya <[email protected]> 1710309600 +0300 İlk kararlı sürüm: arama, harf duyarsızlığı, hata kodu
Beş bileşen vardır: işaret edilen nesnenin kimliği, türü, etiket adı, etiketi koyan kişi ile zamanı ve açıklama metni. Yapı, işleme nesnesine benzer — ve aynı kuralla adlandırılır:
git rev-parse v1.0.0
8fa8557633aff60f8bc5bce08050ea0c524d866f
Bu kimlik etiket nesnesine aittir, işlemeye değil. İşaret edilen işlemeye ulaşmak için tür dönüşümü istenir:
git rev-parse "v1.0.0^{commit}"
498105a461806443b43bf3287f41a9fe045f7ef8
Komutların çoğu bu dönüşümü kendiliğinden yapar; ayrım yalnızca nesnenin kendisi sorulduğunda görünür.
git show v1.0.0 --stat
tag v1.0.0 Tagger: Deniz Kaya <[email protected]> Date: Wed Mar 13 09:00:00 2024 +0300 İlk kararlı sürüm: arama, harf duyarsızlığı, hata kodu commit 498105a461806443b43bf3287f41a9fe045f7ef8 Author: Deniz Kaya <[email protected]> Date: Tue Mar 12 09:48:00 2024 +0300 Aramanın harf duyarsızlığını README'de belirt README.md | 2 ++ 1 file changed, 2 insertions(+)
Çıktı önce etiketi, sonra işaret ettiği işlemeyi gösterir.
| Ölçüt | Hafif etiket | Açıklamalı etiket |
|---|---|---|
| Nesne oluşturur mu | Hayır | Evet |
| Koyan ve zaman kaydı | Yok | Var |
| Açıklama metni | Yok | Var |
| Kullanım | Geçici, yerel işaret | Yayımlanan sürüm |
Etiketleri Listelemek
Listeleme seçeneği tamamlandıktan sonra ikinci bir sürüm işaretlenir:
git tag -a v1.1.0 -m "Listeleme seçeneği (-l) eklendi" git tag -l
v1.0.0 v1.1.0
git tag -l "v1.0*"
v1.0.0
git tag -n
v1.0.0 İlk kararlı sürüm: arama, harf duyarsızlığı, hata kodu v1.1.0 Listeleme seçeneği (-l) eklendi
Etiketler tarihçe listesinde de görünür:
git log --oneline --decorate -n 5
396729b (HEAD -> main, tag: v1.1.0) README'de -l seçeneğini belgele 701fa37 Tüm terimleri listeleyen -l seçeneğini ekle 498105a (tag: v1.0.0) Aramanın harf duyarsızlığını README'de belirt a58791f Revert "Arama çıktısını yalnızca Türkçe sütuna indir" ad60f31 Arama çıktısını yalnızca Türkçe sütuna indir
Başvuruların tümü tek komutla da listelenebilir:
git for-each-ref refs/tags
8fa8557633aff60f8bc5bce08050ea0c524d866f tag refs/tags/v1.0.0 2054d80edbfbbb29b1da99ba01f3e121b7b50a39 tag refs/tags/v1.1.0
İkinci sütun nesne türünü verir; hafif etiketlerde bu sütunda commit yazardı.
Etikete Göre Konum
git describe
v1.1.0
Etiketten sonra yeni bir işleme yazıldığında çıktı değişir:
git describe
v1.1.0-1-g2aff8c5
Üç bölüm vardır: en yakın etiket, o etiketten bu yana yazılan işleme sayısı ve şu anki
işlemenin kısaltılmış kimliği. Kimliğin başındaki g, değerin bir git nesnesi olduğunu
belirtir. Bu dizgi, çalıştırılabilir bir programın sürüm bilgisine gömüldüğünde, elde bulunan
ikili dosyanın tam olarak hangi işlemeden üretildiğini söyler.
Anlamlı Sürümleme
Etiket adı serbesttir; ancak sürüm işaretlemede yaygın bir düzen vardır: anlamlı sürümleme (semantic versioning). Sürüm numarası noktayla ayrılmış üç sayıdan oluşur ve her sayının artışı bir söz verir:
| Bölüm | Ne zaman artar | Kullanıcıya söylediği |
|---|---|---|
| Ana | Geriye dönük uyumluluk bozulduğunda | Uyarlama gerekebilir |
| Ara | Uyumlu yeni yetenek eklendiğinde | Var olan kullanım bozulmaz |
| Yama | Yalnızca düzeltme yapıldığında | Davranış aynı, kusur giderildi |
Örnek depoda v1.0.0 ilk kararlı sürümü, v1.1.0 ise geriye dönük uyumlu bir yetenek
eklenmesini işaretledi: -l seçeneği önceki kullanımı bozmuyor, yalnızca yeni bir çağrı
biçimi ekliyor. Betiğin çıkış kodları değiştirilseydi ana sürümün artması gerekirdi.
Düzenin değeri, numaranın kendisinden çok verdiği sözdedir. Geriye dönük uyumluluk kavramı Programlama Temelleri kursunda dil seçimi bağlamında tanımlanmıştı; sürüm numarası, aynı kavramın makine tarafından okunabilir bir bildirimidir.
Etiketin Sınırları
Etiketler taşınabilir ama taşınmamalıdır. Bir etiket yayımlandıktan sonra başka bir işlemeye kaydırılırsa, o etiketi daha önce almış kopyalar eski işlemeyi göstermeye devam eder; aynı ad iki farklı içeriği adlandırır hâle gelir. Yayımlanmış bir etiketin işaret ettiği nokta değiştirilmez; gerekiyorsa yeni bir etiket konur.
Silme de aynı sorunu taşır. Yerelde silinen bir etiket, deponun başka kopyalarında durmaya devam eder.
Etiketler işlemelerin dışındaki nesneleri de işaret edebilir — bir bloba ya da bir ağaca etiket konabilir. Uygulamada bu seyrek kullanılır; etiketin olağan hedefi bir işlemedir.
Özet
- Etiket, bir işlemeye verilen ve yeni işlemelerle yer değiştirmeyen sabit addır.
- Hafif etiket yalnızca bir başvuru dosyasıdır; açıklamalı etiket, koyanı ve açıklamayı saklayan ayrı bir nesnedir.
- Etiket nesnesi dördüncü nesne türüdür ve diğerleriyle aynı kuralla adlandırılır.
git describe, en yakın etiketten bu yana kaç işleme geçtiğini ve şu anki kimliği verir.- Anlamlı sürümleme, üç sayılı bir numarayla geriye dönük uyumluluk sözü verir.
- Yayımlanmış etiketler taşınmaz ve silinmez; gerektiğinde yeni etiket konur.
Kurs Kapanışı
Kurs boyunca tek bir depo kuruldu ve on sekiz işlemeyle bugünkü hâline geldi:
git log --oneline --decorate
2aff8c5 (HEAD -> main) Bileşik terim örneği ekle 396729b (tag: v1.1.0) README'de -l seçeneğini belgele 701fa37 Tüm terimleri listeleyen -l seçeneğini ekle 498105a (tag: v1.0.0) Aramanın harf duyarsızlığını README'de belirt a58791f Revert "Arama çıktısını yalnızca Türkçe sütuna indir" ad60f31 Arama çıktısını yalnızca Türkçe sütuna indir 18600c5 README'ye kullanım bölümü ekle bfe57d3 Öbek ve dizi terimlerini ekle cb8f7ee Yerel notları izlemeden çıkar 7783378 Yerel notları ekle 9b23cc3 Üretilen dosyaları yoksayma listesine al ece664b Küme terimini ekle 2c883a7 Eşleşme bulunamadığında hata bildir 60e13bd Aramayı büyük/küçük harften bağımsız yap 43370ca Üç veri yapısı terimi ekle 3132c78 Biçim örneğindeki yazımı düzelt 546c174 Terim arama betiği ekle 13d31bf Terim listesini ve biçim belgesini ekle
Bu listede kursun yapısı görünür: dosyaların eklenmesi, atomik işlemeler, bir hatanın işlenmesi ve devrilmesi, yoksayma kurallarının kurulması ve iki sürümün etiketlenmesi.
Kursun asıl konusu komutlar değil, altlarındaki modeldi. Dört nesne türü — blob, ağaç, işleme, etiket — içerik adresli depolamayla adlandırılır; işlemeler öncül bağlarıyla bir yönlü çevrimsiz çizge kurar; hazırlık alanı bu çizgeye eklenecek bir sonraki anlık görüntüyü biriktirir. Bütün komutlar bu üç cümlenin sonucudur. Değiştirme neden yeni bir kimlik üretir, devirme neden tarihçeyi bozmaz, aynı içerik neden aynı kimliği verir — üçünün de yanıtı modeldedir.
Kurs boyunca bir konu bilinçli olarak dışarıda bırakıldı: tarihçe hep tek zincir olarak kaldı.
Oysa çizge tanımı dallanmaya izin veriyordu ve --graph çıktısının tek sütun çıkması bir
sınırlama değil, bu deponun özelliğiydi.
Sıradaki kurs — Dallanma ve İşbirliği — o sütunu çoğaltıyor. Dalın bir işaretçiden ibaret
olduğu, iki dalın nasıl birleştirildiği, çakışmaların nasıl çözüldüğü ve tarihçenin uzak
depolarla nasıl eşlendiği orada ele alınacak. Bu kursta kurulan model orada da geçerlidir:
dal, refs/heads altında bir dosyadan; birleştirme ise iki öncüllü bir işlemeden ibarettir.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.