git - स्थानीय और दूरस्थ गिट भंडार दोनों के लिए मास्टर शाखा का नाम बदलें




git-branch (10)

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

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

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

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


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


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

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

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


जब मैंने कोशिश की तो चयनित उत्तर विफल रहा। यह एक त्रुटि फेंकता है: 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.

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


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

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

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

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

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


मान लीजिए कि आप वर्तमान में 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 प्रतिबद्धता के आधार पर सबसे पहले origin भंडार में master-old शाखा बनाएं।
  2. इस नई origin/master-old शाखा के लिए एक नई स्थानीय शाखा बनाएं (जो स्वचालित रूप से ट्रैकिंग शाखा के रूप में ठीक से स्थापित हो जाएगी)।
  3. अब अपने स्थानीय master को जो कुछ भी आप चाहते हैं उसे इंगित करने के लिए इंगित करें।
  4. अंत में, अपने नए स्थानीय master को प्रतिबिंबित करने के लिए origin भंडार में बल-परिवर्तन master

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


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

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

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

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


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

-एम का उपयोग कर स्थानीय शाखा 'ले जाएं'

git branch -m my_old_branch_name my_new_branch_name

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

git push origin -u my_new_branch_name

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

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

git push origin -D <old_name>

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


व्हाट अबाउट:

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

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

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

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>

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


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

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







git-branch