(यह उत्तर लिखने में थोड़ा समय लगा, और कोडवर्ड का उत्तर उद्देश्य और सार में सही है, लेकिन पूरी तरह से पूरा नहीं है, इसलिए यह किसी भी तरह से पोस्ट करेगा।)
"रिमोट गिट टैग" जैसी कोई चीज नहीं है। केवल "टैग" हैं। मैं बताता हूं कि यह सब पांडित्यपूर्ण नहीं है, 1 लेकिन क्योंकि आकस्मिक गैट उपयोगकर्ताओं के साथ इस बारे में बहुत भ्रम है, और शुरुआती लोगों के लिए गिट प्रलेखन बहुत सहायक 2 नहीं है। (यह स्पष्ट नहीं है कि यदि भ्रम खराब प्रलेखन के कारण आता है, या खराब दस्तावेज आता है क्योंकि यह स्वाभाविक रूप से कुछ भ्रामक है, या क्या है)।
वहाँ रहे हैं "दूरस्थ शाखाओं", और अधिक ठीक से "दूरस्थ ट्रैकिंग शाखाओं" कहा जाता है, लेकिन यह देखते हुए कि ये वास्तव में स्थानीय संस्थाएं हैं यह की कीमत। कोई दूरस्थ टैग नहीं हैं, हालांकि (जब तक कि आप (उन्हें) उनका आविष्कार नहीं करते हैं)। केवल स्थानीय टैग हैं, इसलिए आपको इसका उपयोग करने के लिए स्थानीय रूप से टैग प्राप्त करने की आवश्यकता है।
विशिष्ट कमिटों के नाम के लिए सामान्य फॉर्म - जिसे Git संदर्भ कहता है - किसी भी स्ट्रिंग से शुरू होता है refs/
। एक स्ट्रिंग जो refs/heads/
एक शाखा के नाम से शुरू होती है ; refs/remotes/
रिमोट-ट्रैकिंग शाखा के नाम से शुरू होने वाली एक स्ट्रिंग ; और एक refs/tags/
टैग के साथ एक स्ट्रिंग शुरू होती है । नाम refs/stash
स्टैश संदर्भ है (जैसा कि उपयोग किया गया है git stash
; एक अनुगामी स्लैश की कमी पर ध्यान दें)।
कुछ असामान्य विशेष मामले ऐसे नाम हैं जो के साथ शुरू नहीं करते हैं refs/
: HEAD
, ORIG_HEAD
, MERGE_HEAD
, और CHERRY_PICK_HEAD
विशेष रूप से सभी का नाम भी है कि विशिष्ट प्रतिबद्ध का उल्लेख कर सकते हैं (हालांकि रहे हैं HEAD
आम तौर पर एक शाखा का नाम, यानी, शामिल होता है )। लेकिन सामान्य तौर पर, संदर्भ के साथ शुरू होता है ।ref: refs/heads/branch
refs/
एक बात यह है कि यह भ्रमित करने के लिए Git करता है कि यह आपको refs/
, और अक्सर शब्द के बाद छोड़ देता है refs/
। उदाहरण के लिए, आप स्थानीय शाखा या टैग का उल्लेख कर सकते हैं refs/heads/
या कर सकते हैं refs/tags/
— और वास्तव में स्थानीय शाखा की जाँच करते समय आपको छोड़ देना चाहिएrefs/heads/
। जब भी परिणाम असंदिग्ध हो, आप ऐसा कर सकते हैं या जैसा कि हमने अभी उल्लेख किया है - जब आपको यह करना होगा (के लिए )।git checkout branch
यह सच है कि संदर्भ न केवल आपके स्वयं के भंडार में मौजूद हैं, बल्कि दूरस्थ रिपॉजिटरी में भी मौजूद हैं। हालांकि, Git आपको बहुत ही विशिष्ट समय पर एक दूरस्थ रिपॉजिटरी के संदर्भों तक पहुंच प्रदान करता है: अर्थात्, दौरान fetch
और push
संचालन। तुम भी उपयोग कर सकते हैं git ls-remote
या git remote show
उन्हें देखने के लिए है, लेकिन fetch
और push
संपर्क के और अधिक दिलचस्प बातें बताई गई हैं।
Refspecs
के दौरान fetch
और push
, Git तार का उपयोग करता है यह कॉल refspecs स्थानीय और दूरस्थ भंडार के बीच संदर्भ हस्तांतरण करने के लिए। इस प्रकार, यह इन समयों में है, और रीस्पेक के माध्यम से, दो गिट रिपॉजिटरी एक दूसरे के साथ सिंक में मिल सकते हैं। एक बार आपके नाम सिंक में होने के बाद, आप उसी नाम का उपयोग कर सकते हैं जिसका कोई रिमोट उपयोग करता है। fetch
हालांकि, यहां कुछ विशेष जादू है , और यह शाखा नामों और टैग नामों दोनों को प्रभावित करता है।
आपको git fetch
अपने Git को कॉल करने का निर्देश देने के बारे में सोचना चाहिए (या शायद पाठ-संदेश) एक अन्य Git- "दूरस्थ" - और इसके साथ एक वार्तालाप है। इस वार्तालाप के आरंभ में, दूरस्थ इसके सभी संदर्भों को सूचीबद्ध करता है: इसमें सब कुछ refs/heads/
और refs/tags/
इसके साथ-साथ अन्य सभी संदर्भ। आपका गिट इन के माध्यम से स्कैन करता है और (सामान्य रूप से प्राप्त होने वाले रीस्पेक के आधार पर) अपनी शाखाओं का नाम बदलता है ।
आइए नामित रिमोट के लिए सामान्य रीस्पेक पर एक नज़र डालें origin
:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
$
यह refspec आपके Git को निर्देश देता है कि वह प्रत्येक नाम से मेल खाए- ie, refs/heads/*
रिमोट पर प्रत्येक शाखा- और उसका नाम बदलकर refs/remotes/origin/*
, अर्थात, मिलान किए गए भाग को समान रखें, शाखा नाम ( refs/heads/
) को दूरस्थ-ट्रैकिंग शाखा के नाम ( refs/remotes/
विशेष रूप से ) में बदलकर , refs/remotes/origin/
)।
यह इस refspec के माध्यम से है कि origin
शाखाएं रिमोट के लिए आपकी रिमोट-ट्रैकिंग शाखाएं बन जाती हैं origin
। शाखा का नाम रिमोट-ट्रैकिंग शाखा नाम बन जाता है, रिमोट के नाम के साथ, इस मामले में origin
, शामिल है। +
Refspec के सामने स्थित प्लस चिह्न "बल" ध्वज को सेट करता है, यानी, रिमोट की ट्रैकिंग शाखा को रिमोट के शाखा नाम से मिलान करने के लिए अपडेट किया जाएगा, फिर चाहे वह इसे मैच करने के लिए ही क्यों न हो। ( +
शाखा अपडेट के बिना , "तेज़ फ़ॉरवर्ड" परिवर्तन तक सीमित हैं, और टैग अपडेट को केवल Git संस्करण 1.8.2 या इसके बाद से अनदेखा किया जाता है - इससे पहले समान तेज़-फॉरवर्ड नियम लागू होते हैं।)
टैग
लेकिन टैग्स का क्या? उनके लिए कोई रिफस्पेक नहीं है - कम से कम, डिफ़ॉल्ट रूप से नहीं। आप एक सेट कर सकते हैं, जिस स्थिति में Refspec का रूप आपके ऊपर है; या आप चला सकते हैं git fetch --tags
। का उपयोग करने से रिफस्पेक को --tags
जोड़ने का प्रभाव पड़ता है refs/tags/*:refs/tags/*
, अर्थात, यह सभी टैगों को लाता है ( लेकिन आपके टैग को अपडेट नहीं करता है यदि आपके पास पहले से ही इस नाम के साथ एक टैग है, भले ही रिमोट का टैग एडिट करता हो, जनवरी 2017: Git 2.10 के रूप में , परीक्षण से पता चलता है कि --tags
रिमोट के टैग से जबरन आपके टैग अपडेट किए जाते हैं, जैसे कि रिफस्पेक पढ़ता है +refs/tags/*:refs/tags/*
; यह Git के पुराने संस्करण से व्यवहार में अंतर हो सकता है)।
ध्यान दें कि यहां कोई नाम नहीं है: यदि रिमोट origin
में टैग है xyzzy
, और आप नहीं करते हैं, और आप git fetch origin "refs/tags/*:refs/tags/*"
, आप refs/tags/xyzzy
अपने रिपॉजिटरी में जोड़ते हैं (रिमोट के समान कमिट की ओर इशारा करते हुए)। यदि आप उपयोग करते हैं +refs/tags/*:refs/tags/*
तो आपका टैग xyzzy
, यदि आपके पास एक है, को एक से बदल दिया जाता है origin
। यही है, +
एक refspec पर बल के झंडे का अर्थ है "मेरे संदर्भ के मूल्य को मेरे Git से उनके Git के साथ प्रतिस्थापित करें"।
लाने के दौरान स्वचालित टैग
ऐतिहासिक कारणों से, 3 यदि आप न तो --tags
विकल्प का उपयोग करते हैं और न ही --no-tags
विकल्प का, git fetch
विशेष कार्रवाई करते हैं। याद रखें कि हमने ऊपर कहा है कि रिमोट आपके स्थानीय Git को उसके सभी संदर्भों को प्रदर्शित करने से शुरू होता है , चाहे आपका स्थानीय Git उन्हें देखना चाहता हो या नहीं। 4 आपका गिट इस बिंदु पर देखे जाने वाले सभी टैगों पर ध्यान देता है। फिर, जैसा कि यह किसी भी प्रतिबद्ध वस्तुओं को डाउनलोड करना शुरू कर देता है, जो भी इसे ले रहा है उसे संभालने की जरूरत है, अगर उन में से किसी एक के पास समान टैग हैं, तो git उस टैग को जोड़ देगा - या उन टैग, यदि कई टैग में वह आईडी है - आपका भंडार।
संपादित करें, जनवरी 2017: परीक्षण से पता चलता है कि Git 2.10 में व्यवहार अब है: यदि उनका Git T नाम का एक टैग प्रदान करता है , और आपके पास T नाम का कोई टैग नहीं है , और T से संबंधित प्रतिबद्ध ID उनकी शाखाओं में से एक का पूर्वज है आपकी git fetch
जांच हो रही है, आपका Git आपके टैग के साथ या बिना T को जोड़ता है --tags
। --tags
अपने सभी टैग प्राप्त करने के लिए अपने Git को जोड़ने का कारण बनता है , और अद्यतन को भी बाध्य करता है।
जमीनी स्तर
आपको git fetch --tags
उनके टैग प्राप्त करने के लिए उपयोग करना पड़ सकता है । उनके अपने मौजूदा टैग नाम के साथ टैग नाम विरोध है तो आप तो हो सकता है (Git संस्करण के आधार पर) भी हटाना होगा (या नाम बदलने) अपने टैग के कुछ है, और फिर से चलाने के git fetch --tags
उनके टैग प्राप्त करने के लिए,। चूंकि टैग - दूरस्थ शाखाओं के विपरीत-स्वचालित नामकरण नहीं करते हैं, इसलिए आपके टैग नामों को उनके टैग नामों से मेल खाना चाहिए, यही कारण है कि आपके साथ संघर्ष हो सकते हैं।
में सबसे सामान्य मामलों, हालांकि, एक सरल git fetch
काम करेगा, उनके प्रतिबद्ध और उनके मिलान टैग लाने, और क्योंकि वे जो कोई भी वे कर रहे हैं-होगा प्रतिबद्ध समय वे उन प्रतिबद्ध प्रकाशित में टैग करते हैं, आप उनके टैग के साथ बनाए रखने होगा। यदि आप अपना टैग नहीं बनाते हैं, और न ही उनकी रिपॉजिटरी और अन्य रिपॉजिटरी (कई रीमोट के माध्यम से) को मिलाते हैं, तो आपके पास कोई टैग नाम टक्कर भी नहीं होगी, इसलिए आपको टैग हटाने या नाम बदलने के लिए उपद्रव नहीं करना पड़ेगा उनके टैग प्राप्त करें।
जब आपको योग्य नाम चाहिए
मैं उपर्युक्त है कि आप छोड़ सकते हैं refs/
लगभग हमेशा, और refs/heads/
और refs/tags/
और इतने समय के सबसे पर। लेकिन आप कब नहीं कर सकते ?
पूरा (या लगभग पूरा वैसे भी) जवाब में है प्रलेखन । लिंक में दिए गए छह-चरण अनुक्रम का उपयोग करके Git एक कमिट ID के लिए एक नाम को हल करेगा। उत्सुकता से, टैग शाखाओं को ओवरराइड करते हैं: यदि एक टैग और एक शाखा है , और वे अलग-अलग हिट्स की ओर इशारा करते हैं, तो:gitrevisions
xyzzy
xyzzy
git rev-parse xyzzy
आपको वह आईडी देगा जिस पर टैग इंगित करता है। हालाँकि - और यह वह चीज़ है जो गायब है gitrevisions
- git checkout
शाखा नामों को पसंद करता है, इसलिए git checkout xyzzy
आपको टैग की अवहेलना करते हुए, शाखा पर रखा जाएगा।
अस्पष्टता के मामले में, आप लगभग हमेशा अपने पूरे नाम का उपयोग करके रेफरी नाम का जादू कर सकते हैं, refs/heads/xyzzy
या refs/tags/xyzzy
। (ध्यान दें कि यह साथ काम करता हैgit checkout
, लेकिन शायद अनपेक्षित तरीके से: git checkout refs/heads/xyzzy
एक शाखा चेकआउट के बजाय एक अलग-थलग पड़ने वाले चेकआउट का कारण बनता है। यही कारण है कि आपको केवल यह ध्यान रखना है कि git checkout
पहले शाखा नाम के रूप में संक्षिप्त नाम का उपयोग किया जाएगा: यह है कि आप कैसे हैं xyzzy
टैग xyzzy
मौजूद होने पर भी शाखा देखें । यदि आप टैग की जाँच करना चाहते हैं, तो आप उपयोग कर सकते हैं refs/tags/xyzzy
।)
क्योंकि ( gitrevisions
नोट्स के रूप में ) Git कोशिश करेगा , आप केवल टैग किए गए कमेंट की पहचान करने के लिए भी लिख सकते हैं । (यदि कोई नाम में एक वैध संदर्भ लिखने में कामयाब रहा है , हालांकि, यह इस रूप में हल होगा । लेकिन आम तौर पर केवल विभिन्न नाम होने चाहिए ।)refs/name
tags/xyzzy
xyzzy
xyzzy
$GIT_DIR
$GIT_DIR/xyzzy
*HEAD
$GIT_DIR
1 ठीक है, ठीक है, " सिर्फ पांडित्य नहीं"। :-)
2 कुछ कहेंगे "बहुत उपयोगी नहीं", और मैं वास्तव में सहमत होना चाहूंगा।
3 मूल रूप से, git fetch
और रीमोट और रीस्पेक की पूरी अवधारणा, गिट 1.5 के समय के आसपास हो रही गिट के अलावा थोड़ी देर की थी। तब से पहले कुछ एड-हॉक विशेष मामले थे, और टैग-फ़ेचिंग उनमें से एक था, इसलिए यह विशेष कोड के माध्यम से दादा हो गया।
4 अगर यह मदद करता है, एक के रूप में दूरदराज Git के बारे में सोच फ्लैशर खिचड़ी अर्थ में,।
git checkout A
। क्या हैA
? आपने कैसे बनायाA
?