İç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.

Yayın Güncelleme

Bu derste

  • Hafif etiket ile açıklamalı etiketi ayırır ve uygun olanı seçer
  • Etiket nesnesinin içeriğini okur
  • Sürüm numaralarını anlamlı sürümleme kurallarıyla belirler
İç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 HEAD~1
git tag -l
v1.0.0
cat .git/refs/tags/v1.0.0
11fe7e8840e866dda55da81f522f27f3268f1751

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 11fe7e8)

Etiket Nesnesi

Etiket nesnesi koyanın adı ve zamanıyla birlikte saklanır; zaman da işleyen tarihinden alındığı için önce sabitlenir (tarih değişkenleri açık oturumda tanımlıdır; yeni bir terminal açtıysanız yeniden yazın):

export GIT_COMMITTER_DATE="2024-03-13 09:00:00 +0300"
git tag -a v1.0.0 -m "İlk kararlı sürüm: arama, harf duyarsızlığı, hata kodu" HEAD~1
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 11fe7e8840e866dda55da81f522f27f3268f1751
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
9c57fc4649ef6bdcd4ee73dc697fe500468d50f6

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}"
11fe7e8840e866dda55da81f522f27f3268f1751

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 11fe7e8840e866dda55da81f522f27f3268f1751
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. Önce seçenek README’de belgelenir ve işlenir:

cat >> README.md <<'SON'

Tüm terimleri listelemek için `./ara.sh -l` yazın.
SON
export GIT_AUTHOR_DATE="2024-03-13 11:00:00 +0300"
export GIT_COMMITTER_DATE="2024-03-13 11:00:00 +0300"
git commit -a -m "README'de -l seçeneğini belgele"

Ardından etiket konur:

export GIT_COMMITTER_DATE="2024-03-13 11:10:00 +0300"
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
67c7ca6 (HEAD -> main, tag: v1.1.0) README'de -l seçeneğini belgele
a0e3bfe Tüm terimleri listeleyen -l seçeneğini ekle
11fe7e8 (tag: v1.0.0) Aramanın harf duyarsızlığını README'de belirt
c497738 Revert "Arama çıktısını yalnızca Türkçe sütuna indir"
d245350 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
9c57fc4649ef6bdcd4ee73dc697fe500468d50f6 tag	refs/tags/v1.0.0
7cbb6f6054352e79e94cf24d5079ae5af15482f1 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. Bir bileşik terim örneği README’ye eklenip işlenir:

cat >> README.md <<'SON'

Bileşik terimleri tırnak içinde verin: `./ara.sh "bağlı liste"`.
SON
export GIT_AUTHOR_DATE="2024-03-14 10:00:00 +0300"
export GIT_COMMITTER_DATE="2024-03-14 10:00:00 +0300"
git commit -a -m "Bileşik terim örneği ekle"
git describe
v1.1.0-1-g2a41365

Üç 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
2a41365 (HEAD -> main) Bileşik terim örneği ekle
67c7ca6 (tag: v1.1.0) README'de -l seçeneğini belgele
a0e3bfe Tüm terimleri listeleyen -l seçeneğini ekle
11fe7e8 (tag: v1.0.0) Aramanın harf duyarsızlığını README'de belirt
c497738 Revert "Arama çıktısını yalnızca Türkçe sütuna indir"
d245350 Arama çıktısını yalnızca Türkçe sütuna indir
377b1f8 README'ye kullanım bölümü ekle
0e74ba9 Öbek ve dizi terimlerini ekle
d3ab7b0 Yerel notları izlemeden çıkar
7e44d29 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