मेरे पास ब्रांच master
जो दूरस्थ शाखा origin/master
ट्रैक करता है।
मैं उन दोनों को स्थानीय स्तर पर और रिमोट पर master-old
नाम से बदलना चाहता हूं। क्या यह संभव है? अन्य उपयोगकर्ताओं के लिए जिन्होंने origin/master
को ट्रैक किया (और जिन्होंने हमेशा अपनी स्थानीय master
शाखा git pull
माध्यम से अपडेट किया) के लिए, मेरे रिमोट ब्रान्टल का नाम बदल जाने के बाद क्या होगा? क्या उनके git pull
अभी भी काम git pull
लिए या यह एक त्रुटि है कि यह origin/master
अब नहीं मिल सकता है फेंक होगा?
फिर, आगे, मैं एक नया master
शाखा (दोनों स्थानीय और दूरस्थ) बनाना चाहता हूँ। फिर, यह करने के बाद, अब क्या होगा अगर अन्य उपयोगकर्ता git pull
?
मुझे लगता है कि यह सब बहुत मुश्किल में होगा क्या मैं चाहता हूँ पाने के लिए एक साफ तरीका है? या क्या मैं master
को छोड़ master
जैसा कि एक नया शाखा master-new
और सिर्फ आगे काम करता हो?
पुनर्नामित करने की सबसे करीबी बात को हटाने और फिर रिमोट पर पुन: निर्माण करना। उदाहरण के लिए:
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
अभी तक अस्तित्व में नहीं है, तो git पुल बाहर त्रुटि होगी। यदि नया master
बनाया गया है पुल master
और master-old
मर्ज करने का प्रयास करेगा इसलिए यह आमतौर पर एक बुरा विचार है जब तक आपके पास पहले से रिपॉजिटरी की जांच करने वाले सभी लोगों का सहयोग नहीं होता है।
नोट: जीआईटी के नए संस्करण आपको डिफ़ॉल्ट रूप से मास्टर शाखा को डिफॉल्ट रूप से हटाने की अनुमति नहीं देंगे। आप रिमोट रिपॉज़िटरी पर warn
या ignore
करने के लिए receive.denyDeleteCurrent
कॉन्फ़िगरेशन मान सेट करके इसे ओवरराइड कर सकते हैं। अन्यथा, यदि आप तुरंत एक नया मालिक बनाने के लिए तैयार हैं, तो git push remote :master
--force
git push remote :master
चरण, और पास- --force
को git push remote master
चरण में छोड़ दें। ध्यान दें कि यदि आप दूरस्थ के कॉन्फ़िगरेशन को बदलने में सक्षम नहीं हैं, तो आप मास्टर शाखा को पूरी तरह से हटा नहीं पाएंगे!
यह चेतावनी केवल वर्तमान शाखा (आमतौर पर 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
master
कमेट के आधार पर, origin
रिपॉजिटरी में master-old
शाखा बनाएं। origin/master-old
शाखा के लिए एक नई स्थानीय शाखा बनाएं (जो स्वचालित रूप से एक ट्रैकिंग शाखा के रूप में स्थापित हो जाएगी)। master
को जो भी कहा जाता है उसे इंगित करने के लिए इंगित करें master
को प्रतिबिंबित करने के लिए origin
रिपॉजिटरी में बल-परिवर्तन master
। (यदि आप इसे किसी भी अन्य तरीके से करते हैं, तो यह सुनिश्चित करने के लिए कम से कम एक और कदम की आवश्यकता है कि master-old
को origin/master-old
ट्रैक करने के लिए ठीक से स्थापित किया गया है। इस लेखन के समय में पोस्ट किए गए अन्य समाधानों में से कोई भी इसमें शामिल नहीं है )
गीट 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
git checkout -b new-branch-name git push remote-name new-branch-name :old-branch-name
old-branch-name
को हटाने से पहले आपको मैन्युअल रूप से new-branch-name
स्विच करना पड़ सकता है
शाखा का नाम बदलने के कई तरीके हैं, लेकिन मैं बड़ी समस्या पर ध्यान केंद्रित करने जा रहा हूं: "ग्राहकों को तेजी से अग्रेषित करने और स्थानीय रूप से अपनी शाखाओं के साथ गड़बड़ करने की अनुमति देने के तरीके" ।
सबसे पहले एक त्वरित तस्वीर:
यह वास्तव में करना आसान है; लेकिन इसका दुरुपयोग न करें। मर्ज पर पूरा विचार टकराता है; क्योंकि वे तेजी से अग्रेषित करते हैं, और दूसरे के साथ एक शाखा के लिंक इतिहास
# 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
मैं मान रहा हूँ कि आप अभी भी उसी स्थिति के बारे में पूछ रहे हैं जैसे आपके पिछले प्रश्न में अर्थात, मास्टर-नया में अपने इतिहास में मास्टर-पुराना शामिल नहीं होगा। * यदि आप मास्टर-नया "मास्टर" कहते हैं, तो आप प्रभावी ढंग से इतिहास को पुनः लिखेंगे। यह कोई फर्क नहीं पड़ता कि आप उस राज्य में कब आ जाते हैं, जिसमें स्वामी गुरु की पिछली स्थिति का वंशज नहीं है, बस उस राज्य में है।
मास्टर उपयोगकर्ताओं को खींचने का प्रयास करने वाले अन्य प्रयोक्ताओं के पास बस विफल रहता है (रिमोट पर ऐसा कोई भी रेफरल नहीं), और एक बार यह एक नई जगह पर फिर से आ जाता है, उनके पुल को अपने मालिक को नए रिमोट मास्टर के साथ मर्ज करने का प्रयास करना होगा, जैसे कि आप अपने रिपॉजिटरी में मास्टर-ओल्ड और मास्टर-न्यू को विलय करते हैं यह देखते हुए कि आप यहां क्या करने की कोशिश कर रहे हैं, मर्ज में संघर्ष होगा। (यदि वे हल हो गए थे, और परिणाम को रिपॉजिटरी में वापस धकेल दिया गया था, तो आप एक भी खराब स्थिति में होंगे – इतिहास के दोनों संस्करणों में।)
आपके प्रश्न का उत्तर केवल: आपको यह स्वीकार करना चाहिए कि कभी-कभी आपके इतिहास में गलती होगी यह ठीक हैं। यह सभी के लिए होता है Git.git रिपॉजिटरी में वापस लौट आए हैं। महत्वपूर्ण बात यह है कि एक बार हम इतिहास प्रकाशित करते हैं, ऐसा कुछ होता है जो हर कोई भरोसा कर सकता है।
* यदि ऐसा होता है, तो यह मास्टर पर कुछ बदलावों को प्रेरित करने के बराबर होगा, और फिर एक नई शाखा बना जहां वह इस्तेमाल करेगी। कोई बात नहीं।
चयनित उत्तर विफल हुआ जब मैंने इसे करने की कोशिश की यह एक त्रुटि फेंकता है: 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.
यह चाल प्लेसहोल्डर को रिमोट रेपॉजिटरी तक पहुंचने से पहले चेकआउट के लिए है शेष आत्मविवेकपूर्ण है, मास्टर शाखा को हटाने और उसे दूरस्थ रिपॉजिटरी में धक्का अब काम करना चाहिए। यहां से उद्धृत।
अच्छा। मेरा 2 सेंट कैसे सर्वर पर लॉग इन के बारे में, git डायरेक्टरी में जाकर शाखा को नंगे रिपॉजिटरी में नामित करें। इसमें एक ही शाखा को पुनः अपलोड करने से संबंधित सभी समस्याएं नहीं हैं I असल में, 'क्लाइंट' स्वचालित रूप से संशोधित नाम पहचानेंगे और उनके दूरस्थ संदर्भ को परिवर्तित करेंगे। इसके बाद (या इससे पहले) आप शाखा के स्थानीय नाम को भी संशोधित कर सकते हैं।
व्हाट अबाउट:
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 -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
लेकिन बल को बल देना एक बुरा विचार है यदि अन्य लोग इस भंडार को साझा कर रहे हैं। फोर्स पुश के कारण उनके पुनरीक्षण इतिहास का एक नया विवाद होगा।
मेरा मानना है कि कुंजी यह प्राप्ति है कि आप दोहरा नामों का प्रदर्शन कर रहे हैं: master-old
और master-new
।
अन्य सभी उत्तरों से मैंने इसे संश्लेषित किया है:
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
साथ सुरक्षित रूप से तेजी से आगे बढ़ सकते हैं।
git update-ref newref oldref git update-ref -d oldref newref