वर्तमान गिट शाखा को मास्टर शाखा बनाएं


1657

Git में मेरे पास एक भंडार है। मैंने एक शाखा बनाई, फिर गुरु और शाखा दोनों में कुछ बदलाव किए।

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

मैं इसे मर्ज नहीं कर सकता, क्योंकि मैं मास्टर पर बदलाव नहीं रखना चाहता। मुझे क्या करना चाहिए?

अतिरिक्त : इस मामले में, 'पुराने' मास्टर को पहले से ही pushएक अन्य रिपॉजिटरी जैसे कि GitHub में रखा गया है। यह चीजों को कैसे बदलता है?


2
इसी तरह के सवाल के जवाब की जांच करें stackoverflow.com/q/2862590/151641
mloskot

4
एक ही समस्या थी, हालांकि मैंने बस मास्टर को हटा दिया और एक और शाखा का नाम बदलकर मास्टर कर दिया: stackoverflow.com/a/14518201/189673
jayarjo

10
@ यारजो आपको संभवतः इससे बचना चाहिए क्योंकि यह इतिहास को फिर से लिख सकता है और बाकी सभी के लिए समस्या पैदा कर सकता है जब वे अगली बार मास्टर को खींचने की कोशिश करेंगे।
joelittlejohn

3
यही कारण है कि मुझे @ जेफ्रोमी का जवाब पसंद है। संग्रह के इतिहास का कोई भी पुनर्निर्माण नहीं हो रहा है।
फ्रॉग्गीइन्फ्रॉग

जवाबों:


2134

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

git checkout better_branch
git merge --strategy=ours master    # keep the content of this branch, but record a merge
git checkout master
git merge better_branch             # fast-forward master up to the merge

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

git merge --strategy=ours --no-commit master
git commit          # add information to the template merge message

25
"मर्ज़" स्ट्रेटेजीज़ के बारे में ध्यान दें: इससे --strategy=oursअलग है --strategy=recursive -Xours। यानी "हमारा" अपने आप में एक रणनीति हो सकती है (परिणाम वर्तमान शाखा से कोई फर्क नहीं पड़ता कि क्या होगा), या "पुनरावर्ती" रणनीति के लिए एक विकल्प के रूप में पारित किया (अन्य शाखा के परिवर्तन में लाएं, और स्वचालित रूप से एक संघर्ष होने पर वर्तमान शाखा के परिवर्तनों को प्राथमिकता दें) )।
केल्विन

5
मुझे काम करने के लिए दूसरी लाइन बनानी पड़ी git merge --strategy=ours master -m "new master"
गरमागरम

5
@ जोहसम यह वही है जो मेरे उत्तर का पहला वाक्य है। यदि आप ऐसा करते हैं, तो नए स्वामी का पुराने स्वामी के समान इतिहास नहीं होगा, जो कि यदि आप धक्का / खींचना चाहते हैं तो बहुत बुरा है। आपको सही तरीके से काम करने के लिए पूर्वजों को साझा करने की आवश्यकता है; यदि इसके बजाय आप वह कर रहे हैं जो आप कह रहे हैं, तो जब आप इसे धक्का देने की कोशिश करेंगे तो यह तब तक विफल रहेगा जब तक आप इसे बल नहीं देते (क्योंकि यह बुरा है और यह आपको रोकने की कोशिश कर रहा है), और यदि आप इसे बल देते हैं, तो कोई भी व्यक्ति जो बाद में खींचता है पुराने मास्टर और नए मास्टर को मिलाने का प्रयास करेगा, जो संभवतः एक ट्रेन का मलबे होगा।
कास्कैबेल

4
यदि विलय के दौरान vi संपादक प्रकट होता है, तो टाइप करें: w (बचत के लिए): q (vi से बाहर निकलने के लिए)
टॉमस क्यूब्स

9
यह जवाब बहुत अच्छा काम करता है। मैं सिर्फ उन लोगों के लिए जोड़ना चाहता था (जो नए या अनिश्चित हो सकते हैं) कि आपको इसके git pushबाद एक अधिकार करना होगा यदि आप चाहते हैं कि आपका कोड रिमोट तक पहुंच जाए। आप एक चेतावनी देख सकते हैं जैसे Your branch is ahead of 'origin/master' by 50 commits.यह अपेक्षित है। बस इसे धक्का! : डी
चैपलजाइस

387

सुनिश्चित करें कि सब कुछ आपके दूरस्थ रिपॉजिटरी (GitHub) तक पहुंचा दिया गया है:

git checkout master

"Better_branch" के साथ "मास्टर" को अधिलेखित करें:

git reset --hard better_branch

अपने दूरस्थ रिपॉजिटरी के लिए पुश को बल दें:

git push -f origin master

81
यह शायद जवाब है जो ज्यादातर लोग ढूंढ रहे हैं। बीएस रणनीति विलय के साथ अन्य सभी उत्तर पूरी तरह से शाखा को प्रतिस्थापित नहीं करते हैं। यह सब कुछ वैसा ही बना था जैसा मैं चाहता था, बस शाखा को अधिलेखित करें और इसे बल दें।
Gubatron

31
हालाँकि यह वास्तव में बहुतों की तलाश में है, लेकिन यह ध्यान दिया जाना चाहिए कि रेपो की किसी भी अन्य स्थानीय प्रतियों को git reset --hard origin/masterअगली बार खींचने की आवश्यकता होगी , अन्यथा git उनके (अब) विचलन वाले स्थानीय परिवर्तनों को मर्ज करने का प्रयास करेगा। इसके खतरों को इस उत्तर
7yl4r

3
कृपया यह भी ध्यान दें कि आपको भंडार में धकेलने के लिए बाध्य करने की आवश्यकता है - उदाहरण के लिए एक व्यावसायिक वातावरण में यह काम नहीं करेगा
14

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

75

संपादित करें: आपने यह नहीं कहा कि आपने सार्वजनिक रेपो में धकेल दिया था! इससे फर्क पड़ता है।

दो तरीके हैं, "गंदा" रास्ता और "साफ" रास्ता। मान लीजिए कि आपकी शाखा का नाम रखा गया है new-master। यह साफ तरीका है:

git checkout new-master
git branch -m master old-master
git branch -m new-master master
# And don't do this part.  Just don't.  But if you want to...
# git branch -d --force old-master

यह कॉन्फ़िगर की गई फ़ाइलों को नामांकित शाखाओं से मिलान करने के लिए बदल देगा।

आप इसे गंदे तरीके से भी कर सकते हैं, जो कॉन्फिग फाइलों को अपडेट नहीं करेगा। इस तरह से ऊपर के हुड के नीचे चला जाता है ...

mv -i .git/refs/new-master .git/refs/master
git checkout master

2
धन्यवाद। एक और प्रश्न। मैं इसे जीथब करने पर जोर दे रहा हूं। अगर मैं ऐसा करता हूं तो वहां क्या होगा?
कारेल बिलेक

3
@ कैरेल: यह अन्य उपयोगकर्ताओं के लिए थोड़ी गड़बड़ पैदा करेगा; उन्हें अपने मास्टर को जिथब मास्टर में रीसेट करना होगा। यदि आप उन्हें किसी भी परेशानी के कारण से बचना चाहते हैं, तो मेरे उत्तर पर एक नज़र डालें।
कैस्केबेल

6
@ डिट्रिक एप: मुझे यकीन नहीं है कि अगर यह एक अच्छा विचार है तो गंदे तरीके से भी सुझाव दें। यह रिमोट ट्रैकिंग में गड़बड़ी करने जा रहा है, रिफॉल्स ... किसी भी कारण के बारे में सोच भी नहीं सकते जो आप कभी करेंगे।
कैस्केबेल

2
आह, यह एक अच्छी बात है। आपके पास यह दोनों तरीके हो सकते हैं, हालांकि git branch old-master master; git branch -f master new-master:। बैकअप शाखा को नए सिरे से बनाएं, फिर सीधे मास्टर को नए-मास्टर में स्थानांतरित करें। (और अपना नाम याद करने के लिए खेद है, बस उस पर ध्यान दिया गया है)
Cascabel

2
@FakeName मैंने निष्कर्ष निकाला कि ऐसा करने का कोई कारण नहीं था, बस यह कि इसे गंदे तरीके से करने का कोई कारण नहीं है । आप इसे सामान्य आदेशों (मेरी पिछली टिप्पणी के अनुसार) का उपयोग कर सकते हैं और समान परिणाम प्राप्त कर सकते हैं, केवल रिफ्लक्स के अलावा और चीजों को काटने का कोई मौका नहीं। और यह काम करने की गारंटी है, क्योंकि आप कार्यान्वयन विवरण के साथ काम नहीं कर रहे हैं।
Cascabel

46

masterद्वारा शाखा का नाम बदलें :

git branch -M branch_name master

11
दुर्भाग्य से git ब्रांच रेनैमिंग को ट्रैक नहीं करता है, इसलिए यदि आपने पहले ही अपने रेपो को रिमोट से धकेल दिया है और अन्य लोगों ने अपनी स्थानीय पुरानी मास्टर ब्रांच में स्थानीय परिवर्तन किए हैं, तो वे परेशानी में पड़ जाएंगे।
13

क्या इस और इसमें कोई अंतर है git checkout master&&git reset --hard better_branch?
वातानी

26

जो मैं समझता हूं, आप वर्तमान शाखा को मौजूदा शाखा में डाल सकते हैं। संक्षेप masterमें, वर्तमान शाखा में आपके पास जो कुछ भी है, उसके साथ यह अधिलेखित हो जाएगा :

git branch -f master HEAD

एक बार जब आप ऐसा कर लेते हैं, तो आप सामान्य रूप से अपनी स्थानीय masterशाखा को आगे बढ़ा सकते हैं , संभवतः यहाँ बल पैरामीटर की भी आवश्यकता होती है :

git push -f origin master

कोई मर्ज नहीं, कोई लंबी आज्ञा नहीं। बस branchऔर push- लेकिन, हाँ, यहmaster शाखा के इतिहास को फिर से लिखेगा, इसलिए यदि आप एक टीम में काम करते हैं तो आपको पता चल जाता है कि आप क्या कर रहे हैं।




वैकल्पिक रूप से, मैंने पाया कि आप किसी भी शाखा को किसी भी दूरस्थ शाखा में धकेल सकते हैं, इसलिए:

# This will force push the current branch to the remote master
git push -f origin HEAD:master

# Switch current branch to master
git checkout master

# Reset the local master branch to what's on the remote
git reset --hard origin/master

बहुत सरल और पूरी तरह से काम किया! Git कमांड को समझने के लिए दो सरल और आसान। मेरा गिट रेपो बच गया है और अब सुपर क्लीन दिखता है। धन्यवाद!
देलिक्स

15

मुझे वह उत्तर मिला जो मुझे ब्लॉग पोस्ट में चाहिए था , मास्टर शाखा को git में किसी अन्य शाखा से बदलें :

git checkout feature_branch
git merge -s ours --no-commit master
git commit      # Add a message regarding the replacement that you just did
git checkout master
git merge feature_branch

यह अनिवार्य रूप से कैसकैब के उत्तर के समान है । सिवाय इसके कि उसके विकल्प के नीचे जोड़ा गया "विकल्प" पहले से ही मेरे मुख्य कोड ब्लॉक में एम्बेडेड है।

इस तरह खोजना आसान है।

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

अन्यथा, मैं कर सकते हैं कॉपी-पेस्ट, तो उस पंक्ति को देखने के लिए नीचे विवरण पढ़ूं जिसे मुझे बदलना चाहिए था - जब मैं इसे पहले ही निष्पादित कर चुका हूं।


14

यहां दिए गए समाधान ('मास्टर' में शाखा का नाम बदलना) रिमोट (GitHub) के लिए परिणामों पर जोर नहीं देते हैं:

  • यदि आपने उस शाखा को बनाने के बाद से किसी चीज को धक्का नहीं दिया है, तो आप इसे नाम बदल सकते हैं और बिना किसी समस्या के इसे आगे बढ़ा सकते हैं।
  • अगर आपके पास GitHub पर पुश मास्टर था, तो आपको नई शाखा को 'git push -f' करने की आवश्यकता होगी: आप अब तेजी से आगे मोड में धक्का नहीं दे सकते
    -f
    --force

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

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


14

मुझे सबसे अच्छा काम करने का यह सरल तरीका मिला। यह इतिहास को फिर से नहीं लिखता है और शाखा के सभी पिछले चेक-इन को मास्टर को जोड़ा जाएगा। कुछ भी नहीं खोया है, और आप स्पष्ट रूप से देख सकते हैं कि कमिट लॉग में क्या ट्रांसपेर किया गया है।

उद्देश्य: "शाखा" की वर्तमान स्थिति को "मास्टर" बनाएं

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

git checkout master      # Set local repository to master
git reset --hard branch  # Force working tree and index to branch
git push origin master    # Update remote repository

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


10

कोई भी दूसरी शाखा की सभी फाइलों को मास्टर में चेकआउट कर सकता है:

git checkout master
git checkout better_branch -- .

और फिर सभी परिवर्तन करें।


5

जेफ्रोमी के जवाब में जोड़ने के लिए, यदि आप sourceशाखा के इतिहास में एक व्यर्थ मर्ज नहीं रखना चाहते हैं, तो आप मर्ज के लिए एक अस्थायी शाखा बना सकते हैं ours, फिर इसे फेंक दें:

git checkout <source>
git checkout -b temp            # temporary branch for merge
git merge -s ours <target>      # create merge commit with contents of <source>
git checkout <target>           # fast forward <target> to merge commit
git merge temp                  # ...
git branch -d temp              # throw temporary branch away

इस तरह मर्ज कमेटी केवल targetशाखा के इतिहास में ही मौजूद होगी ।

वैकल्पिक रूप से, यदि आप बिलकुल भी मर्ज नहीं बनाना चाहते हैं, तो आप बस sourceएक नई कमेटी के लिए इनकी सामग्री को ले सकते हैं और उनका उपयोग कर सकते हैं target:

git checkout <source>                          # fill index with contents of <source>
git symbolic-ref HEAD <target>                 # tell git we're committing on <target>
git commit -m "Setting contents to <source>"   # make an ordinary commit with the contents of <source>

3

मेरे लिए, मैं चाहता था कि आगे बढ़ने के बाद मैं अपने गुरु के पास वापस जाऊं।

विकसित होने पर:

git checkout master
git pull

git checkout develop
git pull

git reset --hard origin/master
git push -f

2

चीजों को करने का मेरा तरीका निम्नलिखित है

#Backup branch
git checkout -b master_backup
git push origin master_backup
git checkout master
#Hard Reset master branch to the last common commit
git reset --hard e8c8597
#Merge
git merge develop

2

यदि आप ग्रहण में ईगिट का उपयोग कर रहे हैं :

  • प्रोजेक्ट नोड पर राइट क्लिक करें।
  • टीम का चयन करें → फिर उन्नत → फिर शाखा का नाम बदलें
  • फिर रिमोट ट्रैकिंग फ़ोल्डर का विस्तार करें ।
  • गलत नाम के साथ शाखा चुनें, फिर नाम बदलें बटन पर क्लिक करें, जो भी नया नाम है उसका नाम बदलें।
  • नया मास्टर चुनें, फिर उसका नाम बदलकर मास्टर करें।

मैंने ऐसा किया है, लेकिन यह सुनिश्चित नहीं है कि यह काम करता है या नहीं। जीथब पर, कुछ भी नहीं बदला लेकिन गिट एक्सटेंशन पर मैं देख सकता हूं कि शाखा का नाम बदल दिया गया था।
प्रमोद

0

एटलसियन (बिटबकेट सर्वर) द्वारा संचालित गिट ब्राउजर में निम्न चरणों का पालन किया जाता है।

के रूप में {वर्तमान-शाखा} बनाना master

  1. एक शाखा बनाएं masterऔर इसे "मास्टर-डुप्लिकेट" नाम दें।
  2. {करंट-ब्रांच} से एक ब्रांच बनाएं और इसे “{करंट-ब्रांच} -कोपी” नाम दें।
  3. रिपॉजिटरी सेटिंग (बिटबकेट) में "मास्टर-डुप्लिकेट" को इंगित करने के लिए "डिफ़ॉल्ट शाखा" को बदलें (इस चरण के बिना, आप मास्टर को हटाने में सक्षम नहीं होंगे - "अगले चरण में")।
  4. "मास्टर" शाखा को हटाएं - मैंने यह स्रोत पेड़ से किया था (आप इसे CLI या Git ब्राउज़र से कर सकते हैं)
  5. "{करंट-ब्रांच}" को "मास्टर" में बदलें और रिपॉजिटरी पर धकेलें (यह एक नई "मास्टर" ब्रांच बना देगा "{करंट-ब्रांच}" मौजूद रहेगा)।
  6. रिपॉजिटरी सेटिंग्स में, "मास्टर" को इंगित करने के लिए "डिफ़ॉल्ट शाखा" बदलें।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.