चूँकि समय git cherry-pick
कई कमिट्स को लागू करने में सक्षम होने के लिए सीखा गया था, इसलिए वास्तव में यह अंतर कुछ हद तक मूट हो गया, लेकिन इसे अभिसरण विकास कहा जाता है;;
असली अंतर दोनों उपकरण बनाने के मूल इरादे में है:
git rebase
किसी कार्य को किसी निजी शाखा में, किसी अपस्ट्रीम शाखा के संस्करण X के विरुद्ध, उसी शाखा (Y> X) के संस्करण Y के लिए बनाए गए परिवर्तनों की एक श्रृंखला को फ़ॉरवर्ड-पोर्ट करना है। यह प्रभावी रूप से उस श्रृंखला के आधार को बदल देता है, इसलिए "रिबासिंग" होता है।
(यह डेवलपर को किसी भी मनमाने तरीके से कमिट की श्रृंखला को ट्रांसप्लांट करने की अनुमति देता है, लेकिन यह कम स्पष्ट उपयोग का है)
git cherry-pick
विकास की एक पंक्ति से दूसरी में एक दिलचस्प प्रतिबद्धता लाने के लिए है। एक क्लासिक उदाहरण एक अस्थिर विकास शाखा पर एक स्थिर (रखरखाव) शाखा पर किए गए सुरक्षा फिक्स का समर्थन कर रहा है, जहां merge
कोई मतलब नहीं है, क्योंकि यह बहुत सारे अवांछित बदलाव लाएगा।
अपनी पहली उपस्थिति के बाद से git cherry-pick
, एक-एक करके कई कमिट्स लेने में सक्षम है।
इसलिए, संभवतः इन दो आदेशों के बीच सबसे अलग अंतर यह है कि वे उस शाखा का इलाज कैसे करते हैं जिस पर वे काम करते हैं: git cherry-pick
आमतौर पर कहीं और से एक प्रतिबद्ध लाता है और इसे आपकी वर्तमान शाखा के शीर्ष पर लागू करता है, एक नई प्रतिबद्धता दर्ज करते हुए, git rebase
आपकी वर्तमान शाखा लेता है और फिर से लिखता है। अपने स्वयं के टिप की एक श्रृंखला एक तरह से या किसी अन्य तरीके से शुरू होती है। हां, यह सामान्य रूप से डूबा हुआ वर्णन है कि क्या git rebase
कर सकते हैं, लेकिन यह सामान्य विचार को सिंक में रखने की कोशिश करने के लिए जानबूझकर किया गया है।
git rebase
चर्चा किए जाने के उपयोग का एक उदाहरण समझाने के लिए अपडेट करें ।
इस स्थिति को देखते हुए,
पुस्तक बताती है:
हालांकि, एक और तरीका है: आप उस परिवर्तन का पैच ले सकते हैं जिसे C3 में पेश किया गया था और इसे C4 के शीर्ष पर फिर से लागू किया। गिट में, इसे रिबासिंग कहा जाता है। रीबेस कमांड के साथ, आप उन सभी परिवर्तनों को ले सकते हैं जो एक शाखा पर किए गए थे और उन्हें दूसरे पर लागू किया गया था।
इस उदाहरण में, आप निम्न कार्य करेंगे:
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
यहां "पकड़" यह है कि इस उदाहरण में, "प्रयोग" शाखा (रिबासिंग के लिए विषय) को मूल रूप से "मास्टर" शाखा से कांटा गया था, और इसलिए यह इसके साथ C2 के माध्यम से C0 साझा करता है - प्रभावी रूप से, "प्रयोग" है " मास्टर "ऊपर, और सहित, C2 प्लस इसके ऊपर C3 प्रतिबद्ध है। (यह सबसे सरल संभव मामला है; निश्चित रूप से, "प्रयोग" में इसके मूल आधार के ऊपर कई दर्जनों कमिट हो सकते हैं।)
अब "मास्टर" git rebase
की वर्तमान टिप पर "प्रयोग" को रीबेस करने के लिए कहा git rebase
जाता है , और इस तरह से जाता है:
git merge-base
यह देखने के लिए दौड़ता है कि "प्रयोग" और "मास्टर" (दूसरे शब्दों में, डायवर्सन का क्या मतलब है) दोनों द्वारा साझा की गई अंतिम प्रतिबद्धता है। यह C2 है।
- डायवर्जन बिंदु के बाद से किए गए सभी कमिट को बचाता है; हमारे खिलौना उदाहरण में, यह सिर्फ C3 है।
- "मास्टर" की नोक पर इंगित करने के लिए HEAD (जो कि "प्रयोग" के टिप कमिट की ओर इशारा करता है) को "मास्टर" की ओर इंगित करता है - हम इस पर रिबास कर रहे हैं।
- सहेजे गए प्रत्येक कमिट को लागू करने की कोशिश करता है (जैसे कि यदि
git apply
) क्रम में। हमारे खिलौना उदाहरण में यह सिर्फ एक प्रतिबद्ध है, सी 3। मान लीजिए कि इसका एप्लिकेशन एक प्रतिबद्ध C3 का उत्पादन करेगा। '
- यदि सब ठीक हो जाता है, तो "प्रयोग" संदर्भ को अंतिम रूप से सहेजे गए कमेंट (हमारे मामले में C3) को लागू करने के परिणामस्वरूप प्रतिबद्ध करने के लिए अद्यतन किया जाता है।
अब वापस अपने सवाल पर। जैसा कि आप देख सकते हैं, यहां तकनीकी रूप से git rebase
वास्तव में "प्रयोग" से "मास्टर" की नोक पर आने वाली श्रृंखलाओं का प्रत्यारोपण किया जाता है, इसलिए आप सही तरीके से बता सकते हैं कि वास्तव में प्रक्रिया में "एक और शाखा" है। लेकिन यह है कि टिप "प्रयोग" से प्रतिबद्ध है, "प्रयोग" में नई टिप प्रतिबद्ध होने से समाप्त हो गई, बस इसका आधार बदल गया:
फिर, तकनीकी रूप से आप यह बता सकते हैं कि git rebase
यहां "मास्टर" से कुछ निश्चित तरीके शामिल हैं, और यह बिल्कुल सही है।