2012-10-31 10 views
39

मैंने हाल ही में एक शाखा को पुनर्जीवित किया जिस पर मैं काम कर रहा था। पेड़ के इतिहास कुछ इस तरह देखा:क्या मैंने पुन: प्रयास के बाद अपने परिवर्तन खो दिए हैं?

1 = 2 = 3 = 4 
    \ 
     5 = 6 = 7 
      \ 
      8 

मैं (अब चित्र पर 4 प्रतिबद्ध तक) मास्टर शाखा पर होना मेरे परिवर्तन (चित्र में नंबर 8) rebase करना चाहता था।

git checkout my_branch 
git rebase master 

< Git mergetool के बहुत सारे/Git विवादों को सुलझाने के --skip rebase>

केवल अब मैं जब चलाएँ::

git checkout my_branch 
git diff master 

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

+0

जब आपने 'गिट रिबेस --स्किप' ('--continue' के बजाय) किया था, तो क्या यह संभव है कि आपने उस परिवर्तन को" छोड़ दिया "जो वास्तव में अभी भी रीबेज के दौरान सार्थक परिवर्तन था? –

+0

यह उत्तर देखें: http://stackoverflow.com/a/4851776/450609।मुझे उस परिवर्तन को छोड़ने के लिए गिट रीबेस --स्किप का उपयोग करना था जिसे मैं मैन्युअल रूप से विलय कर दूंगा। – dave

+1

यदि आपने मैन्युअल रूप से विलय किया है तो आप आमतौर पर '--continue' करना चाहते हैं। मर्ज का नतीजा "कोई बदलाव नहीं" होने पर आपको केवल छोड़ना होगा। आपने कितने बदलाव छोड़े और आपने वास्तव में कितने आवेदन किए? –

उत्तर

97

यदि आप कोई अंतर नहीं देख रहे हैं, तो मुझे संदेह है कि आप अपने परिवर्तन खो चुके हैं। आप संभवतः git reflog का उपयोग रीबेज से पहले मौजूद शाखा की पहचान करने के लिए कर सकते हैं, और मूल शाखा वापस पाने के लिए git reset --hard <my-branch-tip-before-rebase> का उपयोग कर सकते हैं। और हाँ, आपको प्रक्रिया को फिर से चलाने की आवश्यकता होगी। । :-(

मैं काफी यकीन है कि कैसे आप उन लोगों के साथ समाप्त हो गया है, हालांकि एक ही देख नहीं कर रहा हूँ मैं आदेश दिया था साथ निम्नलिखित को देखने के लिए अपेक्षा की होगी:

1 = 2 = 3 = 4    (master) 
    \  \ 
     \  5' = 6' = 8' (my_branch) 
     \ 
     5 = 6 = 7 

इस मामले में, आप शायद rebase --onto का उपयोग किया है चाहिए:

git rebase --onto master <commit id for 6> my_branch 

एक ग्राफ है कि इस तरह देखा के साथ छोड़ दिया है | यही कारण है कि:

1 = 2 = 3 = 4    (master) 
    \  \ 
     \  8'   (my_branch) 
     \ 
     5 = 6 = 7 

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

याद रखने की एक बात। यदि आप विलय विवादों के समूह की अपेक्षा नहीं करते हैं - क्योंकि आप महसूस नहीं करते हैं कि स्रोत पर्याप्त रूप से अलग हो गए हैं, तो देखकर कोई गलत काम करने का चेतावनी झंडा है। git rebase --abort करके, शाखाओं की जांच करके और यदि आप किसी संघर्ष की अपेक्षा करते हैं तो फिर से जांच कर बैक अप करना अच्छा होता है। यह सुनिश्चित करना सुनिश्चित करें कि संघर्ष कहां हुआ था (आमतौर पर रिबेज आपको कमांड लाइन पर ले जाने से पहले "लागू हो रहा है ..." होता है)। यह आमतौर पर शुरू करने के लिए एक महान जगह है।

कभी-कभी, संघर्ष अपरिहार्य होते हैं, और काम करने के लिए कठिन होते हैं। लेकिन मुझे अभ्यास के साथ संदेह है, आप इस समस्या को कम कर देंगे।

शाखाओं के बीच परिवर्तनों को प्रत्यारोपित करने के बारे में अधिक जानकारी के लिए, git rebase मैन पेज देखें। "Rebase --onto" के लिए खोजें। पहली हिट आपको किसी अन्य शाखा में परिवर्तनों को प्रत्यारोपित करने के बारे में बात करते हुए एक अनुभाग में लाना चाहिए।

+0

आप सही थे; मैंने गलत आदेश का इस्तेमाल किया। मुझे --onto कहने की जरूरत थी। मुझे अब मेरा रिबैड पैच मिला है :) (और मुझे इसे फिर से करना होगा लेकिन दूसरी बार एक संघर्ष को ठीक करना बहुत आसान है)। – dave

+0

बहुत बढ़िया! खुशी हुई यह मदद की! और हाँ, मुझे वही चीज़ मिलती है: संघर्ष दूसरी बार चारों ओर निश्चित रूप से आसान होता है। एक दिलचस्प विशेषता rerere है। स्कॉट चेकॉन में एक [अच्छा आलेख] है (http://git-scm.com/2010/03/08/rerere.html) सुविधा पर, और संघर्षों को हल करने में बहुत मददगार है, अगर आपको लगता है कि आप इसमें भाग रहे हैं वही एक से अधिक। – jszakmeister

+6

'गिट रीसेट --हार्ड xxxxx' ने मुझे बचाया! मैंने सोचा कि सब कुछ खो गया था! '-हार्ड' के बिना भी 'गीट रीसेट xxxx' काम नहीं किया! – Chloe

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