2010-10-20 10 views
49

मैंने --force विकल्प का उपयोग करके अपने प्रोजेक्ट में गलत स्रोत किया है।मैं एक ग़लत गिट पुश -फ मूल मास्टर से कैसे ठीक हो सकता हूं?

क्या यह वापस करना संभव है? मैं समझता हूं कि सभी पिछली शाखाओं को -f विकल्प का उपयोग करके अधिलेखित किया गया है, इसलिए मैंने अपने पिछले संशोधन को खराब कर दिया होगा।

+0

संभावित डुप्लिकेट [क्या गिट पुश-एफ को पूर्ववत करने के लिए वैसे भी है?] (Http://stackoverflow.com/questions/14476236/is-there-anyway-to-undo-git- पुश-एफ) – cmbuckley

उत्तर

32

गिट आम ​​तौर पर कुछ भी नहीं फेंकता है, लेकिन इससे पुनर्प्राप्त करना अभी भी मुश्किल हो सकता है।

यदि आपके पास सही स्रोत है तो आप इसे --force विकल्प के साथ दूरस्थ में धक्का दे सकते हैं। जब तक आपने इसे बताया नहीं तो गिट ने किसी भी शाखा को हटा नहीं दिया होगा। यदि आप वास्तव में काम खो चुके हैं तो this useful guide to recovering commits पर एक नज़र डालें। यदि आप चाहते हैं कि चीजों के SHA-1 को आप जानते हैं तो आप शायद ठीक हैं।

करने के लिए सबसे अच्छी बात: सबकुछ वापस ले जाएं और देखें कि आपके स्थानीय भंडार में अभी भी क्या है। यदि संभव हो तो रिमोट पर भी ऐसा ही करें। यह देखने के लिए git fsck का उपयोग करें कि आप चीजें पुनर्प्राप्त कर सकते हैं, और से ऊपर git gc चलाएं।

ऊपर से ऊपर, --force विकल्प का उपयोग न करें जबतक कि आप वास्तव में इसका मतलब नहीं लेते।

+37

आप शायद यह निर्धारित करने के लिए रिफ्लॉग को देख सकते हैं कि रिमोट शाखाएं मूल रूप से कहां थीं। उदाहरण के लिए, 'गिट रीफ्लॉग शो रिमोट/मूल/मास्टर' दिखाएं। आपको वहां अपना धक्का देखने में सक्षम होना चाहिए; पिछली पंक्ति में प्रतिबद्धता यह है कि इससे पहले कि आप इसे गड़बड़ कर चुके थे। इसके बाद आप उस संशोधन को ('--force' के साथ) मूल पर धक्का दे सकते हैं, और वापस जहां आप थे! – Cascabel

+0

@ डेविड: ओह। आपने अपने प्रश्न में उल्लेख नहीं किया था कि आपके पास रेपो नहीं था। (यह निश्चित रूप से ऐसा कुछ है जिसे आप कभी नहीं करना चाहते हैं।) यदि आपके पास फाइल सिस्टम पहुंच है जहां आपने धक्का दिया था, हालांकि, आप अभी भी यह सब कर सकते हैं। – Cascabel

+1

@ डेविड: यिक्स। उस तरह की चीज़ से बचने के लिए अपने प्रॉम्प्ट के हिस्से के रूप में अपनी वर्तमान निर्देशिका रखने के लिए हमेशा अच्छा है। – Cascabel

2

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

सभी मैंने किया था (पागलपन स्थानीय रेपो के कुछ और प्रतियां बनाने के बाद):

git add . 
git status 

(यह कहा जाता है कि मूल/मास्टर 68 प्रतिबद्ध द्वारा आगे था, ठीक ... उन सभी प्रतिबद्ध थे मैंने हटा दिया)

git remote set-url origin <GIT_SSH_URL> 
git push 

और बलपूर्वक धक्का देने से पहले सब कुछ ठीक हो गया। याद रखने की सबसे महत्वपूर्ण बात कभी भी गिट चेकआउट नहीं करना है। मजबूती से धक्का देने के बाद। लेकिन सबसे अच्छा अभ्यास पुश विकल्प को अक्षम करना है। मैं कभी भी इसका इस्तेमाल कभी नहीं कर रहा हूं। मेरा सबक सीख लिया !!

32

यदि आप प्रतिबद्ध हैश को जानते हैं, तो यह आसान है, बस अपनी शाखा को फिर से बनाएं।

5794458...b459f069 master -> master (forced update) 

दूरस्थ शाखा हटाएँ:

git push origin :master 

तो निम्न कमांड के साथ अपनी शाखा को पुन:

git checkout 5794458 
git branch master 
git push origin master 
+0

धन्यवाद के बजाय' git --force-with-lease' का उपयोग करना चाहिए !!! मुझे यह पसंद है –

+0

बिल्कुल वही जो मैं खोज रहा था। –

+0

जीनियस। यह सिर्फ मुझे बहुत काम बचाया – fduembgen

8

समाधान पहले ही उल्लेख किया है here

# work on local master 
git checkout master 

# reset to the previous state of origin/master, as recorded by reflog 
git reset --hard origin/[email protected]{1} 

# at this point verify that this is indeed the desired commit. 
# (if necessary, use git reflog to find the right one, and 
# git reset --hard to that one) 

# finally, push the master branch (and only the master branch) to the server 
git push -f origin master 
0

यदि आप उस स्थानीय रेपो पर नहीं हैं जहां मजबूर पुश आया था, मूल/मास्टर स्तर पर पुनर्प्राप्त करने का कोई तरीका नहीं है।लेकिन आप कर रहे हैं, तो भाग्यशाली उपयोग करने के लिए GitHub या GitHub for Enterprise, आप REST एपीआई को देख सकते हैं और खो पुनः प्राप्त पैच, उदाहरण के रूप में प्रतिबद्ध पर्याप्त:

  1. सूची घटनाओं और पाते हैं SHA1 लंबे प्रारूप के लिए प्रतिबद्ध

https://api.github.com/repos/apache/logging-log4j2/events

  1. डाउनलोड लॉस टी प्रतिबद्ध और json रास्ते में संबंधित पैच पुनः प्राप्त .files []/पैच

https://api.github.com/repos/apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de

  1. स्थानीय रूप से लागू करें और फिर से धक्का

Git लागू patch.patch & & Git -m प्रतिबद्ध "बहाल प्रतिबद्ध" & & गिट पुश मूल मास्टर

संबंधित मुद्दे