2013-09-21 10 views
213

मैंने कुछ समय पहले गिट का उपयोग शुरू किया और जटिलताओं को पूरी तरह से समझ नहीं पाया। मेरे मूल प्रश्न यहाँ एक git pull और git pull --rebase, के बीच अंतर पता लगाने के लिए --rebase विकल्प बहुत अलग कुछ करने के लिए नहीं लगता है जोड़ने के बाद से है: बस एक पुल है।गिट पुल और गिट पुल के बीच अंतर --rebase

कृपया अंतर को समझने में मेरी सहायता करें।

+6

संबंधित: [मुझे गिट पुल --rebase का उपयोग कब करना चाहिए?] (Http://stackoverflow.com/q/2472254/456814)। –

+2

[गिट पुल वीएस गिट फ़ेच गिट रीबेज] का संभावित डुप्लिकेट [http://stackoverflow.com/questions/3357122/git-pull-vs-git-fetch-git-rebase) –

+0

उपयोगी लिंक: https: // www। atlassian.com/git/tutorials/rewriting-history/git-rebase –

उत्तर

236

git pull = git fetch + git merge के खिलाफ नदी के ऊपर शाखा पर नज़र रखने

git pull --rebase = git fetch + git rebase ट्रैकिंग नदी के ऊपर शाखा

आप को पता है git merge और git rebase कैसे भिन्न होते हैं, read this चाहते हैं के खिलाफ

+8

यह कहने योग्य है कि' गिट पुल --rebase' 'गिट fetch' और' git rebase 'जैसा ही है मूल रूप से यह कैसे है , लेकिन यह * बिल्कुल * अर्थात् समकक्ष नहीं है। कुछ मतभेद हैं, जिनमें से कुछ यहां समझाए गए हैं। http://gitolite.com/git-pull--rebase – w0rp

+4

स्कॉट मेयर्स से एक वाक्यांश उधार लेने के लिए मैं "सुविधाजनक झूठ" कहूंगा। इस पर ध्यान दिए बिना यह एक अच्छा तरीका है। – w0rp

9

कोई टकराव

  • रिबेस साथ की बहुत सबसे सरल मामले में: दूरस्थ प्रमुख के ontop अपने स्थानीय प्रतिबद्ध rebases और करता मर्ज नहीं बना/मर्ज के बिना/सामान्य
  • प्रतिबद्ध: मर्ज और बनाता है किसी मर्ज के लिए प्रतिबद्ध

यह भी देखें:

man git-pull

दरअसल, Git पुल Git दिए गए मापदंडों और कॉल Git मर्ज के साथ लाने के वर्तमान शाखा में लिया गया शाखा प्रमुखों विलय करने के लिए चलाता है। --rebase के साथ, यह गिट विलय के बजाय गिट रिबेस चलाता है।

यह भी देखें:
When should I use git pull --rebase?
http://git-scm.com/book/en/Git-Branching-Rebasing

+3

और टकराव के मामले में? – Rndm

+1

आपको मैन्युअल रूप से उन्हें हल करने के लिए कहा जाएगा और फिर - रीबेस के साथ जारी रखें: 'git sdd संशोधित-फ़ाइल; गिट रिबेस --continue' या मर्ज करें: 'git संशोधित फ़ाइल जोड़ें; गिट प्रतिबद्ध; 'जहां' संशोधित-फ़ाइल 'आपकी स्थानीय फ़ाइल है जिसे आपने मैन्युअल रूप से संशोधित किया है/mergetool – drahnr

187

कभी-कभी हमारे पास एक अपस्ट्रीम है जो उस शाखा को पुनर्जीवित/पुनर्स्थापित करता है जिस पर हम निर्भर हैं। यह एक बड़ी समस्या हो सकती है - अगर हम डाउनस्ट्रीम हैं तो हमारे लिए गन्दा संघर्ष पैदा कर सकते हैं।

जादू git pull --rebase

है एक सामान्य Git पुल, है शिथिल इस तरह कहा जाए तो कुछ (हम एक दूरस्थ बुलाया मूल और इन सभी उदाहरणों में एक शाखा foo नामक इस्तेमाल करेंगे):

# assume current checked out branch is "foo" 
git fetch origin 
git merge origin/foo 

पहली नज़र में, आप सोच सकते हैं एक Git खींच कि --rebase सिर्फ इस करता है:

git fetch origin 
git rebase origin/foo 

लेकिन यदि नदी के ऊपर रिबेस किसी भी "squashin शामिल मदद नहीं करेगा जी "(जिसका अर्थ है कि काम के पैच-आईडी बदल गए, न केवल उनके आदेश)।

जिसका अर्थ है कि गिट पुल --रेबेस को उससे थोड़ा अधिक करना है। यह एक स्पष्टीकरण है कि यह क्या करता है और कैसे।

मान लें कि आपका शुरुआती बिंदु यह है दो:

a---b---c---d---e (origin/foo) (also your local "foo") 

समय गुजरता है, और आप अपने खुद के "foo" के शीर्ष पर कुछ करता बना दिया है:

a---b---c---d---e---p---q---r (foo) 

इस बीच, में आकर एंटी-सोशल क्रोध, अपस्ट्रीम रखरखाव ने न केवल अपने "फू" को पीछे छोड़ दिया है, उसने स्क्वैश या दो का भी इस्तेमाल किया है। उनकी प्रतिबद्धता श्रृंखला अब इस तरह दिखती है:

a---b+c---d+e---f (origin/foo) 

इस बिंदु पर एक गिट खींचने के परिणामस्वरूप अराजकता हो जाएगी। यहां तक ​​कि एक गिट लाता है; गिट रिबेस मूल/foo इसे काट नहीं देगा, क्योंकि एक तरफ "बी" और "सी" करता है, और दूसरे पर "बी + सी" प्रतिबद्ध करता है, संघर्ष करेगा। (और इसी तरह डी, ई, और डी + ई के साथ)।

क्या git pull --rebase करता है, इस मामले में, यह है:

git fetch origin 
git rebase --onto origin/foo e foo 

यह आपको देता है:

a---b+c---d+e---f---p'---q'---r' (foo) 

तुम अब भी संघर्ष मिल सकता है, लेकिन वे वास्तविक संघर्ष किया जाएगा (पी/क्यू/आर और ए/बी + सी/डी + ई/एफ के बीच), और b/c के साथ विवादित बी/सी के कारण संघर्ष नहीं, आदि

उत्तर से लिया (और थोड़ा संशोधित):
http://gitolite.com/git-pull--rebase

+6

यह सबसे अच्छा जवाब है। आप अंतिम परिणाम को 'ए --- बी + सी --- डी + ई --- एफ --- पी' --- क्यू '--- आर' (फू) 'में बदलना चाहते हैं क्योंकि रीबेज चेंज हैंश । – Bastien

+1

बदल गया, यह इंगित करने के लिए धन्यवाद कि @Bastien –

+9

इस उत्तर की प्रतिलिपि बनाई गई थी और http://gitolite.com/git-pull--rebase से शब्दशः चिपकाया गया था और उस पृष्ठ पर लाइसेंस के प्रति एट्रिब्यूशन शामिल होना चाहिए। – Wildcard

5

इसके लिए मर्ज और rebase के बीच का अंतर समझना महत्वपूर्ण है।

रीबेस इस प्रकार हैं कि पदानुक्रम के शीर्ष से नीचे में परिवर्तन कैसे पारित किए जाएंगे और विलय वे ऊपर की ओर कैसे प्रवाह करते हैं।

जानकारी के लिए संदर्भ लें - http://www.derekgourlay.com/archives/428

+0

मुझे लगता है कि आपका उत्तर एक बहुत ही सरल व्याख्या प्रदान करता है जो उपरोक्त उत्तरों के बाकी हिस्सों पर स्पष्ट नहीं है। धन्यवाद। –

+0

आपका स्वागत है @Aron C –

30

मान लीजिए आप स्थानीय शाखा में दो करता है:

 D---E master 
    /
A---B---C---F origin/master 

के बाद "Git पुल", हो जाएगा:

 D--------E 
    /  \ 
A---B---C---F----G master, origin/master 

"Git के बाद पुल --rebase ", कोई विलय बिंदु जी होगा। ध्यान दें कि डी और ई अलग-अलग काम करता है:

A---B---C---F---D'---E' master, origin/master 
+0

यह ए --- बी --- सी --- डी '--- ई' - एफ नहीं है? – prgmrDev

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