2017-12-02 31 views
7

मुझे लगता है मैं git pull को समझते हैं और यह कैसे मैं इसे से समझाने, मैं क्या कहते हैं, "सरल शब्दों" है:सरल शब्दों में "git pull --rebase" को कैसे समझाया जाए?

  1. सामान्य शब्दों में, git pull के बारे में एक "स्थानीय" में एक "दूरस्थ" शाखा विलय है डाली।
  2. और अधिक विस्तार में, Git "अद्यतन"/करने के लिए "दूरस्थ" शाखा की सामग्री का उपयोग करता है "स्थानीय" शाखा की सामग्री "संशोधित"।
  3. भी अधिक विस्तार में, यदि एक फ़ाइल "स्थानीय" शाखा में लेकिन "दूरस्थ" शाखा में नहीं संशोधित किया गया है, तो मर्ज के बाद, फ़ाइल की सामग्री "स्थानीय में सामग्री के रूप में ही किया जाएगा " डाली। उल्टा भी सही है। अगर "रिमोट" शाखा पर एक फ़ाइल संशोधित की गई थी लेकिन "स्थानीय" शाखा में नहीं, तो सामग्री "रिमोट" शाखा से ली जाएगी।
  4. एक फ़ाइल दोनों शाखाओं में संशोधित किया गया था, तो ("स्थानीय" और "दूरस्थ") Git से दोनों शाखाओं से संशोधनों लेने के लिए की कोशिश करेंगे। यदि फ़ाइल के विभिन्न स्थानों पर परिवर्तन होते हैं, तो दोनों परिवर्तन लागू किए जाएंगे और विलय के बाद फ़ाइल की सामग्री में उपस्थित होंगे।
  5. परिवर्तन एक ही जगह है कि हम क्या एक "संघर्ष मर्ज" के रूप में जानते है पर हो और मैं सादगी के लिए इस मामले को छूने के लिए नहीं जा रहा हूँ है।
  6. मर्ज का एक परिणाम के रूप में, हम "स्थानीय" भंडार को संशोधित और इसलिए हम "प्रतिबद्ध" की जरूरत है।

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

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

+0

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

+0

जैसा कि मैंने प्रश्न में लिखा था, मुझे नहीं पता कि "fetch" का अर्थ क्या है। – Roman

+1

@Roman, अब आप ... – alexis

उत्तर

6

मुझे दो चीजें दिखाई देती हैं जिन्हें स्पष्ट किया जा सकता है: आप दो शाखाओं में एक फाइल की स्थिति पर ध्यान केंद्रित कर रहे हैं, लेकिन क्या हो रहा है, इस पर विचार करने का एक बेहतर तरीका यह है कि क्या हुआ है। दूसरा मुद्दा यह है कि git pull दो संचालन के लिए शॉर्टेंड है: git fetch, और git merge। हां, आप लिखते हैं कि आप "fetch जैसे शब्दों का उपयोग नहीं करना चाहते हैं", लेकिन यह एक "उन्नत अवधारणा" नहीं है। यदि आप समझना चाहते हैं कि क्या हो रहा है, तो आपको वहां से शुरुआत करने की आवश्यकता है।

  • git fetch अनिवार्य रूप से सूचित परिवर्तन है कि इसके बारे में पता नहीं था की स्थानीय रेपो।

  • git merge आपके स्थानीय परिवर्तनों के साथ नए आगमन में परिवर्तन को एकीकृत करता है।

पकड़ है कि अगर चीजें तुल्यकालन के बिना दोनों रेपोस पर क्या हो रहा है, वे भिन्न हो गए हैं सकता है:

... b--o--o--o--o (remote) 
    \ 
     x--x--x  (local) 

ऊपर समय बाएं से दाएं पता चलता है; सबसे सही बिंदु सबसे हालिया है। इसलिए नए आने वाले परिवर्तन फाइलों की पुरानी स्थिति में संशोधन हैं, जिसे "बी" चिह्नित किया गया है।

  • git pull है, यानी सादा git merge, के रूप में सबसे अच्छा के रूप में यह कर सकते हैं दो शाखाओं का सबसे हाल ही राज्य मर्ज हो जाएंगे।

  • git pull --rebase दिखाएगा कि आपके परिवर्तन "बी" चिह्नित राज्य को नहीं बल्कि अधिकांश मौजूदा दूरस्थ राज्य में किए गए थे। दूसरे शब्दों में यह इतना है कि यह इस तरह दिखता है इतिहास को फिर से लिखने की कोशिश करेंगे:

    ... b--o--o--o--o    (remote) 
           \ 
            x--x--x  (local) 
    

यही अंतर है। एक परिणाम यह है कि यदि आप पुन: प्रतिक्रिया नहीं देते हैं, तो आपके रेपो के इतिहास में कुछ राज्य शामिल हैं (जिन्हें आप भविष्य में रिवाइंड कर सकते हैं, यदि आप चाहते हैं) जहां "x" परिवर्तन लागू किए गए थे लेकिन "ओ" परिवर्तन अनुपस्थित हैं। पुनर्जन्म के बाद, भंडार में ऐसी कोई जगह नहीं है।

+0

बहुत स्पष्ट उत्तर के लिए धन्यवाद। मैंने जो कुछ लिखा है उसे मैंने समझा है और मैंने सीख लिया है कि 'fetch' और 'rebase' का अर्थ क्या है। एकमात्र चीज जिसे मैं याद कर रहा हूं यह जानना है कि मेरी स्थानीय शाखा की सामग्री अलग-अलग होगी, जो मैं 'गिट पुल' या 'गिट पुल - रीबेस' करता हूं।दूसरे शब्दों में, समानांतर में 'ओ-ओ-ओ' और 'x-x-x' कर सकते हैं और फिर विलय करने से एक परिणाम (सामग्री) मिलती है जो हमें प्राप्त होने वाली सामग्री से अलग होती है जब हम पहले' ओ-ओ-ओ 'करते हैं और फिर' x-x-x' करते हैं। अभी तक दूसरे शब्दों में, 'ओ-ओ-ओ' और 'एक्स-एक्स-एक्स' कम्यूटिव ऑपरेशंस हैं? – Roman

+0

@Roman: वास्तव में, ऐसे मामले हैं जहां ये * अच्छी तरह से व्यवहार नहीं किए जाते हैं, और आपको अलग-अलग परिणाम मिलते हैं। वे बहुत आम नहीं हैं, लेकिन वे मौजूद हैं। मैं नए गलतियों को 'गिट पुल' से पूरी तरह से बचने के लिए सलाह देता हूं: पहले 'गिट फ़ेच' चलाएं, फिर यदि आप विलय करना चाहते हैं तो 'गिट मर्ज' चलाएं, या यदि आप रीबेज चाहते हैं तो 'गिट रीबेज' चलाएं। दोनों को विभाजित करने से आपको निर्णय लेने के लिए 'गिट लॉग' चलाने का मौका मिलता है, साथ ही साथ आपको क्या हो रहा है इसकी एक स्पष्ट मानसिक तस्वीर दे रही है। – torek

1

सरल: जब तक आपका काम स्थानीय होता है (जिसका अर्थ है कि इसे धक्का नहीं दिया गया है), git pull --rebase एक अद्यतन इतिहास के शीर्ष पर आपके स्थानीय कार्य को फिर से चलाने के लिए काम करेगा।

git fetch रिमोट रेपो (उदाहरण के लिए origin/master) के नवीनतम कामों के साथ इतिहास को अपडेट करेगा।
फिर आपका काम (आपके master शाखा के स्थानीय लोकेशन) को उस अद्यतन इतिहास के शीर्ष पर एक-एक करके (जो एक रिबेस होता है) फिर से चलाया जाएगा।

विचार यह है कि, जब आप धक्का देना चाहते हैं, तो कहा कि पुश बहुत आसान होगा, और इसमें कोई विलय की आवश्यकता नहीं होगी, क्योंकि आपकी प्रतिबद्धता origin/master के शीर्ष पर बस नई प्रतिबद्ध होती है।

ध्यान दें कि आपको लगता है कि रिबेस हिस्सा पूरी तरह since Git 2.6 छिपा सकते हैं: रिबेस अच्छी तरह से चला जाता है नहीं है

git config pull.rebase true 
git config rebase.autoStash true 

और अगर और आप निरस्त करने के लिए है, Git आप since Git 2.10 के लिए रखे वर्तमान काम को बहाल करेंगे।

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