क्या "रीबसिंग का स्वर्ण नियम" इतना आवश्यक है?


22

मैंने हाल ही में जीआईटी पर फीचर शाखाओं की रीबेस रणनीति के विरोध में लोगों के साथ चर्चा की। यह केवल स्थानीय, निजी शाखाओं के लिए रिबास का उपयोग करने के लिए एक स्वीकृत पैटर्न प्रतीत होता है, लेकिन कभी भी इसका उपयोग न करें जब एक ही फीचर और शाखा पर कई लोग काम कर रहे हों, जैसा कि इस तथाकथित "गोल्डन रूल ऑफ रीबासिंग" के अनुसार (जैसे यहां समझाया गया: https : //www.atlassian.com/git/tutorials/merging-vs-rebasing/conceptual-overview )

मुझे आश्चर्य है कि इस पर आम सहमति है। मैंने पूरी रिबासिंग रणनीति के साथ 3 साल काम किया, लगभग 20 डेवलपर्स ने एक साथ काम किया और अनुमान लगाया कि यह क्या काम करता है।

प्रक्रिया मूल रूप से है:

  • आप अपनी सुविधा शाखा बनाते हैं, इसे "myfeature" कहते हैं, और इसे मूल / myfeature पर धकेलते हैं
  • अन्य लोग इसे देख सकते हैं और इस पर काम कर सकते हैं
  • आप कभी-कभी इसे मास्टर से रिबेट कर सकते हैं: "मायफेट्योर" से, गिट रिबेस मूल / मास्टर से ; और फिर, हां, आपको इसे जोर-जबरदस्ती करना होगा।
  • क्या होता है जब अन्य लोग अपने कामों को आगे बढ़ाना चाहते हैं? वे बस इसे फिर से शुरू करते हैं: गिट रिबेस मूल / myfeature । इसलिए वे अब तेजी से आगे बढ़ रहे हैं और बिना जोर लगाए इसे आगे बढ़ा सकते हैं।

सम्मान करने का एकमात्र सिद्धांत यह है कि सुविधा शाखा किसी के स्वामित्व में है । मालिक एकमात्र ऐसा है जो धक्का-मुक्की कर सकता है।

इसलिए, मैं मानता हूं: जैसे ही कोई जोर-जबरदस्ती होती है, त्रुटियों को करने का जोखिम होता है। यह सच है। लेकिन त्रुटियों से उबरने के कई तरीके भी हैं, और वास्तव में, 3 साल के विकास में, मैंने बहुत अधिक बल-धक्का करने वाली गलतियों को नहीं देखा, और जब ऐसा हुआ तो हमने हमेशा ठीक से ठीक होने का एक तरीका ढूंढ लिया।

तो, इस "गोल्डन रूल ऑफ रिबेस" को इतने व्यापक रूप से क्यों स्वीकार किया जा रहा है? क्या कुछ और है जो मुझे याद है? मैं समझता हूं कि इसके लिए न्यूनतम संगठन की आवश्यकता है (प्रत्येक रणनीति के लिए कुछ संगठन की आवश्यकता होती है), लेकिन यह काम करता है।


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

क्या होगा यदि मैं किसी और की सुविधा शाखा को अपने में मर्ज करूं?
विंस्टन इवर्ट

यदि आपकी सुविधा एक दूसरे पर निर्भर है, तो मुझे लगता है कि आप दूसरे से अपना रिबास कर सकते हैं: git रिबास उत्पत्ति / अन्यफाइट्योर (मैं मर्ज के बजाय रिबास कहता हूं, क्योंकि लक्ष्य इतिहास को रैखिक रखना है)। मैं स्वीकार करता हूं कि जब आप शाखाओं के बीच अधिक से अधिक निर्भरता का परिचय देते हैं तो सभी की जटिलता बहुत बढ़ जाती है।
जोएल

जवाबों:


10

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

इस खतरे को देखते हुए, इसका एक कारण है कि आपको इसका उपयोग तब तक नहीं करना चाहिए जब तक कि चीजें खराब न हो जाएं और आप बिल्कुल, पूरी तरह से इसे सुधारने के लिए उपयोग करने की आवश्यकता हो। SCM प्रणाली को कभी भी इस तरह मजबूर होने की आवश्यकता नहीं होनी चाहिए, अगर यह ऐसा करता है क्योंकि कुछ बुरी तरह से गलत हो गया (और ऐसे मामलों में मेरा पहला दृष्टिकोण बैकअप को बहाल करना और इतिहास को अक्षुण्ण रखने के लिए संचालन को दोहराना होगा)।

तो शायद सवाल यह है कि आप आखिर क्यों पलटवार कर रहे हैं? 'स्वच्छ' इतिहास के लिए, जब मास्टर को वापस लाना है? यदि ऐसा है, तो आप विशुद्ध रूप से स्टाइल कारणों से ब्रांचिंग से संबंधित सभी अच्छे इतिहास को निकाल रहे हैं। IMHO फास्ट-फ़ॉरवर्ड मर्जिंग भी एक अच्छा अभ्यास नहीं है, आपको सभी इतिहास रखना चाहिए ताकि आप देख सकें कि आपने वास्तव में क्या किया था, इसके बाद एक संचित संस्करण नहीं।


आप निश्चित रूप से मास्टर, रिबास और फिर बल पुश पर खींच सकते हैं, लेकिन वह परमाणु नहीं है।
केविन

@ जीबीजैनब आप बिलकुल सही कह रहे हैं, रीबासिंग रणनीति सभी शैली कारणों / अधिक पठनीय इतिहास के बारे में है। मैं यह तर्क देने की कोशिश नहीं कर रहा हूं कि यह बेहतर है, या नहीं। लेकिन ऐसा करना संभव है, और यही वह बिंदु है जिसे मैं उठाना चाहता हूं। बेशक मैं मास्टर पर बल-पुश के बारे में बात नहीं कर रहा था, लेकिन केवल सुविधा शाखाओं पर।
जोएल

4
IMHO दोनों रीबेस के डिजाइन की सुविधा, और तेजी से आगे विलय एक गलती थी। SCM इतिहास रखने के बारे में है ताकि आप देख सकें कि जब आपको जरूरत हो तब क्या हुआ, और समय में प्रासंगिक बिंदुओं के लिए स्नैपशॉट लें। कम से कम यही है कि ज्यादातर लोग चाहते हैं, मुझे लगता है कि लिनुस चाहता था कि इतिहास उसके लिए जितना संभव हो उतना सरल पढ़ें और इसलिए उन्हें अपने लाभ के लिए डालें। IMHO को उन्होंने 2 बदलावों के बीच अंतर बनाने में अधिक प्रयास करना चाहिए था बजाय इसके अधिक प्रबंधनीय (यानी दृश्य को सरल बनाने की अनुमति दी, न कि अंतर्निहित इतिहास)
gbjbaanb

2
जब आप एक पेपर प्रकाशित करते हैं, तो क्या आप पहला ड्राफ्ट प्रकाशित करते हैं? क्या कोई कानून है जो कहता है कि उपकरण जो आप पहले मसौदे को लिखने के लिए उपयोग करते हैं, उसे प्रकाशन के लिए संपादित करने के लिए इस्तेमाल नहीं किया जा सकता है? Git एक विकास उपकरण है। यदि आप मज़बूती से और मौखिक रूप से एक श्रृंखला को संरक्षित करना चाहते हैं, तो इसे संरक्षित करें। यदि आप इसे प्रकाशन के लिए संपादित करने के बजाय चाहते हैं, तो इसे संपादित करें। दोनों कार्यों में गिट का तारकीय।
jthill

5

Rebase आवश्यक नहीं है, जैसा कि आप कहते हैं कि यह ज्यादातर कॉस्मेटिक है। कभी-कभी यह बहुत सरल होता है फिर मर्ज। तो इसके कुछ "वास्तविक" मूल्य हो सकते हैं, लेकिन केवल "कभी-कभी"

रिबास का अनुचित उपयोग महंगा हो सकता है। यदि आप घबराहट और रिकवरी प्रक्रियाओं को देखने के लिए पर्याप्त नहीं हैं, तो डेटा खोने के लिए अनजाने में, लेकिन "मुझे ठीक करने के लिए थोड़ी देर के लिए कोई भी धक्का नहीं देता ..." महान नहीं है। न ही किसी ने अनुसंधान वसूली और परीक्षण पर समय जलाया है जब वे सुविधाओं को जोड़ रहे थे या बग को नष्ट कर सकते थे (या परिवार के साथ घर)।

उस व्यापार से "बहुत कम लोग रिबेस और जबरन धक्का देते हैं" के परिणाम बहुत आश्चर्य की बात नहीं है।

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


3
"अरे कोई नहीं मुझे थोड़ी देर के लिए धक्का देना होगा ..." .. दृश्य स्रोत सुरक्षित का उपयोग करने के पुराने दिनों की तरह लगता है। मुझे लगा कि git इससे बेहतर है।
gbjbaanb

हां, इस प्रकार लोग "तेज उपकरणों के साथ नहीं खेलते हैं! (बल धक्का)" जैसे नियम बनाते हैं ताकि वे बचने वाले घावों का इलाज करने से बच सकें!
स्ट्रिप्स

2
@ जीबीजैनब हां, गिट इससे बेहतर है - जब आप इसका सही इस्तेमाल करते हैं। Git के बारे में शिकायत करना समवर्ती विकास से निपटने में असमर्थ होना जब आप लगातार विद्रोह कर रहे हैं और सब कुछ के प्रतिबद्ध हैश बदल रहा है कारों के बारे में शिकायत कर रहे हैं कारों के लिए अवर होने के नाते क्योंकि वे घोड़े को खींचने के लिए बहुत भारी हैं। यह इस उपकरण की गलती नहीं है कि लोग इसे गलत उपयोग करने पर जोर देते हैं ...
इदं आर्ये जु '24

4
वैसे यह उपकरण की गलती है। Git तेज किनारों का एक बहुत उजागर करता है, और कभी-कभी नोट करता है कि वे तेज हैं यह अक्सर नहीं होता है। यदि आप इसकी तुलना सीवीएस से करते हैं, जहां सभी तेज बिट्स एक सिंगल सबकमांड ("सीवीएस एडमिन" में हैं; तो इसमें थोड़ी देर है ...) यह कहने के लिए बाहर निकल जाता है कि "यह आपको बुरी तरह से काट सकता है, नहीं इसका उपयोग तब तक करें जब तक आपको सख्त जरूरत न हो ”। या अन्य संस्करण नियंत्रण प्रणालियां जो क्षमताओं को प्रभावित कर सकती हैं, को छोड़ देती हैं।
पट्टी

4
कहने का मतलब यह नहीं है कि जीआईटी ने वैध डिज़ाइन विकल्प नहीं बनाए हैं (उपकमांड द्वारा समूह संबंधी कार्यकलाप, और सही हाथों में अधिक जटिल चीजों को हल करने के लिए अनुमति देना पसंद करते हैं) ... लेकिन वे विकल्प हैं, और कोई भी महत्वपूर्ण हो सकता है पसंद करने के लिए इतने सारे तेज किनारों, बहुत की तरह एक अन्य VCSs की पसंद के लिए महत्वपूर्ण हो सकता है ताकि कई उपयोगी सुविधाओं को "सिर्फ इसलिए कि किसी को चोट लग सकती है"।
पट्टी

2

एक अलग आवाज जोड़ने के लिए:

हां, यदि आप वर्णन के अनुसार काम करते हैं, तो उपयोग करने rebaseऔर बल-पुश करने में कोई समस्या नहीं है । महत्वपूर्ण बिंदु यह है: आपकी टीम में एक समझौता है।

rebaseदोस्तों और दोस्तों के बारे में चेतावनी उस मामले के लिए है जहां कोई विशेष समझौता नहीं है। आम तौर पर, गिट आपको स्वचालित रूप से बचाता है, उदाहरण के लिए, गैर-फास्ट-फॉरवर्ड पुश की अनुमति नहीं देता है। उपयोग rebaseऔर बल-धक्का उस सुरक्षा को ओवरराइड करता है। यह ठीक है अगर आपके पास जगह कुछ और है।

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


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


1

इसलिए, मैं मानता हूं: जैसे ही कोई जोर-जबरदस्ती होती है, त्रुटियों को करने का जोखिम होता है। यह सच है। लेकिन त्रुटियों से उबरने के कई तरीके भी हैं, और वास्तव में, 3 साल के विकास में, मैंने बहुत अधिक बल-धक्का करने वाली गलतियों को नहीं देखा, और जब ऐसा हुआ तो हमने हमेशा ठीक से ठीक होने का एक तरीका ढूंढ लिया।

कारण यह है कि Git उपयोगकर्ता साझा किए गए परिवर्तनशील इतिहास से बचने के लिए करते हैं क्योंकि इन समस्याओं का कोई स्वचालित परिहार या मरम्मत नहीं है। आपको यह जानना होगा कि आप क्या कर रहे हैं, और यदि आप गड़बड़ करते हैं, तो आपको मैन्युअल रूप से सब कुछ ठीक करना होगा। बल-पुश करने के लिए बिलकुल एक व्यक्ति की अनुमति देना अनजाना है और गिट के वितरित डिजाइन के विपरीत है। यदि वह व्यक्ति छुट्टी पर जाता है तो क्या होता है? क्या कोई और व्यक्ति अस्थायी रूप से शाखा का मालिक है? आप कैसे जानते हैं कि जो कुछ भी मूल मालिक कर रहा था, वे सभी पर नहीं चलेंगे। और खुले स्रोत की दुनिया में, क्या होता है अगर शाखा मालिक धीरे-धीरे समुदाय से दूर चला जाता है, आधिकारिक तौर पर छोड़ने के बिना? आप शाखा स्वामित्व को किसी और को सौंपने के इंतजार में बहुत समय खो सकते हैं।

लेकिन असली मुद्दा यह है: यदि आप गड़बड़ करते हैं और तुरंत इसे महसूस नहीं करते हैं, तो पुराने समय के पर्याप्त समय बीत जाने के बाद पुराने कमिट आखिरकार गायब हो जाएंगे । उस बिंदु पर, समस्या अप्राप्य हो सकती है (या कम से कम, संभावित रूप से पुनर्प्राप्त करने के लिए बहुत कठिन है, आपकी बैकअप कहानी कैसी दिखती है, इस पर निर्भर करता है - क्या आप अपने गिट रिपॉजिटरी की पुरानी प्रतियों का बैकअप लेते हैं, यानी सिर्फ क्लोन नहीं?)।

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


मैं इस "गिट दर्शन" से सहमत हूं और मुझे भी लगता है कि दर्शन कभी-कभी हैक हो सकते हैं :)। अधिक गंभीरता से, जैसा कि मैंने टिप्पणियों में कहा था, कि अब से 3 साल पहले, मैं एक कोड-समीक्षा टूल के रूप में जेरिट होने के विशेष मामले में था, जिसने इस तरह के संभावित नाटकीय नुकसान को रोकने के लिए एक डी-फैक्टो बैकअप उपकरण के रूप में काम किया था। अब मुझे लगता है कि जब आप एक शाखा को "नियंत्रित" करना सुनिश्चित करते हैं तो रिबास ठीक है। यहां तक ​​कि एक ओपनसोर्स प्रोजेक्ट में, अगर मैं एक फीचर विकसित कर रहा हूं और एक पुल अनुरोध खोल रहा हूं, तो मैं "खुद" करता हूं कि पीआर, मुझे लगता है कि मुझे इसकी शाखा को फिर से बनाने का अधिकार है, यह मेरे ऊपर है कि मैं रिबासिंग के दौरान अपने काम को बकवास न करूं। ... (१/२)
जोएल

..., और अगर कुछ लोग उस पीआर में संशोधन लाना चाहते हैं, तो मुझे लगता है कि उन्हें मुझे पहले बताना चाहिए, और यह एक संचार है। (२/२)
जोएल

पुनश्च: Changeset विकास लिंक के लिए धन्यवाद, यह दिलचस्प है
जोएल

वास्तव में, रिबास यह कहने जैसा है: "चलो मेरे सभी काम को स्क्रैच (नवीनतम मास्टर से) को फिर से लिखना, मेरे सभी पिछले काम को हटा देना।" यदि आप ऐसा करने के लिए ठीक हैं, तो आप रिबेस करने के लिए ठीक हैं।
जोएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.