इन-प्रोग्रेसिंग रीफैक्टरिंग कैसे करें?


23

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

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

तुम क्या सोचते हो? क्या कोई समाधान है जो मैं देख रहा हूँ?
क्या मैं बाद में कमिट या कुछ करने के लिए git बता सकता हूं? मैं गैर संकलन जब तक वे प्रतिबद्ध के साथ रह सकता है रहने में cleanupशाखा।

संपादित करें

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

संक्षेप में: स्थानीय आवागमन को अंततः धक्का दिया जाएगा। वैश्विक इतिहास को गैर-संकलित कमिट नहीं दिखाना चाहिए।


1
आप एक ही वैश्विक कमिट में कई स्थानीय कमिट एकत्र कर सकते हैं।

@ Thorbjørn नीचे जिम की सिफारिश है, या गिट के भीतर एक अलग तंत्र?
ब्रायन

मेरा मानना ​​है कि - मुझे सटीक कमांड याद नहीं है।

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

1
@bitmask फिर से कैसे लिखें?
डेव हिलियर

जवाबों:


21

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

git checkout master
git merge --squash cleanup
git commit -m "Merge cleanup branch"

git rebase -iआदेश भी करता छुटकारा पाने लेकिन अधिक काम की आवश्यकता है सकते हैं।


14

एक फिर से लिखना एक refactoring नहीं है

मुझे लगता है कि आप Git का उपयोग कैसे करें में रुचि रखते हैं, लेकिन मैं तर्क दूंगा कि आप जिस तरह से Git का उपयोग करते हैं उससे अधिक आप रिफ्लेक्टरिंग करने के तरीके पर विचार करें (हालांकि मुझे लगता है कि Git आपकी मदद कर सकता है)।

मार्टिन फाउलर ने रिफैक्टरिंग को परिभाषित किया :

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

इसका हृदय छोटे-छोटे व्यवहारों की एक श्रृंखला है जो परिवर्तनों का संरक्षण करता है। प्रत्येक परिवर्तन (जिसे "रिफ़ैक्टरिंग" कहा जाता है) बहुत कम करता है, लेकिन परिवर्तनों का एक क्रम एक महत्वपूर्ण पुनर्गठन का उत्पादन कर सकता है। चूंकि प्रत्येक रीफैक्टरिंग छोटा है, इसलिए इसके गलत होने की संभावना कम है। सिस्टम को प्रत्येक छोटे रीफैक्टरिंग के बाद पूरी तरह से काम करने के लिए रखा जाता है, इस संभावना को कम करता है कि सिस्टम पुनर्गठन के दौरान गंभीर रूप से टूट सकता है।

यदि आप इस विधि को लागू करते हैं तो आप नियमित आधार पर (और धक्का) कर सकते हैं।

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

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


5

git rebaseविशेष रूप से git rebase -iसंस्करण के लिए मैन्युअल पृष्ठ देखें । यह आपको अपने इतिहास में किसी भी नंबर के कमिटमेंट को फिर से ऑर्डर, डिलीट या स्क्वैश करने की अनुमति देता है, जो आपको लगता है कि आपको क्या लग रहा है। मैं इसका उपयोग हर समय उस स्थिति में करता हूं, जिसका आप वर्णन करते हैं: कई छोटे-छोटे काम करना जो सार्वजनिक उपभोग के लिए उपयुक्त नहीं हैं, फिर साझा रिपॉजिटरी पर धकेलने से पहले एक एकल "रिफैक्टरिंग" प्रतिबद्ध में उन्हें एक साथ स्क्वीज करना।


3

आप Git का उपयोग कर रहे हैं, इस प्रकार कमिट करना जरूरी नहीं कि आपके बदलावों को आगे बढ़ाए ...।

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

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

संपादित करें

उस स्थिति में आप उपयोग कर सकते हैं git cherry-pickया साथ खेल सकते हैंgit rebase


एक महत्वपूर्ण नोट, लेकिन मैंने इस पर विचार किया। कृपया मेरा संपादन देखें। धन्यवाद।
बिटमेस्क

ऊपर मेरा संपादन देखें।
क्रिस्टियन

अगर मैं कर सकता था -1; कमिट उपलब्ध हो जाएंगे! स्थानीय कार्य-प्रगति प्रगति महान हैं, लेकिन उन्हें धक्का कभी नहीं; यह समझने के लिए कोड को कठिन बनाता है, गिट बाइट को बाधित करता है, और इतिहास को जटिल बनाता है। इसके बजाय रिबास या स्क्वैश।
RJFalconer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.