मैं एक टैग शाखा पर एक टैग को एक अलग प्रतिबद्ध में कैसे स्थानांतरित कर सकता हूं?


858

मैंने मास्टर ब्रांच पर एक टैग बनाया है जिसे v0.1इस तरह से कहा गया है:

git tag -a v0.1

लेकिन तब मुझे एहसास हुआ कि रिलीज़ 0.1 के लिए मास्टर में विलय करने के लिए अभी भी कुछ बदलावों की ज़रूरत थी, इसलिए मैंने ऐसा किया। लेकिन अब मेरा v0.1टैग गलत प्रतिबद्ध होने पर (पोस्ट-इट नोट सादृश्य को लागू करने पर) अटक गया है। मैं चाहता हूं कि यह मास्टर पर सबसे हालिया प्रतिबद्ध पर अटक जाए, लेकिन इसके बजाय यह मास्टर पर सबसे हाल के प्रतिबद्ध पर अटक गया है।

मैं इसे मास्टर पर सबसे हाल ही में कैसे स्थानांतरित कर सकता हूं?

जवाबों:


1198

-fविकल्प का उपयोग करें git tag:

-f
--force

    Replace an existing tag with the given name (instead of failing)

आप शायद एक गैर-एनोटेट के बजाय एक एनोटेट टैग बनाने के लिए -fसंयोजन के साथ उपयोग करना चाहते हैं -a

उदाहरण

  1. पुश करने से पहले किसी भी रिमोट पर टैग को हटा दें

    git push origin :refs/tags/<tagname>
    
  2. सबसे हालिया प्रतिबद्ध को संदर्भित करने के लिए टैग को बदलें

    git tag -fa <tagname>
    
  3. टैग को दूरस्थ मूल में पुश करें

    git push origin master --tags
    

90
यह करने से पहले किसी भी रिमोट पर टैग को हटाना एक अच्छा विचार हो सकता है, ऐसा करके: git push origin :refs/tag/<tagname>और फिर करें git tag -fa <tagname>और फिर करें git push origin master --tags। अन्यथा आप ^ और {} वर्णों के साथ रिमोट पर रेफरी सूची में अजीब सामान के साथ समाप्त हो सकते हैं। इसे इंगित करने के लिए codebasehq.com पर Dan को धन्यवाद।
eedeep

47
@ लीड: माइनर करेक्शन - इसके बजाय :refs/tag/<tagname>होना चाहिए :refs/tags/<tagname>
बेन होकिंग 20

8
यह तभी काम करता है जब आपने अपने मशीन के कोड को धक्का नहीं दिया हो। यदि आपके पास सबसे अच्छा जवाब है, तो 'दुनिया में बहुत सारी संख्याएँ हैं' क्योंकि यह शायद परेशानी के लायक नहीं है।
क्रिस हुआंग-लीवर

33
यदि आपने पहले ही अपना टैग पुश कर दिया था, तो आप अभी भी रिमोट टैग को मजबूर पुश के साथ अपडेट कर सकते हैंgit push -f origin <tagname>
rc_luke

11
यहाँ और डॉक्स में जो उल्लेख नहीं है, वह यह है कि यह वास्तव में टैग संदेश को स्थानांतरित करता है, यदि कोई नया संदेश नहीं दिया गया है।
Twonky

259

अधिक सटीक रूप से, आपको टैग को जोड़ने के लिए मजबूर करना होगा, फिर विकल्प के साथ धक्का दें --tags और -f:

git tag -f -a <tagname>
git push -f --tags

171

अगर आपके रिमोट को कॉल किया जाता है originऔर आप masterब्रांच पर काम कर रहे हैं, तो योग करने के लिए :

git tag -d <tagname>
git push origin :refs/tags/<tagname>
git tag <tagname> <commitId>
git push origin <tagname>
  • लाइन 1 स्थानीय एनवी में टैग को हटाता है।
  • लाइन 2 दूरस्थ env में टैग को हटाता है।
  • लाइन 3 टैग को अलग-अलग प्रतिबद्ध करता है
  • लाइन 4 रिमोट में बदलाव को आगे बढ़ाती है

git push origin --tagsअपने स्थानीय परिवर्तनों से टैग के साथ सभी परिवर्तनों को धकेलने के लिए आप पंक्ति 4 का भी आदान-प्रदान कर सकते हैं ।

@ स्टुअर्ट-गोलोडेट, @ greg-hewgill, @eedeep, @ ben-hocking के उत्तर, उनके उत्तर के नीचे टिप्पणी और मेरे उत्तर के नीचे NateS टिप्पणी पर आधारित।


87

इसके साथ इसे हटा दें git tag -d <tagname>और फिर इसे सही प्रतिबद्ध पर फिर से बनाएं।


3
@ लीड: मुझे लगता है कि ग्रेग की प्रतिक्रिया वास्तव में बेहतर है कि वह निष्पक्ष रहें।
स्टुअर्ट गोलोडेट्ज़

इसे सरल रखें। इसे हटाएं, जो आपने पहले किया था उसे फिर से करें।
ऊलाला

1
इसकी सादगी के लिए यह स्वीकृत उत्तर होना चाहिए। इसके अलावा -f बल का अत्यधिक उपयोग न करें।
चिनचिनचिन

48

मैं Git का उपयोग करते समय कुछ चीजों से बचने की कोशिश करता हूं।

  1. आंतरिकों के ज्ञान का उपयोग करना, उदाहरण के लिए refs / टैग। मैं पूरी तरह से प्रलेखित Git आदेशों का उपयोग करने की कोशिश करता हूं और उन चीजों का उपयोग करने से बचता हूं जिनके लिए .git निर्देशिका की आंतरिक सामग्री के ज्ञान की आवश्यकता होती है। (यह कहना है, मैं Git को Git उपयोगकर्ता के रूप में मानता हूं और Git डेवलपर के रूप में नहीं।)

  2. आवश्यकता न होने पर बल का प्रयोग।

  3. बातों से परे। (जहां मैं चाहता हूं, एक टैग प्राप्त करने के लिए एक शाखा और / या बहुत सारे टैग लगा रहा हूं।)

तो यहाँ एक गैर-हिंसक समाधान है, टैग को बदलने के लिए, स्थानीय रूप से और दूरस्थ रूप से, गिट इंटर्नल्स के ज्ञान के बिना।

मैं इसका उपयोग तब करता हूं जब एक सॉफ्टवेयर फिक्स में अंततः एक समस्या होती है और इसे अपडेट / पुनः जारी करने की आवश्यकता होती है।

git tag -d fix123                # delete the old local tag
git push github :fix123          # delete the old remote tag (use for each affected remote)
git tag fix123 790a621265        # create a new local tag
git push github fix123           # push new tag to remote    (use for each affected remote)

githubएक नमूना रिमोट नाम है, fix123एक नमूना टैग नाम है, और 790a621265एक नमूना प्रतिबद्ध है।


26

मैं इस आज्ञा का एक और रूप यहाँ छोड़ दूँगा जो मेरी आवश्यकताओं के अनुकूल है।
एक टैग था v0.0.1.2जिसे मैं स्थानांतरित करना चाहता था।

$ git tag -f v0.0.1.2 63eff6a

Updated tag 'v0.0.1.2' (was 8078562)

और तब:

$ git push --tags --force

अच्छा है, धन्यवाद, 2 सादे और सरल आदेश
Sérgio

10

एक अन्य तरीका:

रिमोट रेपो में टैग को स्थानांतरित करें (यदि आवश्यक हो तो हेड को किसी अन्य के साथ बदलें।)

$ git push --force origin HEAD:refs/tags/v0.0.1.2

लश बदल जाता है।

$ git fetch --tags

यह अन्य उत्तरों की तुलना में अधिक "ट्रांसेक्शनल" है।
जस्टिन एम। कीज़

9

उपनाम एक टैग को एक अलग प्रतिबद्ध में स्थानांतरित करने के लिए।

अपने नमूने में, हैश e2ea1639 के साथ कमिट करने के लिए git tagm v0.1 e2ea1639:।

पुश किए गए टैग के लिए, का उपयोग करें git tagmp v0.1 e2ea1639

दोनों अन्य नाम आपको मूल तारीख और संदेश देते हैं। यदि आप उपयोग करते हैं git tag -dतो आपने अपना मूल संदेश खो दिया है।

उन्हें अपनी .gitconfigफ़ाइल पर सहेजें

# Return date of tag. (To use in another alias)
tag-date = "!git show $1 | awk '{ if ($1 == \"Date:\") { print substr($0, index($0,$3)) }}' | tail -2 | head -1 #"

# Show tag message
tag-message = "!git show $1 | awk -v capture=0 '{ if(capture) message=message\"\\n\"$0}; BEGIN {message=\"\"}; { if ($1 == \"Date:\" && length(message)==0 ) {capture=1}; if ($1 == \"commit\" ) {capture=0}  }; END { print message }' | sed '$ d' | cat -s #"

### Move tag. Use: git tagm <tagname> <newcommit> 
tagm = "!GIT_TAG_MESSAGE=$(git tag-message $1) && GIT_COMMITTER_DATE=$(git tag-date $1) && git tag-message $1 && git tag -d $1 && git tag -a $1 $2 -m \"$GIT_TAG_MESSAGE\" #"

### Move pushed tag. Use: git tagmp <tagname> <newcommit> 
tagmp = "!git tagm $1 $2 && git push --delete origin $1 && git push origin $1 #"

1

यदि आप एक एनोटेट टैग को स्थानांतरित करना चाहते हैं, तो केवल लक्षित प्रतिबद्ध को बदलकर, एनोटेशन संदेश और अन्य मेटाडेटा उपयोग को संरक्षित करें:

moveTag() {
  local tagName=$1
  # Support passing branch/tag names (not just full commit hashes)
  local newTarget=$(git rev-parse $2^{commit})

  git cat-file -p refs/tags/$tagName | 
    sed "1 s/^object .*$/object $newTarget/g" | 
    git hash-object -w --stdin -t tag | 
    xargs -I {} git update-ref refs/tags/$tagName {}
}

उपयोग: MoveTag <टैग-टू-मूव> <लक्ष्य>

उपरोक्त समारोह तेरापैप / git-move-annotated-tag.sh को संदर्भित करके विकसित किया गया था ।


1
ऐसा लगता है कि इसकी अब आवश्यकता नहीं है: git tag -f -a my_tagपहले से ही एक पिछले संदेश (git संस्करण 2.11.0 के साथ) के संदेश को संरक्षित करता है।
मैथिज्स कूइजमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.