İçeriğe geç
academia.sh

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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat