(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/stash
zuhur 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 HEAD
normalde şube adı, yani bunu içerir ). Ancak genel olarak referanslar ile başlar .ref: refs/heads/branch
refs/
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 fetch
ve push
işlemler. Ayrıca kullanabilir git ls-remote
veya git remote show
onları görmek için, ancak fetch
ve push
temas daha ilginç noktalardır.
Refspecs
Sırasında fetch
ve 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 fetch
ve hem şube adlarını hem de etiket adlarını etkiliyor.
git fetch
Git'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 origin
bireyin dalları uzaktan için uzaktan izleme dalları haline origin
. Şube adı, uzaktan izleme şube adı haline gelir ve uzaktan kumanda adı bu durumda origin
dahil 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ı --tags
eklemenin 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, --tags
etiketlerinizi 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 origin
etiketi varsa xyzzy
ve siz yoksa ve siz git fetch origin "refs/tags/*:refs/tags/*"
, refs/tags/xyzzy
deponuza eklenirsiniz (uzaktan kumandadakiyle aynı taahhüde işaret ederek). Eğer kullanırsanız +refs/tags/*:refs/tags/*
daha sonra etiketi xyzzy
Eğ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-tags
git 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 fetch
ortaya çıkarırken, sizin Git ekleyen T ile veya olmadan etiketleri --tags
. Eklemek --tags
Git'inizin tüm etiketlerini almasına ve ayrıca güncellemeyi zorlamasına neden olur .
Sonuç olarak
git fetch --tags
Etiketlerini 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 --tags
almak 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 fetch
iş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:gitrevisions
xyzzy
xyzzy
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 xyzzy
etiketi dikkate almadan sizi şubeye koyar.
Belirsizlik durumunda, neredeyse her zaman tam adını kullanarak ref adını yazabilirsiniz refs/heads/xyzzy
veya refs/tags/xyzzy
. (Not bu o yapar ile işi git checkout
ama belki beklenmedik bir şekilde,: git checkout refs/heads/xyzzy
bir 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 xyzzy
etiketi xyzzy
mevcut olsa bile şubeyi kontrol edin. Etiketi kontrol etmek istiyorsanız kullanabilirsiniz refs/tags/xyzzy
.)
gitrevisions
Git ( 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/name
tags/xyzzy
xyzzy
xyzzy
$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 fetch
ve 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 .
git checkout A
. nedirA
? Nasıl yarattınA
?