Git टैग क्या है, टैग कैसे बनाएं और git रिमोट टैग कैसे चेक करें


522

जब मैं रिमोट git टैग का उपयोग इस तरह से करता हूं:

git checkout -b local_branch_name origin/remote_tag_name

मुझे इस तरह त्रुटि मिली:

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

जब मैं git टैग कमांड का उपयोग करता हूं तो मुझे रिमोट_टैग_नाम मिल सकता है।

जवाबों:


1152

चलिए आपको समझाते हैं कि git में एक टैग क्या है

यहाँ छवि विवरण दर्ज करें

एक टैग का उपयोग इतिहास में एक विशिष्ट प्रतिबद्धता को लेबल करने और चिह्नित करने के लिए किया जाता है।
इसका उपयोग आमतौर पर रिलीज़ पॉइंट (जैसे। V1.0, आदि) को चिह्नित करने के लिए किया जाता है।

यद्यपि एक टैग एक शाखा के समान दिखाई दे सकता है, एक टैग, हालांकि, बदलता नहीं है । यह सीधे इतिहास में एक विशिष्ट प्रतिबद्धता की ओर इशारा करता है।

यहाँ छवि विवरण दर्ज करें


यदि आप स्थानीय रूप से अपनी रिपॉजिटरी में स्थानीय नहीं हैं, तो आप टैगों की जांच नहीं कर पाएंगे, आपको fetchअपने स्थानीय रिपॉजिटरी के टैग्स को देखना होगा।

पहले, सुनिश्चित करें कि टैग स्थानीय रूप से मौजूद है

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

फिर रन करके टैग को देखें

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

इसके बजाय उपसर्ग का originउपयोग करें tags/


इस नमूने में आपके पास 2 टैग संस्करण 1.0 और संस्करण 1.1 हैं, आप उन्हें निम्न में से किसी के साथ देख सकते हैं:

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

उपरोक्त सभी ऐसा ही करेंगे क्योंकि टैग केवल एक दिए गए कमेंट का पॉइंटर है।

यहाँ छवि विवरण दर्ज करें
उत्पत्ति: https://backlog.com/git-tutorial/img/post/stepup/capture_stepup4_1_1_png


सभी टैग की सूची कैसे देखें?

# list all tags
$ git tag

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

टैग कैसे बनाएं?

टैग बनाने के 2 तरीके हैं:

# lightweight tag 
$ git tag 

# annotated tag
$ git tag -a

2 के बीच का अंतर यह है कि एक एनोटेट टैग बनाते समय आप मेटाडेटा जोड़ सकते हैं जैसा कि आपके पास एक कमिट में है:
नाम, ई-मेल, दिनांक, टिप्पणी और हस्ताक्षर

यहाँ छवि विवरण दर्ज करें

टैग कैसे हटाएं?

# 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>

एक विशिष्ट टैग क्लोन कैसे करें?

दिए गए टैग की सामग्री को हथियाने के लिए, आप checkoutकमांड का उपयोग कर सकते हैं । जैसा कि ऊपर बताया गया है कि टैग किसी भी अन्य कमिट की तरह हैं इसलिए हम उपयोग कर सकते हैं checkoutऔर इसके बजाय SHA-1 का उपयोग करने के बजाय इसे टैगनाम के साथ बदल दें

विकल्प 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>

विकल्प 2:

क्लोन कमांड का उपयोग करना

चूंकि git उथले क्लोन--branch को क्लोन कमांड से जोड़कर समर्थन करता है इसलिए हम शाखा नाम के बजाय टैग नाम का उपयोग कर सकते हैं। Git जानता है कि संबंधित SHA-1 को संबंधित कमिट में "ट्रांसलेट" कैसे किया जाए

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

git clone --branch =

--branch टैग भी ले सकते हैं और इसके परिणामस्वरूप भंडार में उस प्रतिबद्ध को कम कर सकते हैं।


टैग्स को कैसे पुश करें?

git push --tags

सभी टैग पुश करने के लिए:

# Push all tags
$ git push --tags 

के refs/tagsबजाय सिर्फ निर्दिष्ट करने का उपयोग करना <tagname>

क्यों? - इसका उपयोग करने की अनुशंसा की जाती है refs/tagsक्योंकि कभी-कभी टैग में आपकी शाखाओं के समान नाम हो सकते हैं और सरल गिट पुश टैग के बजाय शाखा को धक्का देगा

एनोटेट टैग और वर्तमान इतिहास श्रृंखला टैग का उपयोग करने के लिए:

git push --follow-tags

यह ध्वज --follow-tagsदोनों कमिटों को धकेलता है और केवल टैग जो दोनों हैं:

  • एनोटेट टैग (ताकि आप स्थानीय / अस्थायी बिल्ड टैग छोड़ सकें)
  • वर्तमान शाखा (इतिहास पर स्थित) से पुन: प्राप्य टैग (पूर्वज)

यहाँ छवि विवरण दर्ज करें

जीआईटी 2.4 से आप इसे कॉन्फ़िगरेशन का उपयोग करके सेट कर सकते हैं

$ git config --global push.followTags true

प्रवंचक पत्रक: यहाँ छवि विवरण दर्ज करें



3
अच्छा। git checkout A। क्या है A? आपने कैसे बनाया A?
हनी

3
@ कोडकोड अच्छा प्रवाह चार्ट! आपने इसे बनाने के लिए किस सॉफ्टवेयर का उपयोग किया?
जियोवन्नी लोवाटो

4
@ हनी Aएक प्रतिबद्ध हैश है
एलेक्स

2
@GOVanniLovato प्रवाह चार्ट एक तीसरी पार्टी है। छवि के लिए लिंक है backlog.com/git-tutorial/img/post/stepup/... जो इस पेज से है backlog.com/git-tutorial/stepup/stepup4_1.html नौसिखियों के लिए Git प्रारंभिक मार्गदर्शिका (बैकलॉग कहा जाता वेबसाइट के .com)।
जॉर्ज

2
यह ध्यान देने योग्य है कि git checkout tags/<tag_name> -b <branch_name>इसकी आवश्यकता है -b <branch_name>git checkout tags/<tag_name>मुझे एक अलग सिर दे दिया। अलग किए गए सिर के बारे में इस लेख के अनुसार , आप एक शाखा को अस्थायी रूप से बनाने और हटाने के द्वारा अलग किए गए सिर से बचते हैं। यह काफी एलियन वर्क फ्लो है। स्पष्ट रूप से मैं एक git उपयोगकर्ता के रूप में मज़ा और लाभ के लिए शाखाओं को बनाने और हटाने के लिए उपयोग करने की आवश्यकता है।
icc97

194

(यह उत्तर लिखने में थोड़ा समय लगा, और कोडवर्ड का उत्तर उद्देश्य और सार में सही है, लेकिन पूरी तरह से पूरा नहीं है, इसलिए यह किसी भी तरह से पोस्ट करेगा।)


"रिमोट गिट टैग" जैसी कोई चीज नहीं है। केवल "टैग" हैं। मैं बताता हूं कि यह सब पांडित्यपूर्ण नहीं है, 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/branchrefs/

एक बात यह है कि यह भ्रमित करने के लिए 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 के लिए एक नाम को हल करेगा। उत्सुकता से, टैग शाखाओं को ओवरराइड करते हैं: यदि एक टैग और एक शाखा है , और वे अलग-अलग हिट्स की ओर इशारा करते हैं, तो:gitrevisionsxyzzyxyzzy

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/nametags/xyzzyxyzzyxyzzy$GIT_DIR$GIT_DIR/xyzzy*HEAD$GIT_DIR


1 ठीक है, ठीक है, " सिर्फ पांडित्य नहीं"। :-)

2 कुछ कहेंगे "बहुत उपयोगी नहीं", और मैं वास्तव में सहमत होना चाहूंगा।

3 मूल रूप से, git fetchऔर रीमोट और रीस्पेक की पूरी अवधारणा, गिट 1.5 के समय के आसपास हो रही गिट के अलावा थोड़ी देर की थी। तब से पहले कुछ एड-हॉक विशेष मामले थे, और टैग-फ़ेचिंग उनमें से एक था, इसलिए यह विशेष कोड के माध्यम से दादा हो गया।

4 अगर यह मदद करता है, एक के रूप में दूरदराज Git के बारे में सोच फ्लैशर खिचड़ी अर्थ में,।


महान लेखन। एक नन्हा नट: git fetchकेवल रिमोट का टैग लाने के लिए --tagsआर्ग दिया जाएगा ।
cweekly

@cweekly: के व्यवहार --tags, --no-tagsऔर डिफ़ॉल्ट वास्तव में काफी मुश्किल है। डिफ़ॉल्ट उन टैगों को लाने के लिए है जो आपके पास नहीं हैं जो आपके द्वारा लाए जा रहे कमिट्स में हैं (जनवरी 2017 का संपादन देखें)। -कोई-टैग हैंडलिंग कोड को फिर से संशोधित नहीं किया गया है, जो संभवतः अभी तक अधिक विशेष कोने के मामलों को जन्म देगा।
torek

1

Git टैग चेकआउट करने के लिए, आप निम्नलिखित कमांड निष्पादित करेंगे

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

जैसे नीचे बताया गया है।

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

सभी टैग लाने के लिए कमांड का उपयोग करें

git fetch --all --tags

0

विशिष्ट टैग कोड प्राप्त करने के लिए एक नई शाखा बनाने का प्रयास करें इसमें टैग कोड प्राप्त करें। मैंने इसे आज्ञा से किया है:$git checkout -b newBranchName tagName

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.