रिबासिंग और रिबासिंग से किसी को क्या मतलब होता है


109

यह अक्सर कहा जाता है कि, आपको उन प्रतिबद्धताओं का खंडन नहीं करना चाहिए जिन्हें आपने पहले ही धक्का दे दिया है। इसका क्या मतलब हो सकता है?

जवाबों:


80

ProGit किताब एक है अच्छा विवरण

आपके प्रश्न का विशिष्ट उत्तर " द पेरिल्स ऑफ रीबासिंग " नामक अनुभाग में पाया जा सकता है । उस सेक्शन का एक उद्धरण:

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

अपडेट:
नीचे दी गई आपकी टिप्पणी के आधार पर, ऐसा लगता है कि आपके जीआईटी वर्कफ़्लो के साथ कठिनाई हो रही है। यहां कुछ संदर्भ दिए गए हैं जो मदद कर सकते हैं:


स्पष्टीकरण के लिए धन्यवाद। इसलिए, अपनी समझ को स्पष्ट करने के लिए, कुछ बदलावों को धकेलने के बाद, मुझे git rebaseउस इतिहास को फिर से लिखने के लिए (--interactive?) का उपयोग नहीं करना चाहिए , यह निश्चित रूप से विफल होने का नुस्खा है। यदि मैं विषय में कुछ बदलावों को अस्वीकार कर चुका हूँ, तो शाखा (शाखा X से) और इसे धक्का दे, इसकी पूरी तरह से फिर से एक और डेवलपर विषय शाखा को बदलने के बाद फिर से रिबास करना। अनिवार्य रूप से, मैं mergeकाफी समय से उपयोग कर रहा हूं , लेकिन हम उसी नाव में हैं, जैसे darwinweb.net/articles/86 और इतिहास लगभग अनुपयोगी है।
हेमंत कुमार

@ हेमंत: सार्वजनिक रेपो पर जोर देने के बाद रिबासिंग आम तौर पर एक बुरा विचार है। कहा जा रहा है, अगर आपके वर्कफ़्लो उनके जैसा दिखता है, तो डार्विनवीब लेख से सलाह उचित लगती है। अन्य संदर्भों की सूची के लिए मेरी अद्यतन प्रतिक्रिया देखें जो मदद कर सकती हैं।
टिम हेनिगन

कृपया "प्राइवेट मैनेज
Eimantas

तो तकनीकी रूप से, जीआईटी कमिट्स एक जैसे ही रहते हैं लेकिन "मौजूदा कॉमन को छोड़ना और नए को बनाना जो कि सिम्मिलर हैं, लेकिन अलग-अलग हैं" केवल अलग-अलग sha1 id के साथ एक ही कमिटमेंट हैं? अच्छी तरह से यह एकमात्र स्पष्ट तरीका होगा जिसके बारे में मैं सोच सकता हूं कि क्यों सहयोगियों को अपने काम को फिर से मर्ज करना पड़ता है!
काइस्टो पाइर्ज़

@Ciastopiekarz, इसका कारण यह है कि आप अपस्ट्रीम रेपो में इतिहास का पुनर्लेखन कर रहे हैं, और अन्य डेवलपर के स्थानीय रिपॉजिट में इसके संकेत हो सकते हैं। अब उनके संकेत बासी हो गए हैं: git क्लाइंट के पास पुराने पॉइंटर्स का उपयोग करने के लिए और कोई विकल्प नहीं है और बाकी हिस्सों को छाँटने के लिए मानव पर भरोसा करें। यह एक फिर से मर्ज है, और यह बहुत भ्रामक परिवर्तनों के साथ गड़बड़ हो सकता है जिन्हें मैन्युअल रूप से सुलझाया जाना चाहिए! इस प्रकार अनुशंसा कुछ भी है कि पहले से ही एक अपस्ट्रीम रेपो को धकेल दिया गया है नहीं है। यह अच्छी सलाह है और इसे नजरअंदाज नहीं किया जाना चाहिए जब तक कि आप गहन ज्ञान के विशेषज्ञ न हों।
फोरबिन

240

इसे समझने के लिए, हमें थोड़ा समझने की आवश्यकता है कि गिट कैसे काम करता है। गिट रिपॉजिटरी एक पेड़ की संरचना है, जहां पेड़ के नोड्स कमिट होते हैं। यहाँ एक बहुत ही सरल भंडार का उदाहरण दिया गया है: जब तुमने कांटा लगाया

इसकी चार शाखाएँ मास्टर शाखा पर हैं, और प्रत्येक कमिट में एक आईडी है (इस मामले में, ए, बी, सी और डी)। आप देखेंगे कि d वर्तमान में मास्टर शाखा का नवीनतम कमिट (या HEAD) है। यहां छवि विवरण दर्ज करें

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

तो चलिए बताते हैं कि मेरी ब्रांच बासी हो गई है, और आप इसे मास्टर के नवीनतम संस्करण के साथ अद्यतित करना चाहते हैं। इसे दूसरे तरीके से रखने के लिए, मेरी शाखा को c और d सम्‍मिलित करना होगा। आप एक मर्ज कर सकते हैं, लेकिन इससे शाखा में अजीब मर्ज होने लगते हैं जो पुल अनुरोध की समीक्षा करना अधिक कठिन बना देते हैं। इसके बजाय, आप एक रिबेस कर सकते हैं।

यहां छवि विवरण दर्ज करें

जब आप रीबेस करते हैं, तो git आपकी शाखा का आधार ढूंढता है (इस मामले में, b), उस आधार और HEAD (इस मामले में, e और f) के बीच सभी कमिट्स पाता है, और शाखा के HEAD पर उन कमियों को फिर से खेलता है। आप (इस मामले में, मास्टर) पर रिबास कर रहे हैं। Git वास्तव में नए कमिट बनाता है जो यह दर्शाता है कि आपके परिवर्तन मास्टर के ऊपर क्या दिखते हैं: आरेख में, इन कमिटों को ई ′ और f ′ कहा जाता है। Git आपके पिछले कमिट्स को मिटाता नहीं है: ई और एफ को अछूता छोड़ दिया जाता है, और अगर कुछ गलत हो जाता है, तो आप सही तरीके से वापस जा सकते हैं जिस तरह से चीजें होती थीं।

जब कई अलग-अलग लोग अनुकरणीय रूप से एक परियोजना पर काम कर रहे हैं, तो पुल अनुरोध जल्दी से बासी जा सकते हैं। एक "बासी" पुल अनुरोध वह है जो अब विकास की मुख्य रेखा के साथ अद्यतित नहीं है, और इसे परियोजना में विलय करने से पहले इसे अपडेट करने की आवश्यकता है। सबसे आम कारण है कि पुल अनुरोधों का बासी होना संघर्षों के कारण होता है: यदि दो पुल अनुरोधों को एक ही फाइल में समान पंक्तियों को संशोधित करते हैं, और एक पुल अनुरोध को विलय कर दिया जाता है, तो अनमैरिड पुल अनुरोध अब एक संघर्ष होगा। कभी-कभी, एक पुल अनुरोध संघर्ष के बिना बासी जा सकता है: शायद कोडबेस में एक अलग फ़ाइल में बदलावों को नए आर्किटेक्चर के अनुरूप करने के लिए आपके पुल अनुरोध में संबंधित परिवर्तनों की आवश्यकता होती है, या शायद शाखा तब बनाई गई थी जब किसी ने गलती से विलय इकाई परीक्षणों में विलय कर दिया था मास्टर शाखा। कारण चाहे जो भी हो,


68

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

षड्यंत्र वास्तव में एक साथ रखना कठिन है, इसलिए आप पहले से सार्वजनिक शाखाओं को पुन: व्यवस्थित करने से बचते हैं।

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


4
+1। मुझे लगता है कि pugit.it की शाखा एक (सार्वजनिक) वर्कफ़्लो में रिबेस का उपयोग करने का एक अत्यंत सहायक उदाहरण है। इसके साथ परिचित न होने वालों के लिए, सामान्य विचार विषय शाखाओं को फिर से तैयार करना है, जिसमें next(मास्टर करने के लिए विलय से पहले अस्थिर शाखा) में कोई कमिट नहीं है , फिर सभी विषय शाखाओं puको रीसेट nextकरके और विलय करके शाखा का पुनर्निर्माण करें । (स्रोत: डॉक्यूमेंटेशन / हाउटो / मेंटेनेंस- git.txt git.kernel.org/?p=git/git.git;a=blob;f=Documentation/howto/… )
Cascabel

25
+1 के लिए "रीटेरिट हिस्ट्री इन गिट यह ठीक उसी तरह काम करता है जैसे यह वास्तविक दुनिया में करता है: आपको एक साजिश की जरूरत है"
स्लीपर स्मिथ

"सार्वजनिक घोषणा आवश्यक नहीं है क्योंकि पु एक फेंक-दूर शाखा है, जैसा कि ऊपर वर्णित है।" git-scm.com/docs/gitworkflows हम काम पर कुछ ऐसा ही करते हैं, " TEMP- कुछ-नवीनतम" एक फेंक दूर शाखा है जो नवीनतम परिवर्तनों का एक संयोजन है, यह कई फीचर शाखाओं का एक विलय हो सकता है, हटाया जा सकता है और किसी भी समय पर फिर से बनाया गया है और इसे विकसित नहीं किया जाना चाहिए।
पायलट

6

एक रिबेस आपके रिपॉजिटरी के इतिहास को बदल देता है। यदि आप दुनिया से बाहर निकलते हैं, यानी उन्हें दूसरों के लिए उपलब्ध कराते हैं, और फिर आप प्रतिबद्ध इतिहास के बारे में अपना दृष्टिकोण बदलते हैं, तो आपके पुराने इतिहास वाले किसी भी व्यक्ति के साथ काम करना मुश्किल हो जाता है।

रिबेस को हानिकारक माना जाता है, यह एक अच्छा अवलोकन है, मुझे लगता है।

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