Git में, पुल से अलग कैसे लाया जाता है और रिबेस से अलग कैसे मर्ज किया जाता है?


160

मैं सिर्फ यह नहीं समझ सकता। मैं वेब और किताबों पर बहुत कुछ पढ़ रहा हूं और कुछ मेरे दिमाग में नहीं है। क्या कोई मुझे निम्नलिखित का डमी संस्करण दे सकता है:

  • git fetch बनाम पुल
  • git मर्ज बनाम रिबेस

24
मुझे प्रश्नकर्ता से सहानुभूति है। प्रलेखन और सलाह इतनी भारी और संभव वर्कफ़्लो क्रमपरिवर्तन इतने बड़े पैमाने पर है कि व्यक्ति बेहद भ्रमित हो जाता है। सिर बस विस्फोट हो गया और किसी को पता नहीं है कि क्या पूछना है, यह अभी स्पष्ट नहीं है।
एड रान्डेल

3
स्वीकार किए जाते हैं कि क्यों नहीं pestrella जवाब का चयन?
21

@ ऐराशॉफ्ट क्योंकि वह 2013 से नहीं देखी जा रही है
VdeX

जवाबों:


415

लाने बनाम खींचना

fetch दूरस्थ * शाखा से कोई भी परिवर्तन डाउनलोड करेगा, अपने रिपॉजिटरी डेटा को अपडेट करेगा, लेकिन आपके स्थानीय * शाखा को अपरिवर्तित छोड़ देगा।

pullआपके स्थानीय शाखा में परिवर्तन fetchऔर अतिरिक्त प्रदर्शन करेगा merge

क्या फर्क पड़ता है? pullआपको खींची गई शाखा से परिवर्तन के साथ स्थानीय शाखा को अपडेट करता है। A fetchआपकी स्थानीय शाखा को आगे नहीं बढ़ाता है।

मर्ज बनाम छूट

निम्नलिखित इतिहास को देखते हुए:

          सी --- डी --- ई स्थानीय
         /
    ए --- बी --- एफ --- जी रिमोट

mergeदो विकास इतिहास को एक साथ जोड़ता है। यह दूरस्थ शाखा के शीर्ष पर विचलन के बाद आपकी स्थानीय शाखा में होने वाले परिवर्तनों को फिर से दोहराता है, और परिणाम को एक नई प्रतिबद्धता में दर्ज करता है। यह ऑपरेशन प्रत्येक प्रतिबद्ध के वंश को संरक्षित करता है।

होगा का प्रभाव merge:

          सी --- डी --- ई स्थानीय
         / \ _
    ए --- बी --- एफ --- जी --- एच रिमोट

rebaseआपकी स्थानीय शाखा में मौजूद कमिट्स लेगा और रिमोट ब्रांच के शीर्ष पर उन्हें फिर से लागू करेगा। यह ऑपरेशन आपके स्थानीय कमिट के पूर्वजों को फिर से लिखता है।

होगा का प्रभाव rebase:

                  सी '- डी' - ई 'स्थानीय
                 /
    ए --- बी --- एफ --- जी रिमोट

क्या फर्क पड़ता है? A merge, आवागमन के पूर्वजों को नहीं बदलता है। एक rebase अपने स्थानीय प्रतिबद्ध के वंश का पुनर्लेखन।

*इस विवरण मानता है कि वर्तमान शाखा एक स्थानीय शाखा है, और उस शाखा तर्क के रूप में निर्दिष्ट fetch, pull, merge, या rebaseएक दूरस्थ शाखा है। यह सामान्य मामला है। pull, उदाहरण के लिए, निर्दिष्ट शाखा से कोई भी परिवर्तन डाउनलोड करेगा , अपनी रिपॉजिटरी और वर्तमान शाखा mergeमें परिवर्तन को अपडेट करेगा ।


31
यह अब तक प्रत्येक अभ्यास के पीछे बहस में जाने के बिना सबसे सरल और सबसे अच्छा स्पष्टीकरण है। धन्यवाद!
जोनाथन एस। फिशर

3
बिल्कुल सुनहरा जवाब
चेसमॉस्कल

5
काश मैं इस जवाब को "पसंदीदा" कर पाता। शायद मैं इसे प्रिंट कर सकता हूं और इसे अपनी दीवार पर टेप कर सकता हूं।
लार्स

2
मैं सबसे अच्छे जवाबों के बारे में कहूंगा, जो मैंने स्टैकओवरफ्लो में प्राप्त किए हैं, धन्यवाद
शहाब जे

1
यदि केवल दूरस्थ शाखा से परिवर्तन डाउनलोड होता है और रिपॉजिटरी डेटा को अपडेट करता है, लेकिन स्थानीय शाखा को अपरिवर्तित छोड़ देता है, तो कार्यशील निर्देशिका परिवर्तनों को नहीं दिखाती / दर्शाती है, तो इसे लाने का क्या मतलब है? मेरा सवाल मूल रूप से यह था कि मैं किसी और के द्वारा किए गए परिवर्तनों को कैसे देख सकता हूं और फिर तय करूंगा कि क्या मैं उन्हें अपनी कार्यशील निर्देशिका में विलय करना चाहता हूं (अर्थात यह सुनिश्चित करने के लिए कि अन्य लोगों के परिवर्तनों के साथ प्रयोग करना मेरे काम को नहीं तोड़ता) लेकिन मैं अभी भी हूं उलझन में है कि कैसे करें? क्या मुझे सिर्फ पल्स और प्रयोग / अन्वेषण करना चाहिए, और यदि यह समस्याग्रस्त था, तो हार्ड रीसेट करें?

28

खींचो बनाम खींचो

Git fetch आपके रेपो डेटा को केवल अपडेट करता है, लेकिन एक git पुल मूल रूप से एक भ्रूण का प्रदर्शन करेगा और फिर खींची गई शाखा को मर्ज करेगा

'गिट पुल' और 'गिट भ्रूण' में क्या अंतर है?


मर्ज बनाम रिबेस

एटलसियन सोर्सट्री ब्लॉग से, मर्ज या रिबेस :

विलय प्रत्येक प्रतिबद्ध इतिहास की वंशावली को संरक्षित करते हुए विकास की दो पंक्तियों को एक साथ लाता है।

इसके विपरीत, रिबासिंग स्रोत शाखा से परिवर्तन को फिर से लिखकर विकास की रेखाओं को एकजुट करता है ताकि वे गंतव्य शाखा के बच्चों के रूप में दिखाई दें - प्रभावी रूप से यह दिखाते हुए कि उन सभी को गंतव्य शाखा के शीर्ष पर लिखा गया था।

इसके अलावा, जानें गिट ब्रांचिंग , जो एक अच्छा गेम है जिसे अभी हैकरन्यूज़ (पोस्ट करने के लिए लिंक ) पर पोस्ट किया गया है और बहुत सारे ब्रांचिंग और मर्जिंग गुर सिखाता है। मुझे विश्वास है कि यह इस मामले में बहुत मददगार होगा।


धन्यवाद फेलिप्स .. तो अगर मैं एक रिमोट से एक मास्टर करूँ तो मेरी मास्टर ब्रांच में अपडेट नहीं होंगे? यह भी लगता है जैसे मुझे और अधिक करना चाहिए फिर merga
techsjs2013

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

git merge <remote>/<branch>। उदाहरण के लिए, यदि आपकी मास्टर शाखा है और आपके रिमोट का नाम उत्पत्ति है, तो आप कर सकते हैं git merge origin/master
फेलिप सबिनो

तो ऐसा लगता है कि मुझे हमेशा एक git चेकआउट मास्टर git fetch git diff
Origin

8

खींचो बनाम लाओ :

जिस तरह से मैं यह समझता हूं, 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

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


इसलिए अगर मैं और शाखा में काम कर रहा हूं और इससे पहले कि मैं एक धक्का दूं, मैं इसे वापस मास्टर में मिलाना चाहता हूं। मुझे मास्टर चेकआउट करना चाहिए, फिर रिबेट फिक्स प्राप्त करना चाहिए?
techsjs2013

मैं अभी भी स्टैंड के तहत मर्ज बनाम रिबेस नहीं करता हूं
techsjs2013

मुझे लगता है कि पेस्ट्रेला के उत्तर द्वारा प्रदान किए गए चित्र काफी स्पष्ट रूप से अंतर दिखाते हैं। इसके अलावा, बाहर की जाँच करें: git-scm.com/book/en/Git-Branching-Rebasing - जो इसे समझाने का एक बहुत ही अच्छा काम करता है (उत्तर में एक ही लिंक है, लेकिन आलसी लोगों के लिए फिर से दिया गया है)।
स्टीनर

0

मर्ज - HEAD शाखा एक नई प्रतिबद्धता उत्पन्न करेगी, प्रत्येक प्रतिबद्ध इतिहास की वंशावली को संरक्षित करेगी। इतिहास को प्रदूषित किया जा सकता है यदि विलय कई लोगों द्वारा किया जाता है जो समानांतर में एक ही शाखा पर काम करते हैं।

रीबेस - एक नई प्रतिबद्ध बनाने के बिना एक शाखा के परिवर्तन को दूसरे पर फिर से लिखते हैं। कोड इतिहास सरलीकृत, रैखिक और पठनीय है लेकिन यह पुल अनुरोधों के साथ काम नहीं करता है, क्योंकि आप यह नहीं देख सकते हैं कि किसी ने क्या मामूली बदलाव किए हैं।

मैं git mergeसुविधा-आधारित वर्कफ़्लो से निपटने के लिए उपयोग करूँगा या यदि मैं रिबेस से परिचित नहीं हूँ। लेकिन, अगर मुझे अधिक स्वच्छ, रैखिक इतिहास चाहिए तो git rebaseअधिक उपयुक्त है। अधिक जानकारी के लिए इस मर्ज या रिबेस के लेख को देखना सुनिश्चित करें

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