अनसुलझे बदलाव क्यों नहीं?


15

एक पारंपरिक वीसीएस में, मैं समझ सकता हूं कि आप अनसुलझी फाइलें क्यों नहीं करेंगे, क्योंकि आप बिल्ड को तोड़ सकते हैं। हालांकि, मुझे समझ नहीं आता क्यों एक DVCS (उनमें से कुछ वास्तव में होगा में अनसुलझे फ़ाइलों के लिए प्रतिबद्ध नहीं करना चाहिए रोकने फ़ाइलें करने से आप)।

इसके बजाय, मुझे लगता है कि आपकी रिपॉजिटरी को धक्का देने और खींचने से बंद होना चाहिए , लेकिन कमिटिंग नहीं।

विलय प्रक्रिया के दौरान प्रतिबद्ध होने के कई फायदे हैं (जैसा कि मैं इसे देखता हूं):

  • वास्तविक मर्ज परिवर्तन इतिहास में हैं।
  • यदि मर्ज बहुत बड़ा था, तो आप समय-समय पर कमिट कर सकते थे।
  • यदि आपने कोई गलती की है, तो वापस रोल करना आसान होगा (पूरे मर्ज को फिर से किए बिना)।
  • फाइलों को तब तक अनसुलझे रखा जा सकता है जब तक कि उन्हें हल नहीं किया जाता। यह पुश / पुलिंग को रोकता है।

आप संभावित रूप से केवल एक एकल के बजाय मर्ज के रूप में परिवर्तन का एक सेट कार्य कर सकते हैं । यह आपको अभी भी जैसे उपकरण का उपयोग करने की अनुमति देगा git rerere

तो क्यों अनसुलझे फ़ाइलों के साथ प्रतिबद्ध है / पर रोका? क्या परंपरा के अलावा कोई कारण है?


1
किसके द्वारा इसे रोका गया या रोका गया?
पीडीआर

@pdr कुछ डेवलपर्स जिन पर मैंने काम किया, उन पर काम किया। hg 1.6मर्ज के बाद कम से कम , फ़ाइलों को अनसुलझे के रूप में चिह्नित किया जाता है। hgहोगा नहीं करते हैं तो आप के लिए प्रतिबद्ध जब तक आप उन्हें हल में चिह्नित किया है (जरूरी मतलब नहीं है कि आप वास्तव में उन्हें हल करने के लिए है, लेकिन मैं विचार है कि ग्रहण करेंगे)।
विस्फोट

1
तो "अनसुलझी फाइलों" से, क्या वास्तव में आपका मतलब "अनसुलझे मर्ज" से है?
पीडीआर

@pdr नहीं, hgवास्तव में उन फ़ाइलों की एक सूची रखता है जिन्हें "हल" (उपयोग hg resolve) के रूप में चिह्नित नहीं किया गया है । अगर Uइस सूची में कोई फाइल है, तो यह आपको कमिट नहीं होने देगा।
धमाका गोलियां

1
hg resolveविशेष रूप से संघर्षों के साथ विलय के लिए उपयोग किया जाता है; selenic.com/mercurial/hg.1.html#resolve देखें । Note that Mercurial will not let you commit files with unresolved merge conflicts. You must use hg resolve -m ... before you can commit after a conflicting merge.
माइक पार्टरिज

जवाबों:


6

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

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


5
मुझे नहीं पता है कि मैं किसी भी कमिट को खींचने की क्षमता से सहमत हूं और यह काम कर रहा है .. एक डीवीसीएस में कमिट करने का एक बिंदु आपकी प्रगति करना है , इसलिए सामान का टूटना या अधूरा होना ।
विस्फोट

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

1
Git बंडल किए गए कमिट का समर्थन करता है।
डेल्ट्री

3

मैं Git से सबसे अधिक परिचित हूं, इसलिए मैं उस परिप्रेक्ष्य के लिए उत्तर दूंगा।

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

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

आपके लाभों की सूची के बारे में विशिष्ट चिंताएं:

  1. वास्तविक मर्ज परिवर्तन इतिहास में हैं। आपको अतिरिक्त जानकारी की आवश्यकता क्यों है? डीवीसीएस सीमित क्षेत्रों में संघर्ष को सीमित करने के बारे में बहुत अच्छे हैं। एक बार जब आप चुनते हैं कि किस बदलाव को रखना है, तो मर्ज कमेट की कॉपी की पिछली कॉपी से तुलना करके आपको यह बता देगा।
  2. यदि मर्ज बहुत बड़ा था, तो आप समय-समय पर कमिट कर सकते थे। यह एक वैध चिंता का विषय है, लेकिन आपको कभी भी यहां पहली जगह नहीं मिलनी चाहिए। शाखाओं को लगातार अपस्ट्रीम परिवर्तनों में खींचना चाहिए ताकि ऐसा कभी न हो। rebaseचेरी या पिकिंग जैसे उपकरण एक समय में एक कमेटी भी कुछ स्थितियों में आपकी सहायता कर सकते हैं।
  3. यदि आपने कोई गलती की है, तो वापस रोल करना आसान होगा (पूरे मर्ज को फिर से किए बिना)। ऊपर देखें - आपके संघर्षों को यह असहनीय नहीं होना चाहिए।

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


संघर्ष शायद यह असहनीय नहीं होना चाहिए , लेकिन अक्सर (कम से कम मेरे अनुभव में)। मुझे लगता है कि पूरे मर्ज को परमाणु होना चाहिए; यही मैं सुझाव दे रहा हूं। जरूरी नहीं है, मैं सोच रहा हूं कि ऐसा क्यों नहीं किया गया है। जरूरी नहीं कि आप संघर्ष में एक या दूसरे विकल्प को चुन सकें; कभी-कभी यह दोनों परिवर्तनों का एक संयोजन होता है। यह विशेष रूप से भ्रामक है।
धमाका गोलियां

"आपको भंडार को एक सुसंगत स्थिति में रखने की आवश्यकता है"। मुझे नहीं लगता कि यह सच है। एक स्थानीय भंडार एक कार्यस्थल है, न कि मंदिर। यदि यह मर्ज के बीच में प्रतिबद्ध करने में मदद करता है, तो इसे IMHO करें। यदि आप ऐसा करते हैं क्योंकि आप किसी भी बेहतर को नहीं जानते हैं, तो मेरा सुझाव है कि आप इसे नहीं करेंगे। यदि आप एक अनुभवी प्रोग्रामर हैं, तो आपको अपने लिए सबसे अच्छा काम करना चाहिए। अपने स्थानीय भंडार प्रधान रखने के बारे में हठधर्मिता मत करो।
ब्रायन ओकले

1

मेरा मुख्य अनुभव मर्क्यूरियल के साथ है, हालांकि मैं छिटपुट रूप से भी प्रयोग करता हूं।

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

मर्क्यूरियल में आपको बस इतना ही करना है, एक बार आपके पास फाइल करने का तरीका है जो आप उन्हें करना चाहते हैं:

hg resolve --mark --all
hg commit -m "I'm such a rebel"

- चिह्न ... आप मर्ज टूल के साथ संकेत दिए बिना फ़ाइलों को हल करें। - सभी संघर्षों के साथ सभी फाइलों के निशान को चुनने का ध्यान रखेंगे।

यदि आप बिना खींचे धक्का देना चाहते हैं (और परिणामस्वरूप अन्य परिवर्तनों को मर्ज करना ) जेडी की तरह करते हैं :

hg push --force

अगला लड़का जो खींचता है उसे +1 सिर मिलेगा (कोई दंड नहीं)

मुझे यकीन है कि गिट के साथ एक ही सामान करने का एक तरीका है (हालांकि यह शायद अधिक जटिल है)।


1

जब मैं git में विलीन हो जाता हूं, तो मैं तुरंत सभी परिवर्तन (मर्ज विरोध सहित) कर देता हूं। फिर, अपने अगले प्रतिबद्ध में, मैं एक पाठ संपादक के माध्यम से मर्ज संघर्ष का समाधान करता हूं। संघर्षों को हल करने के बाद, मैं तब पुश अगर वांछित।

ईमानदारी से मुझे समझ नहीं आता कि दूसरे लोग ऐसा क्यों नहीं करते हैं, या इसे लागू नहीं करते हैं।

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

कमिट करने से पहले संघर्षों को हल करने के मानक वर्कफ़्लो का एक बड़ा दोष यह है कि आपकी स्थानीय कॉपी से परिवर्तन चुपके से हो सकते हैं। अतिरिक्त विलय से कोड की समीक्षा छिपी हुई है, इसलिए आप यह नोटिस नहीं करते हैं कि आपने गलती से एपीआई बनाया है। कुंजी या आदि

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


0

मुझे लगता है कि छोटे बदलावों को धकेलना और जब भी संभव हो, धक्का देना सबसे अच्छा होता है (और निश्चित रूप से यह हमेशा नहीं होता है), और ऐसा कोड नहीं बनाते जो आधा न हो, या आधा पूरा हो (हम सभी गलतियाँ करते हैं, लेकिन डॉन 'यह उद्देश्य पर नहीं है)। मैं जीआईटी से भी आता हूं, और मुझे लगता है कि सबसे अच्छी चीजों में से एक यह है कि आप अपने डेस्कटॉप पर रेपो की एक व्यावहारिक प्रतिलिपि रख सकते हैं ... जिसे आप तब अपने दिल की सामग्री में संशोधित कर सकते हैं। जब आपके बड़े बदलाव हो जाएं, तो उसे भेज दें।

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

मैं अपने दृष्टिकोण से अनुमान लगाता हूं, स्थानीय रूप से आधा गधा सामान रखें, तार पर अच्छी चीजें भेजें।


0

अपने औजारों के गुलाम मत बनो।

VCS का लक्ष्य आपको अपना काम करने में सक्षम बनाना है। आपका काम एक प्राचीन स्थानीय भंडार रखना नहीं है, आपका काम कोड लिखना है। अगर जल्दी और अक्सर स्थानीय स्तर पर कमिटमेंट करने से आप बेहतर काम कर सकते हैं, तो करें।

हालांकि, आपको टूटे हुए कोड को ऊपर की ओर नहीं धकेलना चाहिए ।


0

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

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

और विकल्प हैं - आपके पास सिर की तुलना में पहले से विलय करने का विकल्प है - जो आपको अच्छी तरह से महाकाव्य मर्ज के बिना परिवर्तनों को अनुकूलित करने की क्षमता दे सकता है (या कम से कम बड़े विलय के साथ जो आसानी से समझ में आता है)।

यह ऐसा मामला है जो मुझे लगता है कि गिट्स का रिबास विशेष रूप से उपयोगी है (रिबासिंग के बारे में सामान्य कैविट्स के अधीन) क्योंकि आप अपने बदलावों को फिर से दोहरा रहे हैं, जिससे आपको वर्तमान स्थिति में छोटे टुकड़ों में संघर्ष को ठीक करने में मदद मिलती है।

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