मुझे सीधे और स्पष्ट रूप से अपनी बातों का जवाब देने दें:
हमारा मुद्दा दीर्घकालिक साइडब्रांचों के साथ है - जिस तरह से आपको कुछ लोग मिल रहे हैं जो एक साइडब्रंच काम करते हैं जो मास्टर से विभाजित होता है, हम कुछ महीनों के लिए विकसित होते हैं, और जब हम एक मील के पत्थर पर पहुंचते हैं तो हम दो को सिंक करते हैं।
आप आम तौर पर महीनों के लिए अपनी शाखाओं को बिना अनुमति के नहीं रखना चाहते हैं।
आपकी सुविधा शाखा ने आपके वर्कफ़्लो के आधार पर किसी चीज़ को बंद कर दिया है; चलो इसे master
सरलता के लिए ही कहेंगे । अब, जब भी आप गुरु के लिए प्रतिबद्ध होते हैं, आप कर सकते हैं और करना चाहिए git checkout long_running_feature ; git rebase master
। इसका अर्थ है कि आपकी शाखाएँ डिज़ाइन द्वारा, हमेशा सिंक में हैं।
git rebase
यहाँ करना भी सही बात है। यह हैक या कुछ अजीब या खतरनाक नहीं है, बल्कि पूरी तरह से प्राकृतिक है। आप एक जानकारी खो देते हैं, जो कि सुविधा शाखा का "जन्मदिन" है, लेकिन यह है। अगर किसी को यह पता नहीं है कि महत्वपूर्ण होने के लिए, इसे कहीं और बचत करके प्रदान किया जा सकता है (आपके टिकट सिस्टम में, या, यदि आवश्यकता महान है, तो git tag
...)।
अब, IMHO, इसको संभालने का प्राकृतिक तरीका है, साइडब्रंच को एक सिंगल कमिट में स्क्वैश करना।
नहीं, आप बिल्कुल ऐसा नहीं चाहते हैं, आप मर्ज कमिटमेंट चाहते हैं। मर्ज कमिटमेंट भी "सिंगल कमिट" है। यह, किसी भी तरह, सभी व्यक्तिगत शाखा को "मास्टर" में सम्मिलित नहीं करता है। यह दो माता-पिता के साथ एक एकल प्रतिबद्ध है - master
मर्ज के समय सिर और शाखा प्रमुख।
--no-ff
विकल्प निर्दिष्ट करना सुनिश्चित करें , निश्चित रूप से; --no-ff
आपके परिदृश्य में, बिना विलय के , सख्ती से मना किया जाना चाहिए। दुर्भाग्य से, --no-ff
डिफ़ॉल्ट नहीं है; लेकिन मेरा मानना है कि एक विकल्प है जिसे आप सेट कर सकते हैं जो इसे बनाता है। देखें git help merge
कि क्या --no-ff
करता है (संक्षेप में: यह पिछले पैराग्राफ में वर्णित व्यवहार को सक्रिय करता है), यह महत्वपूर्ण है।
हम मास्टर के इतिहास में समानांतर विकास के महीनों को डंपिंग नहीं कर रहे हैं।
बिल्कुल नहीं - आप कभी भी किसी शाखा के "इतिहास में" कुछ डंप नहीं कर रहे हैं, खासकर मर्ज कमिट के साथ नहीं।
और अगर किसी को साइडब्रंच के इतिहास के लिए बेहतर समाधान की आवश्यकता है, तो ठीक है, निश्चित रूप से यह सब अभी भी वहां है - यह सिर्फ मास्टर में नहीं है, यह साइडब्रंच में है।
मर्ज कमिटमेंट के साथ, यह अभी भी है। मास्टर में नहीं, लेकिन साइडब्रंच में, मर्ज के माता-पिता में से एक के रूप में स्पष्ट रूप से दिखाई देता है, और अनंत काल के लिए रखा जाता है, जैसा कि यह होना चाहिए।
देखो मैंने क्या किया है? सभी चीजों को आप अपने स्क्वैश के लिए वर्णन प्रतिबद्ध हैं वहीं मर्ज के साथ --no-ff
करते हैं।
यहाँ समस्या है: मैं विशेष रूप से कमांड लाइन के साथ काम करता हूं, लेकिन मेरी टीम के बाकी लोग GUIS का उपयोग करते हैं।
(साइड टिप्पणी: मैं लगभग विशेष रूप से कमांड लाइन के साथ-साथ अच्छी तरह से काम करता हूं (ठीक है, यह एक झूठ है, मैं आमतौर पर एमएसीएस मैगिट का उपयोग करता हूं, लेकिन यह एक और कहानी है - अगर मैं अपने व्यक्तिगत ईमैक्स सेटअप के साथ सुविधाजनक स्थान पर नहीं हूं, तो मुझे कमांड पसंद है) पंक्ति के रूप में अच्छी तरह से)। लेकिन कृपया अपने आप को एक एहसान करो और कम से कम कोशिश git gui
एक बार। यह है तो और अधिक जोड़ने के लिए आदि लाइनों, जिसे चुनने के लिए कुशल / नाश कहते हैं।)
और मुझे पता चला है कि GUIS के पास अन्य शाखाओं से इतिहास प्रदर्शित करने के लिए एक उचित विकल्प नहीं है।
ऐसा इसलिए है क्योंकि आप जो करने की कोशिश कर रहे हैं वह पूरी तरह से की भावना के खिलाफ है git
। git
एक "निर्देशित एसाइक्लिक ग्राफ" पर कोर से बनाता है, जिसका अर्थ है, बहुत सारी जानकारी अभिभावकों के बच्चे के संबंध में है। और, मर्ज के लिए, इसका मतलब है कि सही मर्ज दो माता-पिता और एक बच्चे के साथ होता है। जैसे ही आप no-ff
मर्ज कमिट का उपयोग करते हैं, वैसे ही आपके सहयोगियों का GUI ठीक हो जाएगा ।
तो अगर आप "यह विकास शाखा XYZ से स्क्वैश" कहते हुए, एक स्क्वैश कमेटी तक पहुँचते हैं, तो यह देखने के लिए एक बड़ा दर्द है कि XYZ में क्या है।
हां, लेकिन यह GUI की समस्या नहीं है, बल्कि स्क्वैश कमिट की है। स्क्वैश का उपयोग करने का मतलब है कि आप फीचर ब्रांच हेड झूलना छोड़ दें, और एक नया कमिट बनाएं master
। यह दो स्तरों पर संरचना को तोड़ता है, एक बड़ी गड़बड़ बनाता है।
इसलिए वे चाहते हैं कि ये बड़े, लंबे विकास-साइडब्रांच में विलय हो, हमेशा एक मर्ज कमिट के साथ।
और वे बिल्कुल सही हैं। लेकिन वे "विलय कर दिया नहीं कर रहे हैं में ", वे सिर्फ विलय कर रहे हैं। एक मर्ज वास्तव में संतुलित चीज है, इसका कोई पसंदीदा पक्ष नहीं है जो "अन्य" में विलय हो गया है ( git checkout A ; git merge B
बिल्कुल वैसा ही है जैसे git checkout B ; git merge A
मामूली दृश्य अंतर को छोड़कर, जैसे शाखाओं को चारों ओर स्वैप किया जा रहा है git log
)।
वे ऐसा कोई इतिहास नहीं चाहते हैं जो मास्टर शाखा से तुरंत सुलभ न हो।
जो पूरी तरह से सही है। ऐसे समय में जब कोई अनमैरिड फीचर्स नहीं होते हैं, तो आपके पास एक एकल ब्रांच होगी master
जिसमें एक समृद्ध इतिहास होगा, जिसमें सभी फीचर कमिटमेंट्स कभी भी होंगे, git init
समय की शुरुआत से कमिट पर वापस जाएंगे (ध्यान दें कि मैं विशेष रूप से इस शब्द का उपयोग करने से बचता हूं " उस अनुच्छेद के उत्तरार्द्ध में शाखाएं "क्योंकि उस समय का इतिहास अब" शाखाएं "नहीं है, हालांकि प्रतिबद्ध ग्राफ काफी शाखात्मक होगा)।
मुझे उस विचार से नफरत है;
तब आप थोड़े से दर्द में होते हैं, क्योंकि आप जिस उपकरण का उपयोग कर रहे हैं, उसके खिलाफ काम कर रहे हैं। git
दृष्टिकोण विशेष रूप से शाखाओं / विलय क्षेत्र में, बहुत ही सुंदर और शक्तिशाली है; यदि आप इसे सही करते हैं (जैसा कि ऊपर दिया गया है, विशेष रूप से इसके साथ --no-ff
) तो यह अन्य दृष्टिकोणों के लिए लीप्स और सीमाएं द्वारा सुपरिउर है (जैसे, शाखाओं के लिए समानांतर निर्देशिका संरचना होने की तोड़फोड़ गड़बड़)।
इसका अर्थ है समानांतर विकास के इतिहास की एक अंतहीन, अनुपयोगी उलझन।
अंतहीन, समानांतर - हाँ।
अवर्णनीय, उलझन - नहीं।
लेकिन मैं यह नहीं देख रहा हूं कि हमारे पास क्या विकल्प है।
क्यों नहीं git
, अपने सहयोगियों और दुनिया के बाकी हिस्सों के आविष्कारक की तरह काम करते हैं?
क्या हमारे पास मर्ज-कमिट के साथ लगातार मास्टरबेशन को मर्ज करने के अलावा यहां कोई विकल्प है? या, क्या कोई कारण है कि लगातार मर्ज-कमिट का उपयोग करना उतना बुरा नहीं है जितना मुझे डर है?
कोई अन्य विकल्प नहीं; उतना बुरा नहीं।