2015-09-20 5 views
5

मैं एक फीचर पर पिछले दो हफ्तों से काम कर रहा हूं, और मैंने इसके लिए एक अलग शाखा बनाई है। समस्या यह है कि कार्य ने मुझे काफी समय लगाया, और मैंने समय-समय पर मास्टर करने के लिए अपनी शाखा को वापस नहीं किया। मैं 100+ काम करता हूं और अब जब मैं शाखा को git rebase master का उपयोग करके मास्टर को रीबेज करने का प्रयास कर रहा हूं, तो यह हमेशा के लिए ले रहा है, क्योंकि मुझे प्रत्येक प्रतिबद्धता के लिए संघर्ष की जांच करने की आवश्यकता है, इसे संशोधित करें, git add और फिर git rebase --continueक्या मास्टर शाखा में काम करने के लंबे इतिहास को पुनर्जीवित करने का कोई तेज़ तरीका है?

क्या ऐसा करने का कोई आसान तरीका है?

+0

वास्तव में नहीं, नहीं ... जब तक कि आप इसे सीधे करने के लिए सीधे-सीधे विलय का विरोध नहीं कर लेते हैं। – Makoto

+0

मैं विलय नहीं करना चाहता हूं और मैं रीबेस का उपयोग करना चाहता हूं ताकि मैं इतिहास को फिर से लिख सकूं। क्या कोई कामकाज है, भले ही उस शाखा के लिए मेरा काम इतिहास खोना है? मैं बस यह सुनिश्चित करना चाहता हूं कि उस शाखा के लिए नवीनतम कोड मास्टर के लिए छूट गया हो? –

+0

फिर आपको विलय के रूप में प्रत्येक विलय संघर्ष से निपटना होगा। आप वास्तव में काम नहीं करेंगे * आपके द्वारा किए गए काम को खो दें। – Makoto

उत्तर

4

यह इस बात पर निर्भर करता है कि आपने 100+ प्रतिबद्धताओं और इस दौरान क्या हो रहा है। चार रणनीतियों उपयोगी हो सकता है:

प्रतिबद्ध की संख्या कम करने के लिए rebase

आप 100 प्रतिबद्ध का एक सुंदर स्पष्ट धारा है कि एक ही कोड दो बार संशोधित कभी नहीं किया है, मैं माफी चाहता हूँ, लेकिन आप अटक कर रहे हैं।

हालांकि, दो हफ्तों में 100 कामों से, मैं अनुमान लगा रहा हूं कि आपके प्रतिबद्ध इतिहास को यह पसंद नहीं है। शायद आपने प्रतिबद्ध इतिहास के भीतर फ़ंक्शन एक्स 5 बार संशोधित किया है, और उनमें से प्रत्येक एक संघर्ष का कारण बन रहा है। यदि केवल आपके पास एक ही प्रतिबद्धता है जो संशोधित फ़ंक्शन एक्स है, तो आपके पास काम करने का 20% होगा।

तो यहां जवाब मास्टर पर रीबेस करने से पहले अपने प्रतिबद्ध इतिहास को व्यवस्थित करना है। यह 'गिट रिबेस' के लिए एक और उपयोग है। इसे पर मौजूदा आधार पर रीबेस करें, लेकिन git rebase -i का उपयोग एक साथ बातचीत करने और प्रतिबद्धताओं को पुन: व्यवस्थित करने के लिए करें। सुनिश्चित करें कि आपके पास न्यूनतम संख्या में काम है और उनमें से प्रत्येक कुछ स्वतंत्र करता है। आप अपने प्रतिबद्ध लॉग भी बदलने का मौका ले सकते हैं। कुंजी बैकअप शाखाएं (git branch) और git diff प्रत्येक प्रतिबद्धता के बाद उन लोगों के लिए जो आपने कुछ भी नहीं बदला है।

विशेष रूप से, यदि आपके पास आंतरिक विलय होता है, तो इन्हें फ़्लैट करना सहायक होता है।

अनिवार्य रूप से जब मैं ऐसा करता हूं तो मुझे लगता है कि मैंने गलत किया है, या बेहतर हो सकता है, भले ही यह 'केवल' कोड स्वरूपण या संदेश हो। आप इन्हें ठीक करने का अवसर ले सकते हैं। मुझे लगता है कि यह 10 या 20 कम हो जाना चाहिए जब यह किया जाता है - कहीं अधिक प्रबंधनीय।

चरणों

आप पहले से ही यह कर लें, तो आप शायद गोली काटने करने के लिए जा रहे हैं में

रिबेस। हालांकि, अगर आप एक कामकाजी काम कर रहे हैं, तो आप फिर से काम कर रहे हैं, कभी-कभी आप जो भी कर रहे हैं वह निम्नानुसार है। कल्पना कीजिए कि पेड़ इस तरह एक सा दिखता है:

A --- B --- C --- D --- E --- F -- .... -- X --- Y --- Z (master) 
    \ 
     \----- 1 --- 2 --- 3 --- 4 .... 97 --- 98 --- 99 --- 100 (you) 

क्या आप अंततः क्या करना चाहते हैं जेड पर rebase करने के लिए हालांकि, यह आप संघर्ष का भार देता है। आइए मान लें कि डी और ई एक सहकर्मी से दो मेगाकोमेट्स हैं जो आपके कोड से निपटने वाले कुछ काम कर रहे हैं।सी पर

  • rebase (यह बहुत काम नहीं होना चाहिए)
  • एक गहरी सांस लें और गुरु पर ई पर rebase
  • rebase (यह बहुत काम नहीं होना चाहिए): कभी कभी, यह आसान है

'गुरु' की ओर

कभी कभी चीजें वास्तव में पेड़ आप में विलय करने के लिए कोशिश कर रहे हैं पर जटिल हो गया है पर जटिलता से बचना। एक क्लासिक मामला यह है कि (उपर्युक्त आरेख का उपयोग करके) जी को जी को वापस लेते हैं, फिर एच रेडोज़ (या लगभग रीडायोज़) को प्रतिबद्ध करते हैं, और इसी समय में विलय होते हैं (विशेष रूप से उन चीजों में से जिन्हें आप भी विलय कर सकते हैं) । धन्यवाद सहयोगी, जो वास्तव में सरल बना रहा है। अन्य चीजें जो कठिनाइयों का कारण बनती हैं वे जटिल विलय और ग़लत नाम बदलती हैं। प्रत्येक प्रतिबद्धता आपको किसी भी स्पष्ट कारण के लिए बार-बार एक ही संघर्ष देने देती है। git rebase Aarrggh।

यहां एक तकनीक मास्टर पेड़ की एक प्रतिलिपि बनाना है, यानी शाखा मास्टर (स्थानीय रूप से), फिर पूरी चीज को ए से ज़ेड में एक ही प्रतिबद्धता में स्क्वैश करना। आप अपनी सामग्री को थोड़ा पहले भी फ़्लैट कर सकते हैं (ऊपर देखो)। फिर flattened मास्टर पर rebase। अब आपको कमेट्स का 'दायां' सेट मिल गया है, आप मास्टर पर आसानी से रीबेज कर सकते हैं (ठीक है, 'Z' पर मास्टर के रूप में बदल सकता है) क्योंकि कोड बिल्कुल वही है।

यदि सब और

विफल रहता है कभी कभी git rebase संघर्ष की एक स्वप्रत्यय लोप राज्य में जाने के लिए लगता है, और यह पूरे या बिट्स में यह पुन: लागू करने git format-patch बाहर तोड़ समय और git am है। यह वास्तव में उपयोगी है अगर किसी ने फ़ाइल का नाम बदल दिया है (जैसा कि आप अपने संपादक में पैच में फ़ाइल नाम को ठीक कर सकते हैं) या एक सामान्य वर्ग/चर/जो भी हो (जैसा कि आप पैच में ढूंढ/प्रतिस्थापित कर सकते हैं) का नाम बदल चुके हैं।

अपनी गलतियों से

अगली बार जानें, गुरु पर अधिक बार rebase। यदि आप साथ जाते हैं तो यह कम दर्दनाक होता है।

इसके अलावा, यदि आपके पास कोड के उसी क्षेत्र पर काम करने वाले दो लोग हैं और यह संघर्षों का ढेर पैदा करता है, तो शायद आपका कोड पर्याप्त रूप से पर्याप्त नहीं है, या शायद आप एक दूसरे के शीर्ष पर काम कर रहे हैं और अपना काम विभाजित कर सकते हैं बेहतर है?

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

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