गिट पुल और गिट पुल - क्रेबेज के बीच अंतर


311

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

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




जवाबों:


326

git pull= git fetch+ git mergeअपस्ट्रीम शाखा की ट्रैकिंग के खिलाफ

git pull --rebase= git fetch+ git rebaseअपस्ट्रीम शाखा की ट्रैकिंग के खिलाफ

यदि आप जानना चाहते हैं कि कैसे git mergeऔर क्या git rebaseअंतर है, तो इसे पढ़ें


12
यह ध्यान देने योग्य है कि कहावत git pull --rebaseसमान है git fetchऔर git rebaseमूल रूप से यह कैसी है, लेकिन यह शब्दार्थ के समकक्ष नहीं है । कुछ अंतर हैं, जिनमें से कुछ यहां बताए गए हैं। gitolite.com/git-pull--rebase
w0rp

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

बहुत संक्षिप्त रूप से। मैं अंतर नहीं समझ सकता। इतना महत्वपूर्ण क्या है fetch?
ग्रीन

240

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

जादू है git pull --rebase

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

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

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

git fetch origin
git rebase origin/foo

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

जिसका मतलब है कि git pull --rebase को इससे थोड़ा ज्यादा करना है। यहां यह बताया गया है कि यह क्या और कैसे करता है।

मान लीजिए कि आपका प्रारंभिक बिंदु यह है:

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

समय बीतता है, और आपने अपने स्वयं के "फू" के ऊपर कुछ कमिट किए हैं:

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

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

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

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

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

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

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

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

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

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


9
यह सबसे अच्छा जवाब है। आप अंतिम परिणाम को बदलना चाहते हैं a---b+c---d+e---f---p'---q'---r' (foo)क्योंकि रिबास परिवर्तन हैश करता है।
बैस्टियन

22
इस उत्तर को gitolite.com/git-pull--rebase से कॉपी और पेस्ट किया गया था और उस पृष्ठ पर लाइसेंस के अनुसार रोपण को शामिल करना चाहिए।
वाइल्डकार्ड

यह एक महान व्याख्या है। लेकिन मेरे पास एक स्थिति थी, जहां मैंने कमिट किया था A, और मैंने एक पीआर को अपस्ट्रीम रेपो में भेज दिया जिसे स्वीकार कर लिया गया। फिर जब मैंने git pull --rebaseअपस्ट्रीम रेपो के खिलाफ किया , तो मुझे ऊपर की ओर रेपो रेस्ट के ऊपर एक नई A'प्रतिबद्धता नहीं मिली । वास्तव में कोई A'अस्तित्व में नहीं था। क्या यह इसलिए है क्योंकि Aसिस्टम में विलय कर दिया गया था? या यह इसलिए है क्योंकि संस्करण पर अपस्ट्रीम और मेरे विद्रोह के बीच कोई अंतर नहीं था?
CMCDragonkai

मैं वर्तमान में Git ट्यूटोरियल से गुजर रहा हूं और इस प्रतिक्रिया को आगे समझने के लिए उपयोग कर रहा हूं git pull --rebase। लेकिन एक चीज जो मुझे इस काल्पनिक स्थिति में भ्रमित करती है, वह यह है कि अपस्ट्रीम मेंटेनर ने प्रोजेक्ट इतिहास को बदल दिया है जिसे पहले से ही स्थानीय डेवलपर के रिपॉजिटरी में खींच लिया गया है। क्या यह सामान्य रूप से बुरा व्यवहार नहीं है? यदि वह इतिहास को लिखना / पुनः लिखना चाहता है, तो इस प्रकार के संघर्षों से बचने के लिए इसे केंद्रीय भंडार में एकीकृत करने से पहले किया जाना चाहिए था।
bmcentee148

44

मान लें कि आपके पास स्थानीय शाखा में दो आवागमन हैं:

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

"गिट पुल" के बाद, होगा:

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

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

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

1
क्या यह A --- B --- C --- D '--- E' - F नहीं है?
prgmrDev

5
@prgmrDev F से पहले D और E क्यों डाले जाएंगे?
जॉन

1
क्या यह ठीक नहीं git rebaseहै? लेकिन हम बात कर रहे हैं git pull --rebase। और वे अलग चीजें हैं।
ग्रीन

10

कोई टकराव के सबसे सरल मामले में

  • रिबास के साथ: आपके स्थानीय रिमोट हेड के ऑनटॉप को बंद कर देता है और मर्ज / मर्ज कमिट नहीं बनाता है
  • बिना / सामान्य: मर्ज करता है और एक मर्ज कमिट बनाता है

यह सभी देखें:

man git-pull

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

यह भी देखें:
मैं Git पुल --rebase उपयोग कब करना चाहिए?
http://git-scm.com/book/en/Git-Branching-Rebasing


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

1
आपको उन्हें मैन्युअल रूप से हल करने के लिए कहा जाएगा और फिरgit sdd modified-file; git rebase --continuegit add modified-file; git commit;modified-file
रिबास के

इसमें क्या खास है fetch? उन्होंने दो rebaseप्रवाह क्यों बनाए ? 1) git rebaseऔर 2) git pull --rebase?
ग्रीन

7

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

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

विवरण के लिए देखें - http://www.derekgourlay.com/archives/428


मुझे लगता है कि आपका उत्तर बहुत सरल व्याख्या प्रदान करता है जो ऊपर दिए गए बाकी उत्तरों पर स्पष्ट नहीं है। धन्यवाद।
आरोन सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.