Git Etiketi Nedir, Etiket Nasıl Oluşturulur?


524

Ben uzaktan git etiketi kullanıma ne zaman böyle komut kullanın:

git checkout -b local_branch_name origin/remote_tag_name

Böyle bir hata var:

error: pathspec `origin/remote_tag_name` did not match any file(s) known to git.

Git tag komutunu kullandığımda remote_tag_name dosyasını bulabilirim.

Yanıtlar:


1155

Git'teki bir etiketin ne olduğunu açıklayarak başlayalım

resim açıklamasını buraya girin

Bir etiket, geçmişteki belirli bir taahhüdü etiketlemek ve işaretlemek için kullanılır .
Genellikle salım noktalarını işaretlemek için kullanılır (örn. V1.0 vb.).

Bir etiket bir şubeye benzer görünse de, bir etiket değişmez . Doğrudan tarihin belirli bir taahhüdüne işaret ediyor .

resim açıklamasını buraya girin


Eğer yerel olarak deponuzda değilse etiketleri kontrol edemezsiniz, bu yüzden önce fetchyerel deponuzdaki etiketlere ihtiyacınız vardır.

İlk olarak, etiketin yerel olarak bulunduğundan emin olun.

# --all will fetch all the remotes.
# --tags will fetch all tags as well
$ git fetch --all --tags --prune

Ardından, etiketi çalıştırarak kontrol edin

$ git checkout tags/<tag_name> -b <branch_name>

Öneki originkullanmak yerine tags/.


Bu örnekte, 2 etiket sürüm 1.0 ve sürüm 1.1'e sahipsiniz ve aşağıdakilerden herhangi biriyle kontrol edebilirsiniz:

$ git checkout A  ...
$ git checkout version 1.0  ...
$ git checkout tags/version 1.0  ...

Etiket yalnızca belirli bir taahhüdün işaretçisi olduğundan yukarıdakilerin tümü aynı şeyi yapar.

resim açıklamasını buraya girin
kökeni: https://backlog.com/git-tutorial/img/post/stepup/capture_stepup4_1_1.png


Tüm etiketlerin listesi nasıl görüntülenir?

# list all tags
$ git tag

# list all tags with given pattern ex: v-
$ git tag --list 'v-*'

Etiketler nasıl oluşturulur?

Etiket oluşturmanın 2 yolu vardır:

# lightweight tag 
$ git tag 

# annotated tag
$ git tag -a

2 arasındaki fark, açıklamalı bir etiket oluştururken git komutunda olduğu gibi meta veriler ekleyebilmenizdir:
ad, e-posta, tarih, yorum ve imza

resim açıklamasını buraya girin

Etiketler nasıl silinir?

# delete any (local) given tag
$ git tag -d <tag name>

# Delete a tag from the server with push tags
$ git push --delete origin <tag name>

Belirli bir etiketi nasıl kopyalayabilirim?

Belirli bir etiketin içeriğini almak için checkoutkomutu kullanabilirsiniz . Yukarıda açıklandığı gibi, etiketler diğer taahhütlere benzer, bu yüzden checkoutSHA-1'i kullanmak yerine sadece tag_name ile değiştirmek yerine

Seçenek 1:

# Update the local git repo with the latest tags from all remotes
$ git fetch --all

# checkout the specific tag
$ git checkout tags/<tag> -b <branch>

Seçenek 2:

Klon komutunu kullanma

Git klon komutuna ekleyerek sığ klonu desteklediğinden --branch, dal adı yerine etiket adını kullanabiliriz. Git, verilen SHA-1'in ilgili komiteye nasıl "tercüme edileceğini" bilir

# Clone a specific tag name using git clone 
$ git clone <url> --branch=<tag_name>

git clone --branch =

--branch ayrıca etiket alabilir ve HEAD'ı sonuçtaki depoda bu taahhütte ayırabilir.


Etiketler nasıl aktarılır?

git push --tags

Tüm etiketleri itmek için:

# Push all tags
$ git push --tags 

Kullanılması refs/tagsyerine belirleme <tagname>.

Neden? - refs/tagsBazen etiketlerin dallarınızla aynı ada sahip olabileceği ve basit git push etiket yerine dalı iteceği için kullanılması önerilir

Ek açıklamalı etiketleri ve geçerli geçmiş zinciri etiketlerini itmek için şunu kullanın:

git push --follow-tags

Bu bayrak --follow-tagshem iter kaydedilmesini ve sadece etiketleri hem şunlardır:

  • Açıklamalı etiketler (böylece yerel / geçici derleme etiketlerini atlayabilirsiniz)
  • Geçerli daldan erişilebilen etiketler (bir ata) (geçmişte bulunur)

resim açıklamasını buraya girin

Git 2.4'ten yapılandırmayı kullanarak ayarlayabilirsiniz

$ git config --global push.followTags true

Kopya kağıdı: resim açıklamasını buraya girin



3
Güzel. git checkout A. nedir A? Nasıl yarattın A?
Tatlım

3
@CodeWizard Güzel bir akış şeması! Üretmek için hangi yazılımı kullandınız?
Giovanni Lovato

4
@Honey Abir taahhüt hash
Alex Baklanov

2
@GiovanniLovato Akış şeması üçüncü taraftır. Resme link backlog.com/git-tutorial/img/post/stepup/... Bu sayfayı dan backlog.com/git-tutorial/stepup/stepup4_1.html birikim Aptallar için Git Başlangıç Kılavuzu (denilen web sitesinin com).
George

2
Bunu git checkout tags/<tag_name> -b <branch_name>gerektiren kayda değer -b <branch_name>. git checkout tags/<tag_name>bana müstakil bir kafa verdi. Koparılmış kafa ile ilgili bu makaleye göre, geçici olarak bir dal oluşturarak ve silerek kopmuş bir kafadan kaçınırsınız. Bu oldukça yabancı bir iş akışı. Açıkçası ben git kullanıcı olarak eğlence ve kar için şube oluşturmak ve silmek için alışmak gerekir.
icc97

194

(Bu yanıtın yazılması biraz zaman aldı ve codeWizard'ın cevabı amaç ve öz olarak doğru, ancak tamamen tamamlanmadı, bu yüzden yine de göndereceğim.)


"Uzak Git etiketi" diye bir şey yoktur. Yalnızca "etiketler" vardır. Ben bilgiçlik, olmamaya Bütün bunları işaret 1 ama orada rahat Git kullanıcılarla bu konuda kafa karışıklığı bir çok şey var, çünkü Git belgelerine çok yararlı değildir 2 başlayanlar için. (Karışıklıkların kötü belgeleme nedeniyle mi geldiği veya kötü belgelerin mi doğası gereği biraz kafa karıştırıcı olduğu veya ne olduğu nedeniyle net değil.)

Orada olan daha düzgün "uzaktan izleme dalları" olarak adlandırılan "uzak dalları", ama onun değerinde bu aslında yerel kuruluşlar olduğunu belirtti. Yine de uzaktan etiket yok (siz onları yeniden icat etmedikçe). Yalnızca yerel etiketler vardır, bu nedenle etiketi kullanabilmek için yerel olarak almanız gerekir.

Git'in başvuruları çağırdığı belirli taahhütlerin adları için genel form, ile başlayan herhangi bir dizedir refs/. Bir refs/heads/dal ile başlayan bir dize ; refs/remotes/uzaktan izleme dalını adlarıyla başlayan bir dize ; ve refs/tags/etiket adlarıyla başlayan bir dize . Adı refs/stashzuhur referansıdır (tarafından kullanıldığı gibi git stash; eğik çizginin eksikliğine dikkat edin).

İle başlayan olmayan bazı sıradışı özel durum isimler var refs/: HEAD, ORIG_HEAD, MERGE_HEAD, ve CHERRY_PICK_HEADözellikle de (gerçi belirli kaydedilmesini anlamlara gelebilir isimler de hepsi HEADnormalde şube adı, yani bunu içerir ). Ancak genel olarak referanslar ile başlar .ref: refs/heads/branchrefs/

Git'in bu kafa karıştırıcı yapmak için yaptığı bir şey refs/, ve genellikle sonraki kelimeyi atlamanıza izin vermesidir refs/. Örneğin, atlayabilirsiniz refs/heads/ya refs/tags/yerel bir şube veya bahsederken etiketi-ve aslında sen gerekir ihmal refs/heads/yerel şube kontrol ederken! Sonuç net olduğunda veya - daha önce de belirttiğimiz gibi - bunu yapmanız gerektiğinde (için ) yapabilirsiniz.git checkout branch

Referansların sadece kendi havuzunuzda değil, uzak depolarda da var olduğu doğrudur. Ancak Git, uzak bir deponun referanslarına yalnızca çok belirli zamanlarda erişmenizi sağlar: yani, sırasında fetchve pushişlemler. Ayrıca kullanabilir git ls-remoteveya git remote showonları görmek için, ancak fetchve pushtemas daha ilginç noktalardır.

Refspecs

Sırasında fetchve push, Git dizeleri kullanır o çağırır refspecs yerel ve uzak depo arasındaki başvurular aktarmak. Böylece, bu zamanlarda ve refspecs yoluyla iki Git deposu birbiriyle senkronize olabilir. Adlarınız senkronize olduktan sonra, uzaktan kumandayı kullanan biriyle aynı adı kullanabilirsiniz. Yine de burada özel bir sihir var fetchve hem şube adlarını hem de etiket adlarını etkiliyor.

git fetchGit'inizi başka bir Git'i ("uzaktan") çağırmaya (veya belki de kısa mesaj) yönlendirmeye ve onunla konuşmaya yönlendirmeyi düşünmelisiniz . Bu görüşmenin başlarında, uzaktan kumanda tüm referanslarını listeler: içerdiği refs/heads/her şey ve refs/tags/içerdiği her şey ve diğer referansları. Git'iniz bunları tarar ve (her zamanki getirme refspec'i temel alarak) dallarını yeniden adlandırır .

Şu uzaktan kumanda için normal refspec'e bir göz atalım origin:

$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
$ 

Bu refspec Git'inize eşleşen her adı ( refs/heads/*yani, uzaktan kumandadaki her dalı) almasını ve adını değiştirmesini refs/remotes/origin/*, yani eşleşen parçayı aynı tutmasını, dal adını ( refs/heads/) uzaktan izleme dalının adını ( refs/remotes/özellikle , refs/remotes/origin/).

Öyle bu refspec aracılığıyla o originbireyin dalları uzaktan için uzaktan izleme dalları haline origin. Şube adı, uzaktan izleme şube adı haline gelir ve uzaktan kumanda adı bu durumda origindahil edilir. +Refspec'in önündeki artı işareti , "zorla" bayrağını ayarlar; yani, uzaktan izleme dalınız, eşleşmesi için gerekenlere bakılmaksızın uzaktan kumandanın dal adıyla eşleşecek şekilde güncellenir. ( +Şube güncellemeleri olmadan, "hızlı ileri sarma" değişiklikleriyle sınırlıdır ve Git güncellemesi 1.8.2'den beri etiket güncellemeleri yok sayılır; daha önce aynı hızlı ileri alma kuralları uygulanır.)

Etiketler

Peki ya etiketler? Onlar için hiçbir refspec yok - en azından varsayılan olarak değil. Bir tane ayarlayabilirsiniz, bu durumda refspec'in formu size bağlıdır; ya da koşabilirsiniz git fetch --tags. Kullanılması --tagseklemenin etkisi vardır refs/tags/*:refs/tags/*, yani refspec için, tüm etiketleri getiriyor ( ancak güncelleme gelmez senin zaten bu adı taşıyan bir etiket varsa, etiketi ne olursa olsun uzaktan kumandanın etiketi söylediğinin Düzen, Jan 2017: Git 2.10 itibariyle , testler, --tagsetiketlerinizi uzaktan kumanda etiketlerinden zorla güncellediğini, refspec okuyormuş gibi gösterir +refs/tags/*:refs/tags/*; bu , Git'in önceki bir sürümünden davranışta bir fark olabilir).

Burada yeniden adlandırma olmadığını unutmayın: uzaktan kumandanın originetiketi varsa xyzzyve siz yoksa ve siz git fetch origin "refs/tags/*:refs/tags/*", refs/tags/xyzzydeponuza eklenirsiniz (uzaktan kumandadakiyle aynı taahhüde işaret ederek). Eğer kullanırsanız +refs/tags/*:refs/tags/*daha sonra etiketi xyzzyEğer varsa, bir yerini teker origin. Yani, +bir refspec üzerindeki kuvvet bayrağı "referansımın değerini Git'imin Git'ten aldığı değerle değiştir" anlamına gelir.

Getirme sırasında otomajik etiketler

Tarihsel nedenlerden ötürü, ne seçeneği ne de seçeneği kullanırsanız 3 özel işlem yapar. Yukarıda uzaktan kumandanızın yerel Git'inizi görmek isteyip istemediğini tüm referanslarını görüntüleyerek başladığını söylediğimizi unutmayın . 4 Git'iniz bu noktada gördüğü tüm etiketleri not eder. Daha sonra, getirdiği her şeyi işlemesi gereken herhangi bir taahhüt nesnesini indirmeye başladığında, bu taahhütlerden biri bu etiketlerden herhangi biriyle aynı kimliğe sahipse, git bu etiketi veya birden fazla etiketin bu kimliğe sahip olması durumunda bu etiketleri ekler deponuz.--tags--no-tagsgit fetch

Düzenleme, Ocak 2017: Git 2.10'da davranış şimdi olduğu gösterileri test: Onların Git adında bir etiket sağlıyorsa , T , ve adlı bir etiket yok T , ve taahhüt ilişkilendirilen kimlik T şubeleri birinin atası senin o git fetchortaya çıkarırken, sizin Git ekleyen T ile veya olmadan etiketleri --tags. Eklemek --tagsGit'inizin tüm etiketlerini almasına ve ayrıca güncellemeyi zorlamasına neden olur .

Sonuç olarak

git fetch --tagsEtiketlerini almak için kullanmanız gerekebilir . Etiket adları mevcut etiket adlarınızla çakışıyorsa , (Git sürümüne bağlı olarak) etiketlerini git fetch --tagsalmak için bazı etiketlerinizi silmeniz (veya yeniden adlandırmanız) ve ardından çalıştırmanız gerekebilir . Etiketler (uzak dallardan farklı olarak) otomatik olarak yeniden adlandırmaya sahip olmadığından, etiket adlarınızın etiket adlarıyla eşleşmesi gerekir, bu nedenle çakışmalarla ilgili sorunlar yaşayabilirsiniz.

Bununla birlikte, çoğu normal durumda, git fetchişi basitçe yerine getirecek, taahhütlerini ve eşleşen etiketlerini getirecekler ve - kim olursa olsun - bu taahhütleri yayınladıkları sırada taahhütleri etiketleyecekleri için etiketlerine ayak uyduracaksınız. Kendi etiketlerinizi oluşturmazsanız veya depolarını ve diğer depolarını (birden fazla uzaktan kumanda ile) karıştırmazsanız, herhangi bir etiket adı çakışması yaşamayacaksınız, böylece etiketleri silmek veya yeniden adlandırmak için uğraşmanıza gerek kalmayacak. etiketlerini edinin.

Nitelikli isimlere ihtiyacınız olduğunda

Sana atlayabilirsiniz yukarıda belirtilen refs/ve hemen hemen her zaman refs/heads/ve refs/tags/ve böylece çoğu zaman üzerinde. Ama ne zaman yapamazsın ?

Tam (ya da tama yakın zaten) cevabı olduğunu belgeler . Git, bağlantıda verilen altı adımlı sırayı kullanarak bir adı bir taahhüt kimliğine çözümleyecektir. İlginç bir şekilde, etiketler dalları geçersiz kılar: bir etiket ve dal varsa ve farklı taahhütleri gösteriyorlarsa, o zaman:gitrevisionsxyzzyxyzzy

git rev-parse xyzzy

size etiketin işaret ettiği kimliği verecektir. Ancak - ve eksik olan budur gitrevisions- git checkoutşube adlarını tercih eder, bu yüzden git checkout xyzzyetiketi dikkate almadan sizi şubeye koyar.

Belirsizlik durumunda, neredeyse her zaman tam adını kullanarak ref adını yazabilirsiniz refs/heads/xyzzyveya refs/tags/xyzzy. (Not bu o yapar ile işi git checkoutama belki beklenmedik bir şekilde,: git checkout refs/heads/xyzzybir dal kasada yerine müstakil KAFALI ödeme neden olur sadece nota sahip nedeni budur. git checkoutÖnce bir şube adı olarak kısa adı kullanacağız: bu nasıl sensin xyzzyetiketi xyzzymevcut olsa bile şubeyi kontrol edin. Etiketi kontrol etmek istiyorsanız kullanabilirsiniz refs/tags/xyzzy.)

gitrevisionsGit ( notlar olarak) Git denediğinden , etiketli taahhüdü tanımlamak için de yazabilirsiniz . (Birisi adında geçerli bir referans yazmak başarmıştır ise içine , ancak bu şekilde çözecektir . Ama normalde sadece çeşitli isimler olmalıdır .)refs/nametags/xyzzyxyzzyxyzzy$GIT_DIR$GIT_DIR/xyzzy*HEAD$GIT_DIR


1 Tamam, tamam, " sadece bilgiçlikle ilgili değil". :-)

2 Bazıları "çok yararlı değil" diyebilir ve ben aslında aynı fikirdeyim.

3 Temel olarak, git fetchve tüm uzaktan kumandalar ve refspecs konsepti, Git 1.5'in etrafında gerçekleşen Git'e biraz geç kalmıştı. O zamandan önce sadece bazı özel durumlar vardı ve etiket getirme bunlardan biriydi, bu yüzden özel kodla dedeye gömüldü.

4 Eğer yardımcı olursa, uzak Git'i argo anlamında bir flaşör olarak düşünün .


Harika bir yazı. Bir küçük nit: git fetchsadece --tagsarg verildiğinde uzaktan kumandanın etiketlerini alır .
cweekly

@cweekly: davranışı --tags, --no-tagsve varsayılan aslında oldukça zordur. Varsayılan, getirdiğiniz taahhütlerde olmayan etiketleri getirmektir. (Ocak 2017 düzenlemesine bakın.) Ancak burada da aksaklıklar var ve modern Git --tags / --no-tags işleme kodu tekrar gözden geçirildi, bu da muhtemelen daha özel köşe vakalarına yol açacak.
torek

1

Git etiketini kontrol etmek için aşağıdaki komutu uygularsınız

git checkout tags/tag-name -b branch-name

örneğin aşağıda belirtildiği gibi.

 git checkout tags/v1.0 -b v1.0-branch

Tüm etiketleri almak için şu komutu kullanın:

git fetch --all --tags

0

Belirli bir etiket kodu almak için yeni bir şube oluşturmaya çalışın, içindeki etiket kodunu ekleyin. Komuta ile yaptım:$git checkout -b newBranchName tagName

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.