संपादित करें, 24 नवंबर 2016: यह उत्तर स्पष्ट रूप से लोकप्रिय है, इसलिए मैं यहां एक नोट जोड़ रहा हूं। यदि आप किसी केंद्रीय सर्वर पर एक टैग को प्रतिस्थापित करते हैं, तो जिस किसी के पास पुराना टैग है - उस केंद्रीय-सर्वर रिपॉजिटरी का कोई भी क्लोन जो पहले से ही टैग है- अपने पुराने टैग को बनाए रख सकता है । तो जबकि यह आपको बताता है कि यह कैसे करना है, वास्तव में सुनिश्चित करें कि आप इसे करना चाहते हैं। आपको अपने "गलत टैग" को हटाने के लिए "गलत" टैग वाले सभी को प्राप्त करना होगा और इसे नए "सही टैग" से बदलना होगा।
Git 2.10 / 2.11 में परीक्षण से पता चलता है कि पुराने टैग को बनाए रखना क्लाइंट्स को चलाने के लिए डिफ़ॉल्ट व्यवहार है git fetch, और अपडेट करना क्लाइंट्स के रनिंग के लिए डिफ़ॉल्ट व्यवहार है git fetch --tags।
(मूल उत्तर इस प्रकार है।)
जब आप टैग को पुश करने के लिए कहते हैं, तो git push --tagsभेजता है (किसी भी तरह के कमिट और अन्य ऑब्जेक्ट के साथ और पुश सेटिंग्स से किसी भी अन्य रेफरी अपडेट को) रिमोट के अपडेट रिक्वेस्ट को । (खैर, यह हालांकि कई भेजता है: प्रत्येक टैग के लिए उनमें से एक)new-sha1 refs/tags/name
अद्यतन अनुरोध को रिमोट द्वारा old-sha1(या फिर, प्रत्येक टैग के लिए एक) जोड़ने के लिए संशोधित किया जाता है , फिर पूर्व-प्राप्त और / या अपडेट हुक (जो भी रिमोट पर मौजूद होते हैं) के लिए दिया जाता है। वे हुक तय कर सकते हैं कि टैग बनाने / हटाने / अपडेट करने की अनुमति दें या अस्वीकार करें।
यदि old-sha1मान बनाया जा रहा है तो मान ऑल-ज़ीरो "null" SHA-1 है। new-sha1अशक्त SHA-1 यदि टैग हटाया जा रहा है। अन्यथा दोनों SHA-1 मान वास्तविक, मान्य मान हैं।
बिना हुक वाले भी, एक प्रकार का "बिल्ट-इन हुक" होता है, जिसे चलाया भी जाता है: रिमोट तब तक टैग को ले जाने से मना कर देगा जब तक कि आप "बल" ध्वज का उपयोग नहीं करते (हालांकि "निर्मित हुक" दोनों के साथ हमेशा ठीक होता है) "जोड़ें" और "हटाएं")। आपके द्वारा देखा जा रहा अस्वीकृति संदेश इस अंतर्निहित हुक से आ रहा है। (संयोग से, यह वही निर्मित हुक भी शाखा अपडेट को अस्वीकार कर देता है जो फास्ट-फॉरवर्ड नहीं हैं।) 1
लेकिन, यहां यह समझने की कुंजी है कि क्या चल रहा है - इस git pushकदम का कोई पता नहीं है कि रिमोट में अब टैग है और यदि हां, तो SHA-1 का क्या मूल्य है। यह केवल कहता है "यहां टैग की पूरी सूची है, साथ ही उनके SHA-1 मान"। रिमोट मूल्यों की तुलना करता है और यदि जोड़ और / या परिवर्तन हैं, तो उन पर हुक चलाता है। (टैग के लिए जो समान हैं, वह कुछ भी नहीं करता है। टैग के लिए आपके पास ऐसा नहीं है कि वे करते हैं, यह भी कुछ नहीं करता है!)
यदि आप स्थानीय रूप से टैग हटाते हैं, तो push, आपका पुश केवल टैग को स्थानांतरित नहीं करता है। रिमोट मानता है कि कोई बदलाव नहीं किया जाना चाहिए।
यदि आप स्थानीय रूप से टैग हटाते हैं, तो इसे एक नई जगह की ओर इशारा करते हुए बनाएं, फिर push, आपका पुश टैग को स्थानांतरित करता है, और रिमोट इसे टैग-परिवर्तन के रूप में देखता है और परिवर्तन को अस्वीकार करता है, जब तक कि यह एक बल-धक्का न हो।
इस प्रकार, आपके पास दो विकल्प हैं:
- एक बल-धक्का करो, या
- रिमोट पर टैग हटाएं।
उत्तरार्द्ध है के माध्यम से संभव git push2 भले ही टैग स्थानीय रूप से हटाने और pushing कोई प्रभाव नहीं है। मान लिया गया कि रिमोट का नाम है origin, और वह टैग जिसे आप हटाना चाहते हैं dev:
git push origin :refs/tags/dev
यह रिमोट को टैग हटाने के लिए कहता है। devआपके स्थानीय भंडार में टैग की मौजूदगी या अनुपस्थिति अप्रासंगिक है; Refspec के pushसाथ इस तरह का , एक शुद्ध-हटाने वाला धक्का है।:remoteref
रिमोट टैग हटाने (जोड़े गए किसी अतिरिक्त हुक के आधार पर) की अनुमति दे भी सकता है और नहीं भी। यदि यह हटाने की अनुमति देता है, तो टैग चला जाएगा, और एक git push --tags, जब आपके पास devकुछ प्रतिबद्ध या एनोटेट टैग रेपो ऑब्जेक्ट की ओर इशारा करते हुए एक स्थानीय टैग होता है, तो अपना नया devटैग भेजें । रिमोट पर, devअब एक नया बना टैग होगा, इसलिए रिमोट शायद पुश को अनुमति देगा (फिर से यह किसी भी अतिरिक्त हुक पर निर्भर करता है)।
बल-धक्का सरल है। आप अद्यतन कुछ भी करने के लिए सुनिश्चित नहीं होना चाहते हैं अन्य टैग की तुलना में, बस बता git pushही है कि एक refspec पुश करने के लिए:
git push --force origin refs/tags/dev:refs/tags/dev
(ध्यान दें: --tagsयदि आपको स्पष्ट रूप से सिर्फ एक टैग रेफ-स्पेक दिया जा रहा है तो आपको इसकी आवश्यकता नहीं है )।
1 बेशक, कारण इस में निर्मित हुक मदद करने के लिए है व्यवहार को लागू करने के लिए है कि के अन्य उपयोगकर्ताओं है कि एक ही रिमोट रेपो उम्मीद: कि शाखाओं rewound नहीं हैं, और टैग के लिए कदम नहीं है। यदि आप बल-धक्का करते हैं, तो आपको दूसरे उपयोगकर्ताओं को यह बताने देना चाहिए कि आप ऐसा कर रहे हैं, ताकि वे इसके लिए सही हो सकें। ध्यान दें कि "टैग बिल्कुल नहीं चलते हैं" Git 1.8.2 द्वारा नया लागू किया गया है; पिछले संस्करण टैग को "ग्राफ में आगे बढ़ने" की अनुमति देते हैं, शाखा नामों की तरह। जीआईटी 1.8.2 रिलीज नोट देखें ।
2 यदि आप रिमोट पर लॉग इन कर सकते हैं तो यह तुच्छ है। बस Git रिपॉजिटरी में जाएं और वहां दौड़ें git tag -d dev। ध्यान दें कि किसी भी तरह से - रिमोट पर टैग git pushको हटाना , या इसे हटाने के लिए उपयोग करना - एक समय की अवधि है जब रिमोट को एक्सेस करने वाला कोई भी व्यक्ति यह पाएगा कि devटैग गायब है। (वे जारी रहेगा अपने स्वयं के पुराने टैग, अगर वे पहले से ही यह है, और वे भी धक्का सकता है उनके पुराने टैग वापस ऊपर इससे पहले कि आप नया एक धक्का कर सकते हैं।)