क्या Git Stash का उपयोग वर्कफ़्लो के रूप में एक एंटीपैटर्न के रूप में किया जाता है?


25

मैं हाल ही में देख रहा हूँ कि कैसे मैं और मेरी टीम Git का उपयोग करती है और हमारे वर्कफ़्लोज़ कैसे काम करते हैं। वर्तमान में हम एक सुविधा-शाखा वर्कफ़्लो का उपयोग करते हैं जो अच्छी तरह से काम करता है।

मैंने यह भी देखा है कि हमारी टीम के कुछ लोग git stash के आधार पर वर्कफ़्लो का उपयोग करते हैं । वर्कफ़्लो कुछ इस तरह से जाता है:

  • मुख्य शाखा पर काम करें (जैसे master)
  • जाते ही कमिट करें
  • यदि आपको परिवर्तन प्राप्त करने या शाखाओं को स्विच करने की आवश्यकता है, तो अपने अनचाहे परिवर्तनों को स्टैश पर धकेलें
  • एक बार जब आपका अपडेट किया जाता है, तो स्टेश से बदलावों को पॉप करें।

मुझे यह उल्लेख करना चाहिए कि एक सुविधा शाखा वर्कफ़्लो के बजाय इस वर्कफ़्लो का उपयोग किया जाता है। एक शाखा लेने और उस पर काम करने के बजाय, यहाँ डेवलपर्स केवल एक ही शाखा पर काम करते हैं और फिट दिखाई देने पर स्टैक को पुश / पॉप करते हैं।

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

क्या नियमित रूप से गिट स्टैश का उपयोग करना एक प्रतिमान माना जाएगा? यदि हां, तो कुछ विशिष्ट समस्याएं क्या हो सकती हैं? यदि नहीं, तो क्या लाभ हैं?


2
आप अपने सहकर्मियों से पूछ सकते हैं कि क्या उन्हें वर्कफ़्लो में कोई समस्या है। यदि वे नहीं करते हैं तो मैं इसे हानिकारक नहीं मानूंगा।
AlexFoxGill

@AlexG यह एक मान्य बिंदु है। मैं यहाँ सवाल पूछ रहा हूँ कि क्या कोई "गोच" लोगों को मिला है।
joshin4colours

3
अगर मैं इसे सही ढंग से समझ पाऊं तो ... If you need to get changes or switch branches, push your uncommitted changes onto the stash- बिल्कुल यही बात है कि आखिर यह क्या है।

3
@MichaelT मेरी स्थानीय शाखा सब कुछ की अनुमति देती है। बिना शर्त।
मआर्टिनस

2
मेरा पैटर्न है: -> git stash का उपयोग न करें -> सुविधा शाखाओं का उपयोग करें -> 'wip' के एक प्रतिबद्ध संदेश के साथ कार्य-प्रगति को सहेजें। -> एक सार्थक प्रतिबद्धता में wip में स्क्वैश करने के लिए शाखा पर इंटरैक्टिव रिबास लेकिन केवल आपके स्थानीय, अप्रकाशित परिवर्तनों के लिए। -> दूरस्थ को धकेलें -> अपने git वर्कफ़्लो के लिए उपयुक्त मास्टर (और पुश) में मर्ज करें।
माइकल ड्यूरेंट

जवाबों:


31

से Git एससीएम बुक :

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

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

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

थोड़ा और पीछे जाएं, तो गुरु के प्रति वचनबद्धता यहां का विरोधी स्वरूप है। शाखाओं का उपयोग करें। यही कारण है कि वे के लिए डिजाइन किए गए थे।

यह वास्तव में यह करने के लिए नीचे फोड़े:

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

"टूटी हुई" कोड के बारे में

जबकि निम्नलिखित राय है, मैं अनुभव से इस राय पर आया हूं।

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

  1. नई शाखा बनाएं
  2. हैक हैक
  3. टूटा हुआ कोड
  4. कोड पोलिश करें और इसे काम करें
  5. काम करने का कोड
  6. रिबेस और स्क्वैश
  7. परीक्षा
  8. जब टेस्ट पास हो रहे हों तो पुश करें

ओपी के लिए, यह लिनक्स कर्नेल संदेश धागा रुचि का हो सकता है, क्योंकि यह ओपी की टीम के कुछ सदस्यों की तरह लगता है कि एक समान तरीके से गिट का उपयोग कर रहा है।

@RibaldEddie ने नीचे टिप्पणी में कहा:

सबसे पहले, एक स्लैश "ब्रांचिंग वर्कफ़्लो" के बाहर नहीं है क्योंकि हुड के नीचे एक स्लैश सिर्फ दूसरी शाखा है।

(कई लोगों के प्रकोप के जोखिम में)

लिनस ने कहा:

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

मुझे क्या लगता है @RibaldEddie यह कहना चाह रही है कि आप git stashएक सुविधा शाखा वर्कफ़्लो में उपयोग कर सकते हैं - और यह सच है। यह git stashउस समस्या का उपयोग नहीं है। यह मास्टर और उपयोग करने के लिए प्रतिबद्ध है git stashयह एक विरोधी पैटर्न है।

स्पष्ट git rebase

@ RibaldEddie की टिप्पणी से:

रिबासिंग कॉपी-पेस्टिंग की तरह बहुत अधिक है और इससे भी बदतर प्रतिबद्ध इतिहास को संशोधित करता है।

(जोर मेरा)

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

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

क्लीन कमिट हिस्ट्री पर एक और दिलचस्प लिनक्स कर्नेल थ्रेड है ।

फिर से, लिनस से:

मैं स्वच्छ इतिहास चाहता हूं, लेकिन वास्तव में इसका मतलब (ए) स्वच्छ और (बी) इतिहास है।

लोग अपने निजी पेड़ों (अपने काम से) को फिर से पा सकते हैं (और शायद )। वह सफाई है । लेकिन कभी अन्य लोगों का कोड नहीं। यह एक "इतिहास को नष्ट" है

इसलिए इतिहास का हिस्सा काफी आसान है। केवल एक प्रमुख नियम है, और एक लघु स्पष्टीकरण:

  • आपको कभी भी अन्य लोगों के इतिहास को नष्ट नहीं करना चाहिए। आप अन्य लोगों द्वारा किए गए कामों को नहीं छोड़ना चाहिए। मूल रूप से, यदि आपके पास इस पर आपका साइन-ऑफ नहीं है, तो यह सीमा से बाहर है: आप इसे वापस नहीं कर सकते, क्योंकि यह आपका नहीं है।

    ध्यान दें कि यह वास्तव में अन्य लोगों के इतिहास के बारे में है, अन्य लोगों के कोड के बारे में नहीं । यदि उन्होंने आपको ईमेल किए गए पैच के रूप में सामान भेजा है, और आपने इसे "git am -s" के साथ लागू किया है, तो यह उनका कोड है, लेकिन यह आपका इतिहास है।

    तो आप इस पर "गिट रिबास" बात पर जंगली जा सकते हैं, भले ही आपने कोड नहीं लिखा हो, जब तक कि प्रतिबद्ध खुद आपका निजी है।

  • नियम के लिए मामूली स्पष्टीकरण: एक बार जब आप अपना इतिहास किसी सार्वजनिक साइट पर प्रकाशित करते हैं, तो अन्य लोग इसका उपयोग कर सकते हैं, और इसलिए अब यह स्पष्ट रूप से आपका निजी इतिहास नहीं है।

    तो मामूली स्पष्टीकरण वास्तव में यह है कि यह केवल "आपकी प्रतिबद्धता" के बारे में नहीं है, यह आपके पेड़ पर निजी होने के बारे में भी है, और आपने इसे बाहर नहीं धकेल दिया है और इसकी घोषणा अभी तक नहीं की है।

...

अब "स्वच्छ" हिस्सा थोड़ा अधिक सूक्ष्म है, हालांकि पहले नियम बहुत स्पष्ट और आसान हैं:

  • अपना खुद का इतिहास पठनीय रखें

    कुछ लोग केवल अपने सिर में काम करने वाली चीजों को पहले करते हैं, और गलतियाँ नहीं करते हैं। लेकिन यह बहुत दुर्लभ है, और हम में से बाकी के लिए, हम अपनी समस्याओं पर काम करते समय "गिट रीबेस" आदि का उपयोग करते हैं।

    इसलिए "git rebase" गलत नहीं है। लेकिन यह केवल तभी सही है जब यह आपका बहुत निजी निजी पेड़ है।

  • अपनी बकवास का पर्दाफाश मत करो।

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

(जोर मेरा)

निष्कर्ष

अंत में, ओपी के पास कुछ डेवलपर्स हैं:

git checkout master
(edit files)
git commit -am "..."
(edit files)
git stash
git pull
git stash (pop|apply)

यहां पर दो समस्याएं हैं:

  1. डेवलपर्स मास्टर करने के लिए प्रतिबद्ध हैं। इसे तुरंत बंद कर दें। वास्तव में, यह सबसे बड़ी समस्या है।
  2. डेवलपर्स लगातार git stashऔर git pullमास्टर पर उपयोग कर रहे हैं जब उन्हें सुविधा शाखाओं का उपयोग करना चाहिए।

उपयोग करने के साथ कुछ भी गलत नहीं है git stash- विशेष रूप से एक पुल से पहले - लेकिन git stashइस तरीके का उपयोग एक विरोधी पैटर्न है जब गिट में बेहतर वर्कफ़्लो होते हैं।

git stashएक लाल हेरिंग का उनका उपयोग । यह समस्या नहीं है। गुरु को वचन देना समस्या है।


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

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

1
@RibaldEddie: मैंने अपना उत्तर स्पष्ट कर दिया है। इसमें कुछ सफाई की जरूरत थी।
ग्रेग बरगार्ड

मैं अपने स्वयं के उत्तर में कुछ और संदर्भ प्रदान करूंगा।
रिबल्डएडीडी

मेरा जवाब नीचे देखें-- जबकि मास्टर के लिए प्रतिबद्ध एक विरोधी पैटर्न है, यह वास्तविक समस्या नहीं है।
RibaldEddie

7

मैं व्यक्तिगत रूप से केवल stashलघु, अप्रत्याशित रुकावटों के लिए उपयोग करता हूं , जैसे कोई व्यक्ति एक सवाल पूछ रहा है जिसे एक अलग शाखा में बदलने की आवश्यकता है। मैं ऐसा इसलिए करता हूं क्योंकि मैं पहले भी चोरी के बारे में भूल चुका हूं, फिर वे सफाई से लागू नहीं होंगे। फ़ीचर शाखाओं पर नियमित रूप से आने-जाने में बहुत मुश्किल होती है, और मर्ज करना आसान होता है, इसलिए अब मैं सिर्फ एक टूटी हुई git reset HEAD~1कमिटमेंट करना चाहता हूं , फिर अगर मैं इसे बाद में नहीं रखना चाहता हूं तो रिबास करूं।

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


1

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

ऐसा कहा गया है, @Greg बर्गर्ट का उत्तर तथाकथित git-flow या फीचर-ब्रांच वर्क फ्लो के अनुकूल है। मैं एक समान रणनीति की वकालत करता था लेकिन यह महसूस करने के बाद कि यह अनावश्यक जटिलता को जोड़ता है और सुरक्षा की झूठी भावना पैदा करता है, मैं अब नहीं करता। यह गैर-विकेन्द्रीकृत संस्करण नियंत्रण प्रणालियों के दिनों से भी तोड़फोड़ की तरह है।

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

रिबेट कमांड, हालांकि, शाखा के इतिहास को नुकसान पहुंचा सकता है जब पुनरावृत्त कमिट में से एक में मर्ज संघर्ष होता है। से http://ryantablada.com/post/the-dangers-of-rebasing-a-branch

बाकी रिबास आसानी से चला जाता है, परीक्षण सभी पास होने लगते हैं। एक पीआर बनाया जाता है।

और फिर कुछ और कोड लिखे जाते हैं जो टिप्पणियों पर निर्भर करते हैं। सभी संपत्ति और संपत्ति टूट गई है। लेकिन हम किससे जाकर मदद मांगे? गिट दोष यह दर्शाता है कि कोड ऑफ लाइन केवल सर्वर साइड इंजीनियर द्वारा लिखा गया है और वह अपने हाथों को फेंकता है।

अब आपका फ्रंट-एंड इंजीनियर छुट्टी पर है, बीमार छुट्टी पर है, या कौन जानता है। कोई भी यह पता नहीं लगा सकता है कि उस कोड को कैसा दिखना चाहिए!

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

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

इसके अलावा, एक बहु शाखाओं वाला मॉडल यह निर्धारित करता है कि कोई भी दो शाखाएं कभी भी अन्योन्याश्रित कोड परिवर्तन नहीं कर सकती हैं। जब यह अनिवार्य रूप से होता है, तो डेवलपर को कुशलता से काम करने के लिए अभी और अधिक शाखाओं को टटोलना पड़ता है।

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

यदि उन सवालों का जवाब नहीं है, तो यह वास्तव में मायने नहीं रखता है कि आपके पास कितनी शाखाएँ हैं - डेवलपर्स कहेंगे कि कोड तैयार है, काम कर रहा है, और उत्पादन के लिए फिट है जब यह वास्तव में नहीं है, और शाखाओं की संख्या नहीं है। आपकी मदद करता है जब वह कोड वैसे भी उत्पादन तक जाता है।


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

तो आप कह रहे हैं कि विलय इतिहास को नष्ट कर सकता है ?! लगता है जैसे यह बहुत अधिक शाखाओं से बचने के लिए सिर्फ औचित्य है!
रिबेल्डएडीडी

1
विलय इतिहास को नष्ट नहीं कर सकता। मुझे लगता है कि आप गलतफहमी हो सकती है कि रिबासिंग और मर्जिंग कैसे काम करता है। जब एक मर्ज संघर्ष शुरू हो जाता है, तो इसे हल करने के लिए मानव पर निर्भर है। यदि मानव इसे गलत तरीके से हल करता है, तो आप गिट (या एसवीएन, या सीवीएस, या {यहां स्रोत नियंत्रण डालें}) को दोष नहीं दे सकते।
ग्रेग बरगार्ड

अब आप जो कह रहे हैं उससे पहले जो आप कह रहे हैं, उसके साथ संघर्ष कर रहे हैं। क्या आपने मेरे द्वारा उद्धृत लेख पढ़ा था? क्या आप उस संदर्भ को समझते हैं जिसमें एक खंडन इतिहास खो देगा?
रिबॉल्डएड्डी

1
मैंने लेख पढ़ा। "कीन में हम लगभग प्रत्येक कमिट के बाद अपने कोड को आगे बढ़ाने की कोशिश करते हैं।" वह मुझे पागल लगता है। या तो वे अत्यधिक बड़े कमिट कर रहे हैं, या वे कोड को आगे बढ़ा रहे हैं जो अभी तक तैयार नहीं है। यदि आप अपने सभी कमिट्स को तुरंत सार्वजनिक करते हैं, तो हाँ, रिबासिंग समस्याओं का कारण होगा। यह "डॉक्टर, डॉक्टर, यह दर्द होता है जब मैं ऐसा करता हूं" सिद्धांत।
क्युरेलसा

1

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

'हर कोई कमिट करता है और मेनलाइन पर जोर देता है' वर्कफ़्लो वह है जो काफी उचित तरीके से काम करता है जहाँ कोई उच्च जोखिम परिवर्तन नहीं होते हैं। इसका अक्सर svn वातावरण में उपयोग देखा जाता है जहां एक आधिकारिक केंद्रीय सर्वर होता है जिसमें कोड होता है।

तथापि, एक केंद्रीय सर्वर के साथ दूर करने के लिए संबंध। सभी डेवलपर्स कर रहे हैं commit, pull(या rebaseयदि आप उस में हैं), pushहर समय एक बड़ी गड़बड़ कर सकते हैं।

सबसे बड़ी समस्याएँ आपके सामने आई हैं, जो कि प्रगति में कुछ टूट गया है और आपको प्राथमिकता बग पर काम करने की आवश्यकता है। इसका मतलब है कि आपको उस काम को एक तरफ सेट करने की आवश्यकता है, नवीनतम को पकड़ो, उस पर काम करें, पिछले कार्य को प्रगति के बिना निर्माण के साथ समस्याओं का कारण बनता है जिसे आप करने की कोशिश कर रहे हैं।

इसके लिए, git stashउपयोग करने के लिए उचित उपकरण होगा।

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

और हाँ, आपने कॉल किया था कि इसका कोई बढ़िया वर्कफ़्लो नहीं है और इसके साथ समस्याएँ हैं। हालाँकि, समस्या उपकरण के साथ नहीं है git stash। समस्या भूमिकाओं के लिए या असंगत नीतियों के लिए अलग-अलग शाखाओं की कमी है ।

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

git stashएक विरोधी पैटर्न नहीं है। git stashब्रांचिंग के विकल्प के रूप में उपयोग करना, जबकि हर कोई मास्टर के लिए करता है एक विरोधी पैटर्न है - लेकिन इसकी वजह से नहीं git stash

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

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