Açıklamalı ve açıklamalı olmayan etiket arasındaki fark nedir?


333

Geçerli taahhüdü etiketlemek istersem. Aşağıdaki komut satırlarının her ikisinin de çalıştığını biliyorum:

git tag <tagname>

ve

git tag -a <tagname> -m '<message>'

Bu komutlar arasındaki fark nedir?



1
@Thilo Bu tam bir kopya değil . Atıfta bulunulan soru, ilgili bayraklarla ilgili değil, ne zaman ek açıklama ekleneceği ile ilgilidir.
Todd A. Jacobs


TLDR açıklamasız: taahhüt; ek açıklama: taahhüt, yazar, tarih, (isteğe bağlı) yorum
Antony Hatchkins

Yanıtlar:


255

TL; DR

Komutlar arasındaki fark, birinin size bir etiket mesajı sunması, diğerinin olmamasıdır. Açıklamalı bir etiket, git-show (1) ile görüntülenebilen bir iletiye sahipken, ek açıklama içermeyen bir etiket yalnızca taahhüt için adlandırılmış bir işaretçidir.

Hafif Etiketler Hakkında Daha Fazla Bilgi

Belgelere göre : "Hafif bir etiket oluşturmak için -a, -s veya -m seçeneklerinden hiçbirini belirtmeyin, yalnızca bir etiket adı belirtin". Ek açıklamalı etiketlere mesaj yazmak için bazı farklı seçenekler de vardır:

  • Kullandığınızda git tag <tagname>Git, geçerli revizyonda bir etiket oluşturur, ancak sizden ek açıklama istemez. Mesajsız olarak etiketlenir (bu hafif bir etikettir).
  • Kullandığınızda git tag -a <tagname>Git, ileti sağlamak için -m bayrağını kullanmadığınız sürece sizden ek açıklama ister.
  • Kullandığınızda git tag -a -m <msg> <tagname>Git, kesinliği etiketleyecek ve sağlanan iletiyle açıklama ekleyecektir.
  • Kullandığınızda git tag -m <msg> <tagname>Git, ek açıklama için -a bayrağını geçmiş gibi davranır ve sağlanan iletiyi kullanır.

Temel olarak, yalnızca etiketin bir ek açıklamaya ve onunla ilişkili diğer bazı bilgilere sahip olup olmayacağınız anlamına gelir.


4
"Ek açıklama" etiketi ile taahhüt mesajı arasında bir fark var mı?
Steve Bennett

3
@SteveBennett Evet. Bir etiket ek açıklaması bir taahhüt mesajı değildir. Git-log (1) ile göremezsiniz; git-show (1) kullanmanız gerekir.
Todd A. Jacobs

115
"Ek açıklamalı" ve "hafif" etiketler arasındaki fark mesajın ötesine geçer. Ek açıklama eklenmiş etiketiniz ileti olmadan ( git tag -a <tag> -m '') olabilir, ancak ek açıklamalı etiket her zaman etiketleyici (yazar) ve tarih içerir .
Piotr Findeisen

1
Benim için de aynı. Sürüm etiketleri genellikle oldukça işe yaramaz mesajlara sahiptir (adından daha fazlasını söyleyebilir mi? Ne için?). Ne yazık ki, en çok oylanan cevap bu farktan bahsetmiyor.
Piotr Findeisen

44
Dikkat edilmesi gereken bir başka önemli nokta, etiketlerinizi kullanarak uzak bir depoya bastığınızda git push --follow-tags, yalnızca açıklamalı etiketlerin aktarılacağıdır.
Xatoo

209

Açıklamalı etiketleri itin, hafifliği yerel tutun

man git-tag diyor:

Açıklamalı etiketler serbest bırakılırken, hafif etiketler özel veya geçici nesne etiketleri içindir.

Ve bazı davranışlar, bu tavsiyenin yararlı olacağı şekilde aralarında ayrım yapar:

  • ek açıklamalı etiketler işaret ettikleri taahhütten farklı bir mesaj, içerik oluşturucu ve tarih içerebilir. Böylece bunları, bir yayın taahhüdü vermeden bir yayın tanımlamak için kullanabilirsiniz.

    Hafif etiketlerde fazladan bilgi yoktur ve buna gerek yoktur, çünkü yalnızca geliştirmek için kendiniz kullanacaksınız.

  • git push --follow-tags yalnızca ek açıklama eklenmiş etiketleri iter
  • git describe komut satırı seçenekleri olmadan yalnızca ek açıklama eklenmiş etiketleri görür

İç farklar

  • hem hafif hem de açıklamalı etiketler, .git/refs/tagsSHA-1 içeren bir dosyadır

  • hafif etiketler için SHA-1 doğrudan bir taahhüde işaret eder:

    git tag light
    cat .git/refs/tags/light
    

    KAFA SHA-1 ile aynı yazdırır.

    Başka meta veri içeremediklerine şaşmamalı.

  • açıklamalı etiketler nesne veritabanındaki bir etiket nesnesini gösterir.

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    açıklamalı etiket nesnesinin SHA'sını içerir:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    ve sonra içeriğini şu şekilde alabiliriz:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    örnek çıktı:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <your@mail.com> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

    Ek meta verileri bu şekilde içerir. Çıktıdan görebildiğimiz gibi, meta veri alanları:

    Biçimin daha ayrıntılı bir analizi şu adreste bulunur: Git etiketi nesnesinin biçimi nedir ve SHA'sı nasıl hesaplanır?

Bonuslar

  • Bir etiketin açıklanıp açıklanmadığını belirleyin:

    git cat-file -t tag
    

    çıktılar

    • commit hafiflik için, etiket nesnesi olmadığından, doğrudan
    • tag ek açıklama için, bu durumda bir etiket nesnesi olduğundan
  • Yalnızca hafif etiketleri listele: Tüm hafif etiketleri nasıl listeleyebilirim?


1
Bu, şu anda kabul edilen cevaptan çok daha açıktır. Teşekkürler.
Reece

43

Büyük fark mükemmel açıklanır burada .

Temel olarak, hafif etiketler sadece belirli taahhütlere işaret eder. Daha fazla bilgi kaydedilmez ; Öte yandan, açıklamalı etiketler , yazarları ve tarihleri ​​olan ve kendi SHA anahtarlarına sahip oldukları için referans verilebilen normal nesnelerdir .

Bilerek Eğer kim etiketli neyi ve ne zaman sizi ilgilendirmektedir, ardından etiketleri açıklamalı kullanın. Eğer varsa sadece gelişiminde belirli bir noktayı etiketlemek istediğiniz herhangi kim olduğu önemli ve bunu yaptıklarında, daha sonra hafif etiketleri iyi yeterlidir.

Normalde ek açıklamalı etiketler tercih edersiniz, ancak bu gerçekten projenin Git master'ına bağlıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.