Git रीसेट - वॉर और रिमोट रिपॉजिटरी पर पुश करें


199

मेरे पास एक रिपॉजिटरी थी जो इस पर कुछ बुरा काम करती थी (इस उदाहरण के लिए डी, ई और एफ)।

ABCDEF मास्टर और मूल / मास्टर

मैंने स्थानीय भंडार को विशेष रूप से संशोधित किया है git reset --hard। मैंने रीसेट से पहले एक शाखा ली थी इसलिए अब मेरे पास एक रेपो है जो दिखता है:

A-B-C master  
     \ D-E-F old_master

A-B-C-D-E-F origin/master

अब मुझे उन बुरे कमिटों के कुछ हिस्सों की आवश्यकता थी इसलिए मैंने चेरी को अपनी ज़रूरत के अनुसार बिट्स को उठाया और कुछ नए कमिट किए ताकि अब मेरे पास निम्न स्तर हैं:

A-B-C-G-H master
     \ D-E-F old_master

अब मैं इस स्थिति को दूरस्थ रेपो तक पहुंचाना चाहता हूं। हालाँकि, जब मैं एक git pushजीआईटी करने की कोशिश करता हूं तो विनम्रता से मुझे ब्रश बंद कर देता है:

$ git push origin +master:master --force  
Total 0 (delta 0), reused 0 (delta 0)  
error: denying non-fast forward refs/heads/master (you should pull first)  
To git@git.example.com:myrepo.git  
! [remote rejected] master -> master (non-fast forward)  
error: failed to push some refs to 'git@git.example.com:myrepo.git'  

स्थानीय रेपो की वर्तमान स्थिति को लेने के लिए मुझे रिमोट रेपो कैसे मिलेगा?


2
"एक 'लगभग' कई का डुप्लिकेट है" मैं संशोधित इतिहास के प्रश्नों को कैसे बढ़ाऊं ", उदाहरण के लिए यहां देखें stackoverflow.com/questions/253055/…
CB Bailey

2
यह सच है और मैंने पोस्ट करने से पहले एक उत्तर के लिए StackOverflow की खोज की थी। हालाँकि मेरी खोज ने केवल उन सवालों के जवाब दिए जिनमें एक धक्का-मुक्की ने इस मुद्दे को सुलझा दिया। आपकी पोस्ट को लिंक करने के लिए धन्यवाद :)
robertpostill

2
आप जल्द ही (git1.8.5, Q4 2013) अधिक सावधानी से करgit push -force पाएंगे ।
वॉन सीपीसी

जवाबों:


286

एक धक्का मजबूर कर मदद नहीं करता, तो ( " git push --force origin" या " git push --force origin master" पर्याप्त होना चाहिए), इसका मतलब यह हो सकता है कि दूरदराज के सर्वर के माध्यम से या तो गैर तेजी से आगे धक्का इंकार कर रहा है receive.denyNonFastForwards चर विन्यास (देखें Git config विवरण के लिए मैनपेज), या अद्यतन के माध्यम से / पूर्व प्राप्त हुक।

पुराने Git के साथ आप " git push origin :master" (शाखा नाम से पहले:) को हटाकर और फिर " git push origin master" दी गई शाखा को हटाकर उस प्रतिबंध के आसपास काम कर सकते हैं ।

यदि आप इसे बदल नहीं सकते हैं, तो DEF में प्रतिबद्ध पुनर्मिलन परिवर्तन बनाने के लिए इतिहास को फिर से लिखने के बजाय एकमात्र समाधान होगा :

ABCDEF - [(DEF) ^ - 1] मास्टर

ABCDEF मूल / मास्टर

2
@ JakubNar Jakbski, धन्यवाद। get revert HEAD~Nमदद की। Nकमिट्स की संख्या है। उदाहरण के लिए, अगर मुझे पिछली प्रतिबद्धता की आवश्यकता है, तो मैं उपयोग करूंगाgit revert HEAD~1
मकिस्म दिमित्रिक

1
और ध्यान रहे आप ऐसा करके बाकी सभी स्थानीय गुरु को तोड़ देंगे।
टॉम ब्रिटो

24

जैकब के उत्तर को पूरक करने के लिए, यदि आपके पास ssh में दूरस्थ git सर्वर तक पहुँच है, तो आप git दूरस्थ निर्देशिका में जा सकते हैं और सेट कर सकते हैं:

user@remote$ git config receive.denyNonFastforwards false

फिर अपने स्थानीय रेपो पर वापस जाएं, फिर से अपना प्रयास करें --force:

user@local$ git push origin +master:master --force

और अंत में मूल संरक्षित राज्य में सर्वर की सेटिंग को वापस करें:

user@remote$ git config receive.denyNonFastforwards true

इसके बारे में स्रोत जानकारी के लिए pete.akeo.ie/2011/02/denying-non-fast-forward-and.html भी देखें ।
२०:४१ पर

का उपयोग कैसे करें पर denyNonFastForwards को अक्षम करने के लिए विस्तृत निर्देश viइस SO पोस्ट पर दिए गए हैं: stackoverflow.com/a/43721579/2073804
ron190

2

अपनी "मास्टर" शाखा को ठीक करने के बजाय, शाखाओं का नाम बदलकर अपने "वांछित-मास्टर" के साथ इसे स्वैप करना आसान है। Https://stackoverflow.com/a/2862606/2321594 देखें । इस तरह से आप एकाधिक रिवर्ट लॉग का कोई निशान भी नहीं छोड़ेंगे।


1

पूरे जीआईटी रीसेट करने का व्यवसाय मेरे लिए जटिल था।

इसलिए मैंने राज्य में अपना src फोल्डर प्राप्त करने के लिए कुछ लाइनों के साथ कुछ किया जो मैंने कुछ समय पहले किया था

# reset the local state
git reset <somecommit> --hard 
# copy the relevant part e.g. src (exclude is only needed if you specify .)
tar cvfz /tmp/current.tgz --exclude .git  src
# get the current state of git
git pull
# remove what you don't like anymore
rm -rf src
# restore from the tar file
tar xvfz /tmp/current.tgz
# commit everything back to git
git commit -a
# now you can properly push
git push

इस तरह src में मामलों की स्थिति को टार फ़ाइल में रखा जाता है और गिट को इस राज्य को स्वीकार करने के लिए मजबूर किया जाता है, मूल रूप से src निर्देशिका को उस राज्य के साथ प्रतिस्थापित किया जाता है जिसके पास कई कमिट पहले थे।


0

GitHub के उपयोगकर्ताओं के लिए, इसने मेरे लिए काम किया:

  1. किसी भी शाखा सुरक्षा नियमों में जहां आप परिवर्तन करना चाहते हैं, सुनिश्चित करें कि बल पुश सक्षम होने दें
  2. git reset --hard <full_hash_of_commit_to_reset_to>
  3. git push --force

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

बाकी सभी git resetको अपने स्थानीय मशीन पर शाखा को "सही" करने के लिए ऊपर से कमांड की आवश्यकता है । निश्चित रूप से उन्हें लक्ष्य हैश के बाद इस शाखा में किए गए किसी भी स्थानीय आवागमन से सावधान रहना होगा । चेरी पिक / बैकअप और आवश्यकतानुसार पुन: लागू करें, लेकिन यदि आप एक संरक्षित शाखा में हैं तो ऐसे लोगों की संख्या जो सीधे इसके लिए प्रतिबद्ध हो सकते हैं, की संभावना सीमित है।

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