Git, एक प्रतिबद्ध करने के लिए मूल / मास्टर कैसे रीसेट करें?


245

मैं अपने स्थानीय गुरु को इस आज्ञा से वचनबद्ध करता हूं:

git reset --hard e3f1e37

जब मैं $ git statusकमांड दर्ज करता हूं , टर्मिनल कहता है:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

चूंकि मैं मूल / हेडर को भी रीसेट करना चाहता हूं, इसलिए मैं मूल / मास्टर को चेकआउट करता हूं:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

और इस कमांड द्वारा हेडर को रीसेट करें:

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

फिर मैंने मूल / शीर्षलेख के लिए प्रतिबद्ध जोड़ने की कोशिश की कि मैं सफल नहीं था।

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

अंत में, मैं अपने स्थानीय मास्टर को चेकआउट करता हूं।

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

चूंकि, मैं मूल / मास्टर के सिर को रीसेट करता हूं, मुझे उम्मीद है कि स्थानीय और मूल एक ही दिशा में होना चाहिए, लेकिन जैसा कि आप देखते हैं, गिट कह रहा है कि मेरा स्थानीय / मास्टर 7 कमिट द्वारा मूल / मास्टर के पीछे है।

मैं इस समस्या को कैसे हल कर सकता हूं? जिन चीजों की मुझे तलाश है, वे स्थानीय / मास्टर और मूल / मास्टर बिंदु के प्रमुख हैं। निम्न छवि दिखाती है कि मैंने क्या किया। धन्यवाद।

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


सबसे पहले, सुनिश्चित करें कि आपको अपनी परियोजना पर एक संरक्षित शाखा को पुश कोड को लागू करने की अनुमति है, अन्यथा आप सक्षम नहीं होंगे ...
DarmVillegas

जवाबों:


563

origin/xxxशाखाएँ हमेशा दूर की ओर सूचक होती हैं। आप उन्हें बाहर की जाँच नहीं कर सकते क्योंकि वे आपके स्थानीय रिपॉजिटरी के पॉइंटर नहीं हैं (आप केवल कमिटमेंट चेक करते हैं। इसीलिए आप कमांड लाइन इंटरफेस ब्रांच मार्कर में लिखे गए नाम को केवल कमिट हैश नहीं देखेंगे)।

दूरस्थ को अद्यतन करने के लिए आपको अपने स्थानीय परिवर्तनों को मास्टर करने के लिए मजबूर करने के लिए क्या करना चाहिए:

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master

9
यह अनुरोधित ऑपरेशन करता है, लेकिन ध्यान रखें कि यह उन लोगों को नाखुश करेगा जिन्होंने पहले से ही मास्टर से कमिट खींच लिया था।
mnagel

मैंने इस कदम का पालन किया और यह पीछे हट गया। लेकिन मूल / हेड अब मास्टर के अलावा एक शाखा की ओर इशारा कर रहा है। मुझे इसे ठीक करने के लिए क्या करना चाहिए?
डेनियल श्वेलेव

1
आपको उत्पत्ति / HEAD के बारे में परवाह नहीं करनी चाहिए, बस मूल / रेफरी के लिए अच्छे रेफ को धक्का दें
साइमन बॉउड्री

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

1
काम नहीं करता है। remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

52

यहाँ पाए गए समाधान ने हमें पिछली कमिट में मास्टर को अपडेट करने में मदद की जो पहले ही धकेल दी गई थी:

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

स्वीकृत उत्तर से मुख्य अंतर प्रतिबद्ध हैश "e3f1e37:" पुश कमांड में मास्टर से पहले है।


1
काम नहीं करता है:remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

@ m0skit0 संदेश के रूप में you should pull first:)
सहज ज्ञान युक्त

इसका उत्तर stackoverflow.com/a/10544328/1019307 पर है - git config receive.denynonfastforwards falseलेकिन वास्तव में मैंने अपने स्थानीय git रिपॉजिटरी में मैन्युअल रूप से यह सेट किया है /opt/gitकि मैंने यहाँ विचारों के साथ खेलने के लिए बनाया है। मुझे यकीन नहीं है कि बिटकॉइन, जीथब इत्यादि के लिए यह कैसे या क्या हो सकता है ... और @intuitivepixel व्यर्थ है क्योंकि यह रिवर्स है जो आप हार्ड रीसेट के साथ हासिल करने की कोशिश कर रहे थे।
हांकका

हाय @jkovacs, मैं नहीं चाहता कि मास्टर में नए बदलाव निकाले जाएं। मैं बस मूल गुरु के लिए उस प्रतिबद्ध हैश "e3f1e37" को आगे बढ़ाना चाहता हूं। क्या यह 2 कमांड git रीसेट - "e3f1e37" को स्किप करने से संभव है?
करेनएने

हाय @jkovacs, मैंने अभी पुष्टि की है कि मैं दूसरा चरण छोड़ सकता हूं। :)
करेनएने

2

यह मानते हुए कि आपकी शाखा को masterयहाँ और दूरस्थ रूप से बुलाया जाता है , और यह कि आपका रिमोट originआपको कहा जाता है:

git reset --hard <commit-hash>
git push -f origin master

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


1

चूंकि मेरे पास एक समान स्थिति थी, मैंने सोचा कि मैं अपनी स्थिति साझा करूंगा और इन उत्तरों ने मेरी मदद कैसे की (सभी को धन्यवाद)।

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

एक देर रात, हार्डवेयर की विफलता या ईथर से बाहर अपनी प्रगति को खोने के डर से, मैंने मूल से मास्टर को धक्का देने का फैसला किया। बाद में मैं अपनी स्थानीय मास्टर शाखा में संशोधन करता रहा और जब मैंने तय किया कि यह फिर से धकेलने का समय है, तो मुझे विभिन्न मास्टर शाखाओं के साथ सामना करना पड़ा और मुझे पता चला कि मैं मूल / अपस्ट्रीम ( डुह! ) में संशोधन नहीं कर सकता हूं, जैसे मैं स्थानीय विकास शाखाएं कर सकता हूं।

इसलिए मैंने स्थानीय रूप से मास्टर चेकआउट नहीं किया क्योंकि मैं पहले से ही प्रतिबद्ध था। मास्टर अपरिवर्तित था। मुझे रीसेट करने की भी आवश्यकता नहीं थी - मेरी वर्तमान प्रतिबद्धता ठीक थी।

मैंने सिर्फ मूल को धक्का दिया, यह भी निर्दिष्ट किए बिना कि मैं इस मामले में मास्टर पर मजबूर करने के लिए क्या करना चाहता हूं क्योंकि यह जो कुछ भी है वह है। जाँच की गई git diff master..origin/masterतो कोई मतभेद नहीं थे और यह बात है। सब तय हो गया। धन्यवाद! (मुझे पता है, मैं एक नौसिखिया हूँ, कृपया क्षमा करें!)।

यदि आप पहले से ही स्थानीय रूप से अपनी मास्टर शाखा के साथ ठीक हैं, तो:

git push --force origin master
git diff master..origin/master
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.