2016-04-29 6 views
5

जैसा कि मैं इसे समझता हूं, फाइलों की स्नैपशॉट्स हैं, इसलिए यदि मैं परिवर्तन ए करता हूं और फिर बी को बदलता हूं, तो बी की प्रतिबद्धता फ़ाइल में पहले से ही परिवर्तन ए में परिवर्तन शामिल हैं, परिवर्तन को पुन: व्यवस्थित नहीं करेंगे एक अनावश्यक?रीटॉर्डरिंग गिट रिबेस का उपयोग करके क्यों काम करता है- मैं इतिहास को खराब नहीं करता?

+0

गिट आवश्यकतानुसार भिन्न होता है; रीबेस नई आधार सामग्री के लिए diffs लागू होता है। – jthill

उत्तर

5

वास्तव में, यह एक बहुत अच्छा सवाल है, क्योंकि स्नैपशॉट्स करता है।

कारण रिबेस काम करता है एक बदल कर क्योंकि रिबेस वास्तव में (अंत में मोर्चे पर लपेटकर का एक सा के साथ यह पता लगाने की क्या लेने के लिए, और अधिक शाखा लेबल ले जाने के लिए) git cherry-pick दोहराया है, और git cherry-pick काम करता है एक बदलाव-सेट में प्रतिबद्ध करें।

उदाहरण के लिए मान लीजिए आप प्रतिबद्ध के इस क्रम है:

  A--B--C <-- topic 
     /
...--o--*--o--o  <-- mainline 

rebase करने के लिए topicmainline पर हम (1) करता है कि topic पर हैं खोजने की जरूरत है, लेकिन नहीं पर mainline (जो C, B हैं , और A शीर्ष पंक्ति के साथ, * चिह्नित प्रतिबद्धता पर समाप्त होने पर), और फिर (2) उन्हें नई प्रतिबद्धताओं में कॉपी करें, हम mainline की नोक के नीचे जोड़ देंगे।

रिबेस पहले तीन पोस्ट * करता पाता है और उन्हें एक में रखता है (रिवर्स आदेश दिया: A, B, C) सूची (यह भी डिफ़ॉल्ट रूप से प्रतिबद्ध विलय को छोड़ देता है लेकिन कोई मर्ज के यहाँ हैं)। यह तब प्रत्येक प्रतिबद्धता के लिए एक चेरी उठाता है।

A चेरी लेने के लिए, * के विरुद्ध गिट diffs A। यह दो स्नैपशॉट्स को परिवर्तनों में बदल देता है। A के खिलाफ B चेरी लेने

  A--B--C <-- topic 
     /
...--o--*--o--o  <-- mainline 
       \ 
       A' <-- HEAD 

करने के लिए B, Git डिफ: Git तो टिप सबसे करने के लिए परिवर्तन mainline के लिए प्रतिबद्ध लागू होता है और एक नया प्रतिबद्ध है, चलो, यह A' फोन एक गुमनाम शाखा पर जाने बनाता है। इन परिवर्तनों को A' पर लागू करने से एक और प्रतिबद्धता B' उत्पन्न करती है। C के लिए दोहराएँ C' प्राप्त करने के लिए:

  A--B--C   <-- topic 
     /
...--o--*--o--o   <-- mainline 
       \ 
       A'-B'-C' <-- HEAD 

अंतिम, Git C से दूर peels topic लेबल और C' बजाय करने के लिए यह इंगित करता है। पुराने श्रृंखला को छोड़ दिया जाता है (लेकिन तब भी reflogs के माध्यम से इसे पा सकते हैं, और rebase प्रतियां विशेष नाम ORIG_HEAD करने के लिए C की आईडी के रूप में अच्छी तरह से):

  A--B--C   [abandoned] 
     /
...--o--*--o--o   <-- mainline 
       \ 
       A'-B'-C' <-- topic 

और अब रिबेस पूरा हो गया है।

ध्यान दें कि यदि आवश्यक हो तो प्रत्येक प्रति गिट के विलय तंत्र का उपयोग करके किया जाता है (यदि अंतर तुरंत साफ नहीं होते हैं)। प्रत्येक का विलय विवाद हो सकता है, जिससे रोकने के लिए रिबेस की आवश्यकता होती है और आपकी मदद मिलती है। (या, बदतर, आप एक गलत विलय प्राप्त कर सकते हैं, हालांकि ये अभ्यास में दुर्लभ हैं।)

और निश्चित रूप से, यदि आप एक इंटरैक्टिव रीबेस में चारों ओर pick लाइनों को स्थानांतरित करके (आदेशों को फिर से ऑर्डर करते हैं), तो हम केवल उस क्रम को बदलते हैं जिसे हम चुनते हैं और प्रत्येक प्रतिबद्धता को लागू करते हैं। चेरी ले संचालन अभी भी उसी तरह काम करते हैं: तुलना उठाया इसके जनक के खिलाफ प्रतिबद्ध (C बनाम B, A बनाम *, B बनाम A)।

+0

लेकिन diffs डेटा पिछले प्रतिबद्धता में फ़ाइल की सामग्री पर निर्भर करता है, जो उन्हें पुन: व्यवस्थित करने के बाद बदल जाएगा। या यह पुनरावृत्ति केवल कॉस्मेटिक है? –

+0

नई प्रतियां * नई प्रतियां * हैं, जिनके साथ इसका तात्पर्य है। मान लीजिए, उदाहरण के लिए, कि चेरी-पिकिंग 'बी' के दौरान आपको विलय संघर्ष मिलता है क्योंकि 'मेनलाइन' की नोक में एक विरोधाभासी परिवर्तन होता है। जब आप संघर्ष को ठीक करते हैं और रिबेस जारी रखते हैं, तो नई प्रतिबद्धता 'बी' के पास मूल प्रतिबद्धता 'बी' से अलग परिवर्तन होता है। 'बी' और 'बी' दोनों अभी भी भंडार में हैं, और अगली चेरी-पिक (मान लीजिए कि यह' सी' के लिए है) 'बी' से उस परिवर्तन को लागू करने का प्रयास करने से पहले 'सी' से' बी' की तुलना करता है (जो 'बी' अब अलग है, इसलिए एक और विलय संघर्ष हो सकता है!)। – torek

+0

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

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