2010-08-21 18 views
8

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

मुझे लगता है कि मुझे उन्हें विलय करना था, लेकिन इसके बजाय मैं प्रत्येक शाखा को बाहर निकालने के बाद git commit -a चला गया।

तब मुझे एहसास हुआ कि पूरा कार्यक्रम समय पर वापस चला गया है, इसलिए मैंने git reset --soft HEAD चलाया (मैंने किसी लेख में कहीं भी पढ़ा है कि यह मदद करनी चाहिए), लेकिन उसने कुछ भी नहीं किया।

मुझे यह संदेश गिट से मैन्युअल रूप से कुछ ./git/index.lock हटाने के बारे में भी मिला है, इसलिए मैंने इसे ./git/backup_of_index.lock पर ले जाया, लेकिन ऐसा कुछ भी प्रतीत नहीं होता था।

मैं अपने भंडार को कैसे ठीक कर सकता हूं और सभी शाखाओं को विलय कैसे कर सकता हूं?

+3

-केवल पढ़ने के लिए अधिमानतः एक पुराने बैकअप को वापस लाएं हमेशा के लिए मुझे –

+8

पहले काम करता है, अब अपने काम के पेड़ और '.git' फ़ोल्डर की एक पूरी बैकअप बनाने और कहीं सुरक्षित रखा है,। आपने जो कहा है उससे यह बहुत ही असंभव लगता है कि आपने काम खो दिया है (कोई 'रीसेट - हार्ड' नहीं है, और ऐसा लगता है जैसे आप शाखाओं पर किए गए कार्यों के साथ गड़बड़ कर रहे थे)। एक बार जब आप ऐसा कर लेंगे और एक इंटरैक्टिव चैनल पर गिट विशेषज्ञ ढूंढें तो कहीं भी जो आपके पिछले राज्य को खोजने और पुनर्स्थापित करने के तरीके से बात कर सकता है। stackoverflow लगभग निश्चित रूप से इसके लिए मंच नहीं है क्योंकि आपको केवल एक प्रश्नोत्तर नहीं बल्कि इंटरैक्टिव सहायता की आवश्यकता है। –

+0

सभी को धन्यवाद, मैं सभी सुझावों का उपयोग करूंगा और कुछ समझूंगा, मैं वास्तव में अभी तक कोई जवाब नहीं ले सकता। –

उत्तर

1

गलतियों:

  1. "मैं सिर्फ उन्हें एक करना चाहता था के रूप में उनमें से प्रत्येक कार्यक्रम के विभिन्न भागों के लिए एक अद्यतन थे"
"मैं अपने नई परियोजना पर Git के साथ खेलना शुरू कर दिया"

जब आपका कोड कुछ मतलब है तो आपको अपरिचित क्षेत्र के साथ नहीं खेलना चाहिए। यदि आप ऐसा करना चाहते हैं, कम से कम एक पतन योजना है।

आपदा रिकवरी केवल उन लोगों के लिए महत्वपूर्ण है जिनकी आवश्यकता है, लेकिन उस समय बहुत देर हो चुकी है।

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

इससे पहले कि आप खेलना तय करें, अपना कोड लें और इसे कहीं और टॉस करें ताकि जब sh * t प्रशंसक को हिट करता है तो आप अपने आराम क्षेत्र में वापस जा सकते हैं और एक खुश डेवलपर के रूप में काम करना जारी रख सकते हैं और अपना प्राप्त करने के बाद खेल सकते हैं काम किया।

+0

जबकि मैं आपके अंक से सहमत हूं, यह प्रश्न का उत्तर नहीं है। इसे एक टिप्पणी के रूप में पोस्ट किया जाना चाहिए (हालांकि मुझे पता है कि टिप्पणियां इस पाठ को समायोजित नहीं कर सकती हैं)। – Jeff

+4

मैंने मूल रूप से टिप्पणी में टाइप करना शुरू कर दिया और कमरे से बाहर भाग गया। : -/ – Chris

4

जब तक आपने .git निर्देशिका में डेटा पर हैक किया है, तो यह संभावना नहीं है कि आपने कुछ खो दिया है। आपके पास साफ करने के लिए एक भयानक गड़बड़ी हो सकती है, और यह आपके द्वारा किए गए कार्यों और जहां यह है, वहां बहुत काम कर सकता है, लेकिन शायद आपने कुछ भी खो दिया नहीं है।

यह अच्छी खबर है।

बुरी खबर यह है कि किसी के लिए आपकी मदद करने के लिए यह बेहद मुश्किल होगा।

आपको सभी शाखाओं की पहचान करने की आवश्यकता है, और प्रत्येक पर आगे की ओर ट्रेस करने की आवश्यकता है। आपको यह तय करने की आवश्यकता होगी कि क्या उन सभी git commit -a 'ऑपरेशन एक अच्छा विचार थे। यह असंभव लगता है - इसलिए आपको प्रत्येक शाखा पर अगले अंतिम प्रतिबद्धता से काम करने के लिए, अपने विलय ठीक से करने की आवश्यकता हो सकती है।

आपको यह भी तय करने की आवश्यकता है कि आप वास्तव में क्या करने की कोशिश कर रहे थे।

ऐसा लगता है कि आप कुछ शाखाओं को मर्ज करना चाहते हैं - उन्हें शाखा शाखा, शाखाबी, और शाखासी - मुख्य शाखा, मास्टर पर कॉल करें। लेकिन यह स्पष्ट नहीं है कि आपने जो कोशिश की है।

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

जब आप संतुष्ट हैं कि फिक्सअप शाखा सही है, तो मास्टर शाखा में वापस स्विच करें और फ़िक्सअप शाखा को मास्टर में विलय करें।


चार्ल्स बेली बहुत समझदार सुझाव (प्रश्न के लिए एक टिप्पणी में) बनाता है: इससे पहले कि आप कुछ और, बिल्कुल के रूप में यह वर्तमान में है, तो आप क्या मिल गया है की एक बैकअप प्रतिलिपि बनाते हैं। केवल तब किसी भी सफाई अभियान के साथ आगे बढ़ें। और इंटरैक्टिव सहायता पाने के उनके सुझाव भी समझदार हैं।

14

इस स्थिति में सबसे महत्वपूर्ण गिट कमांड git reflog है। रिफ्लॉग प्रत्येक विशेष शाखा प्रमुख में सभी परिवर्तनों को ट्रैक करता है, और git reflog कमांड शाखा समय में वापस आने वाले सभी परिवर्तनों को सूचीबद्ध करता है।

यदि आप रिफ्लॉग का उपयोग करके "अच्छी" प्रतिबद्ध आईडी की पहचान कर सकते हैं (और यह वहां होगा, कहीं भी), तो आप अब कहां से आगे हैं।

git checkout -b rescue abc123 

एक नई शाखा पर rescue बुलाया आईडी abc123 प्रतिबद्ध बनाता है: एक अच्छा प्रतिबद्ध आईडी कहते हैं, abc123, फिर कमांड है।

जब मैं गिट सीख रहा था, तो मेरे पास एक समान प्रकार था "जहां मैं बिल्ली हूं और मैं यहां कैसे पहुंचे?" पल। मैंने different Stack Overflow question पर रीफ्लॉग के बारे में सीखा, और यह गिट के बारे में जानना सबसे मूल्यवान बात है।

+0

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

+0

इसके अलावा, यहां इस तरह की स्थिति पर कुछ दस्तावेज हैं: http://progit.org/book/ch9-7.html#data_recovery –

+0

मैं यहां "रीफ्लॉग" कहने के लिए आ रहा था! सिर्फ अकेले प्रश्न के शीर्षक से। – masonk

1

गिट के बारे में शानदार चीजों में से एक यह है कि आप आसानी से अपने पूरे कामकाजी भंडार को डुप्लिकेट कर सकते हैं। जब आप ब्रांचिंग और विलय के साथ प्रयोग करते हैं तो यह आपको बैकअप प्रति को संरक्षित करने की अनुमति देता है। अपने वर्तमान समस्या को हल करने के लिए

मेरे द्वारा सुझाए गए दृष्टिकोण:

  1. अपने पूरे भंडार
  2. भंडार
  3. हर बार जब आप एक throw- अप पेंच के थ्रो-दूर प्रतियों के साथ प्रयोग के एक बैकअप प्रतिलिपि बनाएं दूर भंडार - इसे दूर करें और अपने बैकअप
  4. से एक नई प्रतिलिपि के साथ शुरू करें, अंततः, आप रेपो हैकिंग मास्टर करना शुरू कर देंगे - आप अपना काम पुनर्प्राप्त कर लेंगे, और आपने जो कुछ सीखा है उसके बारे में आपको अच्छा लगेगा

इसके अलावा, मुझे आशा है कि आप अपने परिवर्तन के प्रभाव की समीक्षा करने के gitk (या समान) का उपयोग कर रहे हैं - यह वास्तव में आप कोड के विभिन्न लाइनों कल्पना करने के लिए मदद कर सकते हैं और कैसे वे जुड़े हुए हैं।

gitk --all ## show me all the branches 
+0

इसके अलावा (यहां तक ​​कि बेहतर भी?): 'Gitk --reflog' - मुझे लगता है कि यह एक नई सुविधा है, लेकिन एक बहुत उपयोगी है। – nobar

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