Git etiketleri yalnızca geçerli dal için mi geçerlidir?


156

Şu anda birden fazla şubesi olan bir havuzla çalışıyorum.

Bir etiket oluşturduğumda, bu etiket o zaman geçerli olan dalı mı ifade ediyor?

Başka bir deyişle: Ne zaman bir etiket oluştursam, etiketin o noktada o dalı ifade etmesi için o dalın içindeki istenen dalı ve etiketi değiştirmem gerekir mi?

Yanıtlar:


151

Örneğin tarafından bir etiket oluşturursanız

git tag v1.0

etiketi, şu anda bulunduğunuz şubenin en son taahhüdünü belirtir. Şube değiştirebilir ve orada bir etiket oluşturabilirsiniz.

Etiketleme sırasında diğer şubeye de başvurabilirsiniz,

git tag v1.0 name_of_other_branch

etiketi diğer dalın en son işlemine yaratacaktır.

Veya etiketi, hangi dal olursa olsun, herhangi bir taahhüdün SHA1'ine doğrudan başvurarak herhangi bir yere koyabilirsiniz

git tag v1.0 <sha1>

201

CharlesB'nin yanıtı ve helmbert'in yanıtı faydalıdır, ancak onları anlamak biraz zaman aldı. İşte bunu koymanın başka bir yolu:

  • Bir etiket a, bir tamamlama için işaretçi ve kaydedilmesini dalların bağımsız bir şekilde, mevcut .
    • Etiketlerin dallarla doğrudan bir ilişkisi olmadığını anlamak önemlidir - sadece bir taahhüt tanımlarlar .
      • Bu taahhüt, herhangi bir sayıda daldan (yani, herhangi bir sayıda dalın tarihinin bir parçası olabilir) gösterilebilir - hiçbiri.
    • Bu nedenle, git show <tag>bir etiketin ayrıntılarını görmeye çalışmak , herhangi bir dal için referans içermez, yalnızca etiketin işaret ettiği taahhüdün kimliği.
      • (40 karakter dizgileri hex oluşur) nesne adları SHA-1 kimlikleri aka kimlikleri (Teslim bir içeriği üzerinde karma olan işlemek basamak; örneğin:. 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2)
  • Şubeler sadece dolaylı olarak devreye girer :
    • Sırasında oluşturarak bir etiket ile, ima işlemek etiket işaret edeceği :
      • Bir etiket için hedef belirtmemek, varsayılan olarak geçerli dalın en son taahhüdünü (diğer adıyla KAFA) belirtir; Örneğin:
        • git tag v0.1.0 # tags HEAD of *current* branch
      • Bir dal adının etiket hedefi olarak belirtilmesi, varsayılan olarak o dalın en son taahhüdüdür; Örneğin:
        • git tag v0.1.0 develop # tags HEAD of 'develop' branch
      • (Diğerlerinin de belirttiği gibi, etiketin hedefi olarak açıkça bir taahhüt kimliği de belirleyebilirsiniz.)
    • git describeGeçerli dalı tanımlamak için kullanırken :
      • git describe [--tags] mevcut şubeyi, bu şubenin tarihindeki en yeni [muhtemelen hafif] etiketten bu yana taahhütler olarak açıklamaktadır .
      • Bu nedenle, başvuruda bulunulan git describeetiket genel olarak en son oluşturulan etiketi yansıtmayabilir .

Bu nedenle, belirli bir etiket için (örn. V0.1.0), gerçek bir derlemede (o kaynağın) gerçek kaynağın ne olduğunu bilmek için derlemenin dayandığı dalı bilmeniz gerekir, değil mi? Yani, belirli bir taahhüt farklı dallarda farklı torunlara sahip olabilir, değil mi?
Hawkeye Parker

2
@HawkeyeParker: Artık buna dalmış değilim, ancak dalı bilmenize gerek yok, çünkü bir etiket belirli bir taahhüdü tanımlar (birden çok dalın parçası olabilir) ve oradan araştırabilirsiniz.
mklement0

Ben git gösterisi [etiketadı] Ama eğer o zaman yalanlamaktadır Yazar ve Tarih, yukarıda bir şube adını gösteren "git gösterisi <tag> çalıştıran bir etiketin ayrıntılarını görmek için herhangi dalları için hiçbir başvuru içeriyor"
Brad Thomas

39

Etiketler belirli bir işleme atıfta bulunduğundan ve şube geçmişin son işlemine hareketli bir referans olduğundan etiketler ve şube tamamen alakasızdır. Şubeler gidiyor, etiketler kalıyor.

Dolayısıyla, bir taahhüdü etiketlediğinizde git, ona etiketlemek istediğiniz şeyin SHA1'ini sağlarsanız, hangi taahhüt veya şubenin teslim alındığı umurunda değildir.

Hatta bir şubeye başvurarak da etiketleyebilirim (daha sonra dalın ucunu etiketleyecektir) ve daha sonra dalın ucunun başka bir yerde ( git reset --hardörneğin ile) olduğunu söyleyebilir veya dalı silebilirim. Ancak oluşturduğum etiket hareket etmiyor.


17
Başka bir deyişle, etiketler çirkin git karmaları için güzel isimlerdir. Hangi dallar mevcut olursa olsun (ed) etiketi (ve karma) vardır.
C-Otto

8

git tag <TAGNAME>Herhangi bir ek parametre olmadan çağrı yaparken Git, geçerli HEAD'inizden (yani mevcut şubenizin HEAD) yeni bir etiket oluşturur. Bu şubeye ek taahhütler eklenirken, şube HEAD bu yeni taahhütlere ayak uyduracak, etiket ise her zaman aynı taahhüt anlamına gelmektedir.

Arama yaparken git tag <TAGNAME> <COMMIT>etiketi oluşturmak için hangi taahhüdün kullanılacağını belirtebilirsiniz.

Ne olursa olsun, bir etiket hala belirli bir işleme (dal değil) bir "işaretçi" dir.


6

Geçmişteki bazı taahhütler için bir etiket oluşturabiliriz:

git tag [tag_name] [reference_of_commit]

Örneğin:

git tag v1.0 5fcdb03

1

Bulunduğunuz dalı etiketlemek istiyorsanız, şunu yazın:

git tag <tag>

ve şubeyi şununla it:

git push origin --tags

0

Bir şubeden release/yourbranchvb. Gibi bir etiket oluşturmak istiyorsanız, o zaman böyle bir şey kullanmalısınız.

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

Etiketi uzaktan kumandaya itmek istiyorsanız uygun etiketi oluşturduktan sonra komutu kullanın.

git push origin YOUR_TAG_VERSION_OR_NAME
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.