मैं सिर्फ यह नहीं समझ सकता। मैं वेब और किताबों पर बहुत कुछ पढ़ रहा हूं और कुछ मेरे दिमाग में नहीं है। क्या कोई मुझे निम्नलिखित का डमी संस्करण दे सकता है:
- git fetch बनाम पुल
- git मर्ज बनाम रिबेस
मैं सिर्फ यह नहीं समझ सकता। मैं वेब और किताबों पर बहुत कुछ पढ़ रहा हूं और कुछ मेरे दिमाग में नहीं है। क्या कोई मुझे निम्नलिखित का डमी संस्करण दे सकता है:
जवाबों:
fetch दूरस्थ * शाखा से कोई भी परिवर्तन डाउनलोड करेगा, अपने रिपॉजिटरी डेटा को अपडेट करेगा, लेकिन आपके स्थानीय * शाखा को अपरिवर्तित छोड़ देगा।
pullआपके स्थानीय शाखा में परिवर्तन fetchऔर अतिरिक्त प्रदर्शन करेगा merge।
क्या फर्क पड़ता है? pullआपको खींची गई शाखा से परिवर्तन के साथ स्थानीय शाखा को अपडेट करता है। A fetchआपकी स्थानीय शाखा को आगे नहीं बढ़ाता है।
निम्नलिखित इतिहास को देखते हुए:
सी --- डी --- ई स्थानीय
/
ए --- बी --- एफ --- जी रिमोट
mergeदो विकास इतिहास को एक साथ जोड़ता है। यह दूरस्थ शाखा के शीर्ष पर विचलन के बाद आपकी स्थानीय शाखा में होने वाले परिवर्तनों को फिर से दोहराता है, और परिणाम को एक नई प्रतिबद्धता में दर्ज करता है। यह ऑपरेशन प्रत्येक प्रतिबद्ध के वंश को संरक्षित करता है।
होगा का प्रभाव merge:
सी --- डी --- ई स्थानीय
/ \ _
ए --- बी --- एफ --- जी --- एच रिमोट
rebaseआपकी स्थानीय शाखा में मौजूद कमिट्स लेगा और रिमोट ब्रांच के शीर्ष पर उन्हें फिर से लागू करेगा। यह ऑपरेशन आपके स्थानीय कमिट के पूर्वजों को फिर से लिखता है।
होगा का प्रभाव rebase:
सी '- डी' - ई 'स्थानीय
/
ए --- बी --- एफ --- जी रिमोट
क्या फर्क पड़ता है? A merge, आवागमन के पूर्वजों को नहीं बदलता है। एक rebase
अपने स्थानीय प्रतिबद्ध के वंश का पुनर्लेखन।
*इस विवरण मानता है कि वर्तमान शाखा एक स्थानीय शाखा है, और उस शाखा तर्क के रूप में निर्दिष्ट fetch, pull, merge, या rebaseएक दूरस्थ शाखा है। यह सामान्य मामला है। pull, उदाहरण के लिए, निर्दिष्ट शाखा से कोई भी परिवर्तन डाउनलोड करेगा , अपनी रिपॉजिटरी और वर्तमान शाखा mergeमें परिवर्तन को अपडेट करेगा ।
खींचो बनाम खींचो
Git fetch आपके रेपो डेटा को केवल अपडेट करता है, लेकिन एक git पुल मूल रूप से एक भ्रूण का प्रदर्शन करेगा और फिर खींची गई शाखा को मर्ज करेगा
'गिट पुल' और 'गिट भ्रूण' में क्या अंतर है?
मर्ज बनाम रिबेस
एटलसियन सोर्सट्री ब्लॉग से, मर्ज या रिबेस :
विलय प्रत्येक प्रतिबद्ध इतिहास की वंशावली को संरक्षित करते हुए विकास की दो पंक्तियों को एक साथ लाता है।
इसके विपरीत, रिबासिंग स्रोत शाखा से परिवर्तन को फिर से लिखकर विकास की रेखाओं को एकजुट करता है ताकि वे गंतव्य शाखा के बच्चों के रूप में दिखाई दें - प्रभावी रूप से यह दिखाते हुए कि उन सभी को गंतव्य शाखा के शीर्ष पर लिखा गया था।
इसके अलावा, जानें गिट ब्रांचिंग , जो एक अच्छा गेम है जिसे अभी हैकरन्यूज़ (पोस्ट करने के लिए लिंक ) पर पोस्ट किया गया है और बहुत सारे ब्रांचिंग और मर्जिंग गुर सिखाता है। मुझे विश्वास है कि यह इस मामले में बहुत मददगार होगा।
git merge <remote>/<branch>। उदाहरण के लिए, यदि आपकी मास्टर शाखा है और आपके रिमोट का नाम उत्पत्ति है, तो आप कर सकते हैं git merge origin/master।
खींचो बनाम लाओ :
जिस तरह से मैं यह समझता हूं, git pullवह बस git fetchइसके बाद है git merge। यानी आप एक दूरस्थ शाखा से परिवर्तन लाते हैं और फिर इसे वर्तमान शाखा में विलय कर देते हैं।
मर्ज बनाम रिबेस :
कमांड के अनुसार एक मर्ज करेगा; वर्तमान शाखा और निर्दिष्ट शाखा (वर्तमान शाखा में) के बीच के अंतर को मर्ज करें। यानी कमान वर्तमान शाखा में git merge another_branchविलय another_branchहो जाएगी ।
एक रिबास थोड़ा अलग तरीके से काम करता है और एक तरह का शांत होता है। मान लीजिए कि आप कमांड करते हैं git rebase another_branch। Git को वर्तमान शाखा के बीच नवीनतम नवीनतम संस्करण मिलेगा another_branch। बिंदुओं को मोड़ने से पहले Ie। फिर git इस डाइवर्जेंट पॉइंट को हेड के पास ले जाएगा another_branch। अंत में, मूल डायवर्जेंट बिंदु के बाद से वर्तमान शाखा में सभी हिट नए डाइवर्जेंट बिंदु से फिर से शुरू हो जाते हैं । यह बहुत साफ इतिहास बनाता है, कम शाखाओं और विलय के साथ।
हालांकि, यह नुकसान के बिना नहीं है! चूंकि संस्करण इतिहास "पुनर्लेखन" है, इसलिए आपको केवल यही करना चाहिए, यदि आपके स्थानीय गिट रेपो में केवल कमिट मौजूद है। वह है: कभी भी ऐसा न करें यदि आपने कमिट्स को रिमोट रेपो में धकेल दिया है।
इस ऑनलाइन पुस्तक में दिए गए रिबासिंग पर स्पष्टीकरण काफी अच्छा है, जिसमें आसानी से समझने वाले चित्र हैं।
मर्ज के बजाय रिबासिंग के साथ खींचो
मैं वास्तव में रिबास का काफी उपयोग कर रहा हूं, लेकिन आमतौर पर यह पुल के संयोजन में होता है:
git pull --rebase
दूरस्थ परिवर्तनों को लाएगा और फिर मर्ज के बजाय पुन: उत्पन्न करेगा। यानी पिछली बार जब आप एक पुल का प्रदर्शन करते हैं, तो यह आपके सभी स्थानीय कमिटों को फिर से दिखाएगा। मुझे विलय के साथ एक सामान्य खींचने की तुलना में यह बहुत साफ लगता है, जो विलय के साथ एक अतिरिक्त प्रतिबद्ध पैदा करेगा।
मर्ज - HEAD शाखा एक नई प्रतिबद्धता उत्पन्न करेगी, प्रत्येक प्रतिबद्ध इतिहास की वंशावली को संरक्षित करेगी। इतिहास को प्रदूषित किया जा सकता है यदि विलय कई लोगों द्वारा किया जाता है जो समानांतर में एक ही शाखा पर काम करते हैं।
रीबेस - एक नई प्रतिबद्ध बनाने के बिना एक शाखा के परिवर्तन को दूसरे पर फिर से लिखते हैं। कोड इतिहास सरलीकृत, रैखिक और पठनीय है लेकिन यह पुल अनुरोधों के साथ काम नहीं करता है, क्योंकि आप यह नहीं देख सकते हैं कि किसी ने क्या मामूली बदलाव किए हैं।
मैं git mergeसुविधा-आधारित वर्कफ़्लो से निपटने के लिए उपयोग करूँगा या यदि मैं रिबेस से परिचित नहीं हूँ। लेकिन, अगर मुझे अधिक स्वच्छ, रैखिक इतिहास चाहिए तो git rebaseअधिक उपयुक्त है। अधिक जानकारी के लिए इस मर्ज या रिबेस के लेख को देखना सुनिश्चित करें ।