स्थानीय और दूरस्थ गिट रिपॉजिटरी दोनों के लिए मास्टर शाखा का नाम बदलें


820

मेरे पास शाखा है masterजो दूरस्थ शाखा को ट्रैक करती है origin/master

मैं उन्हें master-oldस्थानीय और रिमोट दोनों पर नाम बदलना चाहता हूं । क्या यह संभव है?

अन्य उपयोगकर्ताओं के लिए जिन्होंने ट्रैक किया origin/master(और जिन्होंने हमेशा अपनी स्थानीय masterशाखा को अपडेट किया है git pull), दूरस्थ शाखा का नाम बदलने के बाद क्या होगा?
क्या उनका git pullकाम अभी भी जारी रहेगा या यह एक त्रुटि है कि इसे origin/masterअब और नहीं मिल सकता है?

फिर, आगे, मैं एक नई masterशाखा (स्थानीय और दूरस्थ दोनों) बनाना चाहता हूं । फिर से, मैंने ऐसा करने के बाद, यदि अन्य उपयोगकर्ता करते हैं तो अब क्या होगा git pull?

मुझे लगता है कि यह सब बहुत परेशानी का कारण होगा। क्या मैं जो चाहता हूं उसे पाने का एक साफ तरीका है? या मैं बस के masterरूप में छोड़ देना चाहिए और एक नई शाखा बनाने के लिए master-newऔर बस वहाँ पर आगे काम?


2
स्वीकृत उत्तर में दिया गया नुस्खा किसी भी नाम की एक शाखा पर लागू होता है, लेकिन कैविट (जैसा कि उल्लेख किया गया है), Git में मास्टर शाखा की (डिफ़ॉल्ट रूप से) विशेष भूमिका के कारण नहीं है ।
kynan

3
@kynan: मुझे लगता है कि मुझे समझ नहीं आया। मास्टर और अन्य शाखाओं पर लागू न होने के लिए कौन-से कैविटी लागू होते हैं? यदि यह xy नाम की एक शाखा होगी और अन्य लोगों ने उस शाखा को ट्रैक किया है, तो यह कैसे भिन्न होगा?
अल्बर्ट

4
आप आमतौर पर दूरस्थ मास्टर को नहीं हटा सकते हैं। यह अरस्तू के उत्तर पर लागू नहीं होता, हालांकि, आप इसे स्वीकार किए गए उत्तर के रूप में चिह्नित करना चाहते हैं। आप सही हैं, कोई भी किसी भी दूरस्थ ट्रैकिंग शाखा git push -fकी क्षमता को प्रभावित करता है pull
कियान

आप एक नई शाखा बना सकते हैं master-oldजो पिछली masterशाखा की तरह ही प्रतिबद्ध हो । तो फिर तुम अधिलेखित कर सकते हैं masterएक करके अपने नए बदलाव के साथ शाखा mergeके साथ oursरणनीति। मर्ज करना तब काम करता है जब रिमोट गैर-फास्टफ़ॉर्म परिवर्तन की अनुमति नहीं देता है। इसका मतलब यह भी है कि अन्य उपयोगकर्ताओं को जबरन अपडेट नहीं करना होगा।
dnozay

1
@kynan masterकेवल तब तक विशेष है जब तक यह एकमात्र मौजूदा शाखा है। जैसे ही आपके पास एक से अधिक हैं, सभी शाखाएं एक समान पायदान पर हैं।
जुब्स।

जवाबों:


614

नाम बदलने के लिए निकटतम चीज़ हटा रहा है और फिर रिमोट पर फिर से बना रहा है। उदाहरण के लिए:

git branch -m master master-old
git push remote :master         # delete master
git push remote master-old      # create master-old on remote

git checkout -b master some-ref # create a new local master
git push remote master          # create master on remote

हालाँकि इसमें बहुत सी खामियाँ हैं। सबसे पहले, किसी भी मौजूदा चेकआउट को नाम बदलने के बारे में नहीं पता होगा - git शाखा का नाम बदलने का प्रयास नहीं करता है । यदि नया masterअभी तक मौजूद नहीं है, तो गिट पुल आउट एरर कर देगा। यदि नया masterबनाया गया है। खींचने masterऔर विलीन करने का प्रयास करेगा master-old। इसलिए यह आम तौर पर एक बुरा विचार है जब तक कि आप उन सभी का सहयोग नहीं लेते हैं जिन्होंने पहले भंडार को चेक किया है।

नोट: git के नए संस्करण आपको डिफ़ॉल्ट रूप से मास्टर शाखा को दूरस्थ रूप से हटाने की अनुमति नहीं देंगे। आप सेट करके ऐसा ओवरराइड कर सकते हैं receive.denyDeleteCurrentकरने के लिए विन्यास मूल्य warnया ignoreपर दूरदराज के भंडार। अन्यथा, यदि आप तुरंत एक नया मास्टर बनाने के लिए तैयार हैं, तो git push remote :masterचरण को छोड़ दें , और चरण --forceको पास करें git push remote master। ध्यान दें कि यदि आप रिमोट के कॉन्फ़िगरेशन को बदलने में सक्षम नहीं हैं, तो आप मास्टर शाखा को पूरी तरह से हटा नहीं पाएंगे!

यह चेतावनी केवल वर्तमान शाखा (आमतौर पर masterशाखा) पर लागू होती है ; किसी भी अन्य शाखा को हटाया जा सकता है और ऊपर के रूप में फिर से बनाया जा सकता है।


2
शाखाएँ केवल एक (नाम, हैश) जोड़ी हैं - अधिक कुछ नहीं, कुछ भी कम नहीं। शाखाओं पर रिफ्लग होता है, लेकिन यह कभी भी दूरस्थ ग्राहकों के सामने नहीं आता है।
21

122
मैं दूरस्थ पर मास्टर को हटाने से पहले दूरस्थ पर मास्टर-पुराना बनाऊंगा। मैं सिर्फ पागल हूं।
एडम डाइमिट्रुक 16

6
नीचे दिए गए अरस्तू के जवाब से आप इसे मास्टर को हटाए बिना कर सकते हैं, इसलिए मुझे लगता है कि बेहतर होगा।
क्ले ब्रिजेस

13
यह स्पष्ट और सुरक्षित होगा यदि आप उपयोग कर सकते हैं new-branch-nameऔर old-branch-nameइसके बजाय master/ master-old, इस प्रकार यह एक सामान्य समस्या है।
जैदर

2
यदि हटाए गए शाखा (यहां: मास्टर) को अन्य शाखाओं द्वारा संदर्भित नहीं किया जाता है, तो git कचरा उस पर सभी कमानों को इकट्ठा कर सकता है ... अच्छी तरह से ... "शाखा"। - कुछ गिट पोर्सिलेन कमांड एक कचरा संग्रह को ट्रिगर करते हैं। - इसलिए पहले नया नाम बनाएं (उसी कमिट की ओर इशारा करते हुए), फिर पुराना नाम हटाएं।
रॉबर्ट सिएमर

257

वर्तमान में आप मान रहे हैं master:

git push origin master:master-old        # 1
git branch master-old origin/master-old  # 2
git reset --hard $new_master_commit      # 3
git push -f origin                       # 4
  1. पहले स्थानीय भंडार में प्रतिबद्ध के आधार पर भंडार master-oldमें एक शाखा बनाएं ।originmaster
  2. इस नई शाखा के लिए एक नई स्थानीय शाखा बनाएँ origin/master-old(जो स्वचालित रूप से ट्रैकिंग शाखा के रूप में ठीक से स्थापित हो जाएगी)।
  3. अब अपने स्थानीय masterको इंगित करें कि आप जो भी करना चाहते हैं वह इंगित करना चाहता है।
  4. अंत में, अपने नए स्थानीय को प्रतिबिंबित करने के masterलिए originभंडार में बल-परिवर्तन master

(यदि आप इसे किसी अन्य तरीके से करते हैं, तो आपको यह सुनिश्चित करने के लिए कम से कम एक और कदम की आवश्यकता है कि master-oldइसे ठीक से ट्रैक करने के लिए सेट किया गया है origin/master-old। इस लेखन के समय पोस्ट किए गए अन्य समाधानों में से कोई भी शामिल नहीं है।)


11
यह "उत्तर" की तुलना में बेहतर उत्तर है, मैं सहमत हूं, लेकिन जो लोग यहां आए थे उनके लिए सिर्फ एक शाखा का नाम बदलना (स्पष्ट रूप से मास्टर नहीं), तीसरा चरण बहुत मायने नहीं रखता है।
knocte

यह जवाब के लिए बिल्कुल कोई फर्क नहीं पड़ता है कि आप masterकिसी अन्य शाखा में हैं या नहीं। सवाल बुरी तरह हालांकि शीर्षक था, यह तुलना में अधिक जटिल एक काम के बारे में पूछता है तो बस एक शाखा का नाम बदलने।
अरस्तू पगलतज़िस

3
यह मेरे लिए काम करने वाला समाधान निकला। मैं एक और शाखा के साथ मास्टर को बदलने की कोशिश कर रहा था। मैंने चरण 3 के लिए $ new_master_commit प्राप्त करने के लिए एक git लॉग -1 मूल / what_i_want_as_new_master किया था। पुश (चरण 4) के बाद, अन्य देवता खींचेंगे और संदेश प्राप्त करेंगे "आपकी शाखा मास्टर द्वारा 295 हिट्स से आगे है।" इसे ठीक करने के लिए मैंने एक ईमेल भेजा, जिससे उन्हें प्रत्येक रन के बारे में पता चल गया: git पुल; git checkout some_random_branch; गिट शाखा -D मास्टर; गिट पुल; गिट चेकआउट मास्टर; असल में, उन्हें अपने स्थानीय मास्टर को हटाने और नए संस्करण को खींचने की आवश्यकता है अन्यथा वे स्थानीय रूप से गलत स्थान पर हैं।
nairbv

आप ऐसा अधिक आसानी से कर सकते हैं: यह मानते हुए कि वे पहले से ही हैं, masterतब वे git fetch && git reset --hard origin/masterअपने स्थानीय masterको उसी के समान होने के लिए मजबूर कर सकते हैं origin। मैंने इसे प्रलेखित किया है, साथ ही और अधिक जटिल मामला है जहाँ आपके पास स्थानीय कमिट्स हैं masterजो आप ऊपर रखना चाहते हैं, stackoverflow.com/q/4084868 में
अरस्तू पगलतज़िस

सुनिश्चित करें कि दूरस्थ कॉन्फ़िगरेशन फ़ाइल में "denyNonFastforwards = false" है या आपको "रिमोट: त्रुटि: गैर-फास्ट-फ़ॉरवर्ड रीफ़्स / हेड्स / मास्टर (आपको पहले खींचना चाहिए)" से
इनकार करना होगा

159

Git v1.7 के साथ, मुझे लगता है कि यह थोड़ा बदल गया है। अपनी स्थानीय शाखा के नए रिमोट पर नज़र रखने के संदर्भ को अपडेट करना अब बहुत आसान है।

git branch -m old_branch new_branch         # Rename branch locally    
git push origin :old_branch                 # Delete the old branch    
git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote

10
एक विकल्प --set-upstreamइस प्रकार है: एक बार जब आपकी शाखा स्थानीय रूप से बदल दी जाती है और मूल पर हटा दी जाती है, तो बस करें: git push -u --all
आकर्षक

4
यह मास्टर शाखा के साथ काम नहीं करेगा, क्योंकि git आपको दूरस्थ मास्टर को हटाने की अनुमति नहीं देगा।
एलेक्जेंड्रे नेटो

4
@AlexandreNeto इस मामले में आप 2 डी से पहले तीसरी लाइन को निष्पादित कर सकते हैं, डिफ़ॉल्ट शाखा को सेट कर सकते हैं new_branchऔर फिर अंततः master2 लाइन के साथ रिमोट को हटा सकते हैं ।
ट्रिस्टन जहीर

3
आश्चर्यजनक सरल कदम। इस सवाल का सबसे अच्छा जवाब है
सिद्धार्थ

13
दूरस्थ शाखा को हटाने के लिए git push origin --delete old_branchथोड़ा अधिक पठनीय है।
थॉमस

35
git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name

आपको new-branch-nameहटाने से पहले मैन्युअल रूप से स्विच करना पड़ सकता हैold-branch-name


क्या इस समाधान का कोई हिस्सा स्थानीय पुरानी-शाखा-नाम को हटा देता है, या क्या वह एक सर्पोट अभ्यास है?
ग्रीनएजजडे

4
मुझे लगता है कि अंत में git branch -d old-branch-nameस्थानीय पुरानी शाखा को हटाने के लिए चलाया जाना चाहिए ।
नबी काज

आप केवल एक आदेश द्वारा परिवर्तनों को आगे बढ़ा सकते हैं git push remote-name new-branch-name :old-branch-name:।
सिगोड

इस तरह से आप गिट इतिहास को जटिल नहीं करेंगे? क्योंकि आप केवल वर्तमान का नाम बदलने के बजाय एक नई शाखा खोल रहे हैं।
androidevil

1
gand में @androider No. शाखाएँ एक साधारण संदर्भ है
सिगोड

29

शाखा का नाम बदलने के कई तरीके हैं, लेकिन मैं बड़ी समस्या पर ध्यान केंद्रित करने जा रहा हूं: "कैसे ग्राहकों को तेजी से आगे बढ़ने की अनुमति दी जाए और स्थानीय रूप से अपनी शाखाओं के साथ गड़बड़ न करें"

पहली त्वरित तस्वीर: मास्टर शाखा का नाम बदलने और ग्राहकों को तेजी से आगे बढ़ने की अनुमति देता है

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

शाखा का नाम बदलना:

# rename the branch "master" to "master-old"
# this works even if you are on branch "master"
git branch -m master master-old

नई "मास्टर" शाखा बनाना:

# create master from new starting point
git branch master <new-master-start-point>

माता-पिता-बच्चे के इतिहास के लिए एक मर्ज कमिट बनाना:

# now we've got to fix the new branch...
git checkout master

# ... by doing a merge commit that obsoletes
# "master-old" hence the "ours" strategy.
git merge -s ours master-old

और वोइला।

git push origin master

यह काम करता है क्योंकि एक mergeप्रतिबद्ध बनाने से शाखा को नए संशोधन में तेजी से अग्रेषित करने की अनुमति मिलती है ।

एक समझदार मर्ज कमिट मैसेज का उपयोग करना:

renamed branch "master" to "master-old" and use commit ba2f9cc as new "master"
-- this is done by doing a merge commit with "ours" strategy which obsoletes
   the branch.

these are the steps I did:

git branch -m master master-old
git branch master ba2f9cc
git checkout master
git merge -s ours master-old

3
धन्यवाद! git merge -s ours master-oldएक महत्वपूर्ण टुकड़ा है कि अन्य जवाब याद आती है। इसके अलावा, "करने में आसान" का मतलब "समझने में आसान, या पता लगाना" नहीं है, जो कि बहुत परिहास के साथ लगता है, लेकिन मैं पचाता हूं।
मार्टिन विडनर

3
मैं इस तथ्य से प्यार करता हूं कि किसी भी विलोपन का उल्लेख नहीं किया गया है और यह कि अपस्ट्रीम के क्लोन के साथ काम करने वालों के लिए संक्रमण "सहज" है। धन्यवाद!
पियोट्रेक

12

मैं मान रहा हूँ कि आप अभी भी उसी स्थिति के बारे में पूछ रहे हैं जैसे आपके पिछले प्रश्न में । यही है, मास्टर-नए में अपने इतिहास में मास्टर-पुराना नहीं होगा। * यदि आप मास्टर-नए "मास्टर" कहते हैं, तो आप प्रभावी रूप से इतिहास को फिर से लिखेंगे। इससे कोई फर्क नहीं पड़ता है कि आप किस तरह से एक ऐसी स्थिति में पहुंच जाते हैं, जिसमें मास्टर, मास्टर की पिछली स्थिति का वंशज नहीं है, बस यह है कि यह उस राज्य में है।

अन्य उपयोगकर्ता जो मास्टर के मौजूद नहीं होने का प्रयास करते हैं, बस उनकी खींचतान विफल हो जाएगी (रिमोट पर ऐसा कोई रेफरी नहीं), और एक बार फिर से एक नई जगह पर मौजूद होने के बाद, उनके खींचने वाले को अपने मास्टर को नए रिमोट मास्टर के साथ मिलाने का प्रयास करना होगा, जैसे कि आपने अपनी रिपॉजिटरी में मास्टर-पुराने और मास्टर-न्यू को मिला दिया हो। यह देखते हुए कि आप यहां क्या करने की कोशिश कर रहे हैं, मर्ज का टकराव होगा। (यदि उन्हें हल किया गया था, और परिणाम को रिपॉजिटरी में वापस धकेल दिया गया, तो आप और भी बदतर स्थिति में होंगे - इतिहास के दोनों संस्करण।)

बस अपने प्रश्न का उत्तर देने के लिए: आपको स्वीकार करना चाहिए कि कभी-कभी आपके इतिहास में गलतियाँ होंगी। यह ठीक हैं। यह सभी के लिए होता है। Git.it रिपॉजिटरी में उलटे कमिट हैं। महत्वपूर्ण बात यह है कि एक बार जब हम इतिहास को प्रकाशित करते हैं, तो यह कुछ ऐसा है जिस पर हर कोई भरोसा कर सकता है।

* यदि ऐसा किया जाता है, तो यह मास्टर पर कुछ बदलावों को आगे बढ़ाने और फिर एक नई शाखा बनाने के बराबर होगा, जहां यह हुआ करता था। कोई दिक्कत नहीं है।


हाँ, यह एक ही समस्या है, बस एक विचार था कि इसे कैसे हल किया जाए। लेकिन भले ही मैं इस शाखा का नाम बदलकर नहीं करूंगा, अगर यह संभव होगा तो मैं दिलचस्प था। मुझे लगा कि इस तरह के रेफरी "मास्टर" केवल विशिष्ट कमिट के संदर्भ हैं। मैं वास्तव में किसी भी इतिहास को बदलना नहीं चाहता। मुझे लगा कि मैं सिर्फ मास्टर-रेफरेंस को दूसरे सिर पर इंगित करूंगा। इसका मतलब यह भी है, मैं कभी भी शाखा के नाम का उपयोग नहीं कर सकता हूं अगर मैंने पहले कभी इसका इस्तेमाल किया है?
अल्बर्ट

वास्तव में, शाखाएँ रेफरी हैं - संकेत करने के लिए संकेत। बात यह है, हम एक शाखा के प्रमुख से एक विशेष तरीके से विकसित होने की उम्मीद करते हैं (अर्थात्, हमेशा तेजी से अग्रेषण)। किसी और के दृष्टिकोण से, अपने सार्वजनिक रिपो में एक शाखा को स्थानांतरित करना शाखा के इतिहास को फिर से लिखने के समान है। यह अब एक कमिट की ओर इशारा नहीं करता है जिसमें वह सब कुछ है जो इसका उपयोग करता था।
कैसबेल

8

चयनित जवाब में विफल रहा है जब मैं इसे करने की कोशिश। यह एक त्रुटि फेंकता है refusing to delete the current branch: refs/heads/master:। मुझे लगता है मैं पोस्ट करूँगा कि मेरे लिए क्या काम करता है:

git checkout master             # if not in master already

git branch placeholder          # create placeholder branch
git checkout placeholder        # checkout to placeholder
git push remote placeholder     # push placeholder to remote repository

git branch -d master            # remove master in local repository
git push remote :master         # remove master from remote repository.

रिमोट रिपॉजिटरी में धकेलने से ठीक पहले प्लेसहोल्डर को चेकआउट करना है। बाकी स्व व्याख्यात्मक है, मास्टर शाखा को हटाने और इसे दूरस्थ रिपॉजिटरी में धकेलना चाहिए जो अब काम करता है। यहां से उत्खनन किया गया


यह git पुश रिमोट पर फेल हो जाएगा: मास्टर अगर इसे रिमोट साइड पर चेक किया जाता है - तो आपको "रिमोट: एरर:" दिखाई देगा।
रफालमग

2

अच्छा। मेरे 2 सेंट। कैसे सर्वर पर लॉगगिन के बारे में, गिट डायरेक्टरी में जा कर और नंगे रिपॉजिटरी में शाखा का नाम बदलकर। इससे एक ही शाखा को फिर से लोड करने से जुड़ी सभी समस्याएं नहीं होती हैं। दरअसल, 'क्लाइंट्स' स्वचालित रूप से संशोधित नाम को पहचान लेंगे और उनके दूरस्थ संदर्भ को बदल देंगे। बाद में (या पहले) आप शाखा के स्थानीय नाम को भी संशोधित कर सकते हैं।


8
मैं गितुब सर्वर पर लॉग इन करने के लिए क्रेडेंशियल्स भूल गया हूं। बाहर वहाँ :-P पहचान के साथ किसी को
lennybacon डैनियल फिशर

1

व्हाट अबाउट:

git checkout old-branch-name
git push remote-name new-branch-name
git push remote-name :old-branch-name
git branch -m new-branch-name

शाखा ट्रैकिंग के साथ खिलवाड़ - उपयोगकर्ताओं को अपनी शाखा को स्थानीय स्तर पर ठीक करना पड़ सकता है?
dnozay

1

यह सबसे सरल और सबसे 'पठनीय' तरीका है जिसके बारे में मुझे पता है:

'मूव' स्थानीय शाखा का उपयोग कर -m

git branch -m my_old_branch_name my_new_branch_name

रिमोट से 'स्थानांतरित' शाखा को पुश करें, -u का उपयोग करके 'अपस्ट्रीम' सेट करें

git push origin -u my_new_branch_name

('अपस्ट्रीम' को अनिवार्य रूप से सेट करना 'आपकी लोकल ब्रांच को रिमोट से जोड़ता है, ताकि काम, पुल और पुश' जैसी चीजें काम करेंगी)

पुरानी शाखा को रिमोट से हटाएं

git push origin -D <old_name>

(आपकी स्थानीय शाखा पहले ही चली गई है, क्योंकि आपने इसे 1 चरण में स्थानांतरित किया है)


1

ठीक है , स्थानीय और रिमोट दोनों पर एक शाखा का नाम बदलना बहुत आसान है! ...

यदि आप शाखा पर हैं, तो आप आसानी से कर सकते हैं:

git branch -m <branch>

या नहीं, तो आपको करने की आवश्यकता है:

git branch -m <your_old_branch> <your_new_branch>

फिर, इस तरह रिमोट को डिलीट करें:

git push origin <your_old_branch>

अब आपने किया, यदि आप धक्का देने की कोशिश करते समय अपस्ट्रीम त्रुटि करते हैं, तो बस यह करें:

git push --set-upstream origin <your_new_branch>

मैं वास्तविक कमांड लाइन में कदम दिखाने के लिए नीचे की छवि भी बनाता हूं, बस चरणों का पालन करें और आप अच्छे होंगे:

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


0

आप निम्न कार्य कर सकते हैं:

git -m master master-old #rename current master
git checkout -b master   #create a new branch master
git push -f origin master #force push to master

लेकिन जोर जबरदस्ती एक बुरा विचार है अगर अन्य लोग इस भंडार को साझा कर रहे हैं। फोर्स पुश उनके संशोधन इतिहास को नए के साथ संघर्ष का कारण बनेगा।


0

निम्नलिखित कार्य करने के लिए शेल स्क्रिप्ट में सहेजा जा सकता है:

उदाहरण के लिए:

remote="origin"

if [ "$#" -eq 0 ] # if there are no arguments, just quit
then
    echo "Usage: $0 oldName newName or $0 newName" >&2
    exit 1
elif
    [ "$#" -eq 1 ] # if only one argument is given, rename current branch
then 
    oldBranchName="$(git branch | grep \* | cut -d ' ' -f2)" #save current branch name
    newBranchName=$1
else
    oldBranchName=$1
    newBranchName=$2
fi

git branch -m $oldBranchName $newBranchName

git push $remote :$oldBranchName #delete old branch on remote
git push --set-upstream $remote $newBranchName # add new branch name on remote and track it

कृपया ध्यान दें कि यहां डिफ़ॉल्ट रिमोट नाम "मूल" हार्ड-कोडेड है, यदि आप कॉन्फ़िगर करने योग्य बनाने के लिए स्क्रिप्ट का विस्तार कर सकते हैं!

फिर इस स्क्रिप्ट का उपयोग बैश उपनाम, गिट एलियाज़ या में, उदाहरण के लिए, सॉर्सेट्री कस्टम क्रियाओं के साथ किया जा सकता है।


-1

मेरा मानना ​​है कि कुंजी वह अहसास है जिसे आप दोहरा नाम दे रहे हैं : masterटू master-oldएंड master-newटू भी master

अन्य सभी उत्तरों से मैंने इसे संश्लेषित किया है:

doublerename master-new master master-old

जहां हमें पहले doublerenameबैश फ़ंक्शन को परिभाषित करना होगा:

# doublerename NEW CURRENT OLD
#   - arguments are branch names
#   - see COMMIT_MESSAGE below
#   - the result is pushed to origin, with upstream tracking info updated
doublerename() {
  local NEW=$1
  local CUR=$2
  local OLD=$3
  local COMMIT_MESSAGE="Double rename: $NEW -> $CUR -> $OLD.

This commit replaces the contents of '$CUR' with the contents of '$NEW'.
The old contents of '$CUR' now lives in '$OLD'.
The name '$NEW' will be deleted.

This way the public history of '$CUR' is not rewritten and clients do not have
to perform a Rebase Recovery.
"

  git branch --move $CUR $OLD
  git branch --move $NEW $CUR

  git checkout $CUR
  git merge -s ours $OLD -m $COMMIT_MESSAGE

  git push --set-upstream --atomic origin $OLD $CUR :$NEW
}

यह एक इतिहास-परिवर्तन के समान git rebaseहै जिसमें शाखा सामग्री काफी भिन्न है, लेकिन यह इस बात में भिन्न है कि ग्राहक अभी भी सुरक्षित रूप से तेजी से आगे बढ़ सकते हैं git pull master


-5
git update-ref newref oldref
git update-ref -d oldref newref

2
यह मेरे लिए काम करने के लिए प्रतीत नहीं होता, मुझे लगता है: git update-ref trunk trunk2 घातक: trunk2: not a valid SHA1
Gregg Lind
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.