2012-05-19 16 views
9

मैं वर्तमान में अपने स्वयं के न्यूरोइमेजिंग टूलबॉक्स पर काम कर रहा हूं जो MATLAB/SPM8 के अंतर्गत चलता है और मेरे भंडार में अधिकांश प्रोग्राम फ़ाइलें MATLAB *.m फ़ाइलें हैं। मेरे पास अलग-अलग फीचर शाखाएं हैं और एक analysis शाखा है, जो कि मैं वर्तमान संस्करण का उपयोग कर चल रहे विश्लेषणों के लिए उपयोग करता हूं। साथ ही मैं master और फ़ीचर शाखाओं में कोड विकसित कर रहा हूं, जो तब master शाखा में लगातार विलय हो जाते हैं।गिट के साथ फाइलों के कई अलग-अलग संस्करणों पर एक साथ काम कैसे करें?

अब समस्या यह है कि, विश्लेषण मैं analysis शाखा में चल रहा हूँ समय (यहां तक ​​कि दिन) का एक बहुत लेते हैं है, और उस समय के दौरान मैं git checkout master या git checkout new-feature करने में सक्षम नहीं हूँ। यह मेरी उत्पादकता को गंभीरता से सीमित करता है।

तो, के रूप में यह कई शाखाएं एक ही समय एक साथ पर खुला रखने के लिए संभव नहीं है, मैं अपने स्वयं के भंडार को विकास भंडार से बाहर analysis शाखा स्थानांतरित करने के लिए सोच रहा हूँ। सवाल यह है कि, अगर मैं git init वर्तमान analysis शाखा के आधार पर एक नया भंडार है, तो मेरे विकास के नए विकसित कोड का उपयोग करने में सक्षम होने के लिए हर समय git merge किसी भी तरह से और फिर master शाखा (विकास भंडार के) से कोई तरीका है नए विश्लेषण भंडार में भंडार?

+3

असल में, आप * * कई शाखाएं एक ही समय एक साथ पर खुला रखने कर सकते हैं: [Git एक साथ दो शाखाओं पर काम] (http://stackoverflow.com/questions/2048470/git-working दो-शाखाएं-साथ-साथ) – sleske

उत्तर

8

आप git clone एक नया भंडार में अपने मौजूदा भंडार, आप तो git push या git fetch अन्य एक से ऊपर refs (शाखाओं) मैच के लिए कर सकते हैं आप बदल दिया है; कोई विलय शामिल नहीं है। भंडार की सामग्री डिस्क स्थान को सहेजने के लिए स्वचालित रूप से हार्ड-लिंक हो जाएगी।

आप git clone और git push को --mirror विकल्प का उपयोग करते हैं, तो आप रिमोट ट्रैकिंग शाखाओं वाले छोड़ देते हैं जाएगा और बस दोनों में एक ही शाखाएं है, जो सरल और अधिक सममित, लेकिन Git के एक परंपरागत उपयोग की कम है। अधिकतम "ट्यूटोरियल का पालन करें" सादगी के लिए, इसके बजाय एक तीसरा "केंद्रीय" भंडार (जिसे --bare बनाया जाना चाहिए) की व्यवस्था करें, जो आपके दोनों कामकाजी भंडार क्लोन हैं।

कोई विलय नहीं ("फास्ट-फॉरवर्ड विलय" के अलावा जो वास्तव में विलीन नहीं होते हैं, लेकिन पुराने शाखा के सिर को इसके नए वंशज के साथ बदलना आवश्यक है), क्योंकि आप एक ही शाखाओं पर काम कर रहे हैं; आप बस उनमें से दो प्रतियां हैं। जब आपका विश्लेषण पूरा हो जाता है और आप विश्लेषण शाखा को अपडेट करने में सक्षम होते हैं, तो git merge --ff-only master जबकि analysis में; आप इसे जो भी भंडार सुविधाजनक में कर सकते हैं, लेकिन git push other-repository के साथ परिवर्तनों को सिंक करना न भूलें।


एक अन्य विकल्प (Git संस्करण 2.5 के बाद से) git worktree आदेश है, जो कई अलग-अलग काम कर रहे पेड़, जिसमें आप कर सकते हैं git checkout, आदि की अनुमति देता है, स्वतंत्र रूप से है। क्लोन बनाने के इस और उपर्युक्त विकल्प के बीच का अंतर यह है कि यहां शाखाओं का केवल एक सेट है।

हालांकि (संस्करण 2.8 के रूप में) यह अभी भी एक "प्रयोगात्मक" विशेषता माना जाता है, और मैंने व्यक्तिगत रूप से इसकी विश्वसनीयता और उपयोगिता पर टिप्पणी करने के लिए इसका उपयोग नहीं किया है।

+0

यह एक अच्छा विचार प्रतीत होता है। अगर मैं अपने भंडार को 'गिट क्लोन' करता हूं (बिना '--mirror' के, क्योंकि मैं ड्रॉपबॉक्स को एक निजी रिमोट-ट्रैकिंग रिपोजिटरी के रूप में उपयोग करता हूं, जैसा कि समझाया गया है [उदाहरण के लिए यहां] (http://michael.otacoo.com/linux-2/ सेटिंग-ए-गिट-सर्वर-ड्रॉप-ड्रॉपबॉक्स /)), क्या मैं अभी भी नई शाखाएं बना सकता हूं और उन्हें सिंक कर सकता हूं? यदि मैं एक नई सुविधा शाखा बनाता हूं, तो क्या मुझे इसे अपने 'मूल' भंडार और नए 'विश्लेषण' भंडार दोनों में एक ही नाम के साथ बनाना चाहिए? या क्या यह केवल 'मूल' भंडार में इसे बनाने के लिए पर्याप्त है यदि मैं हमेशा 'मूल' भंडार की 'मास्टर' शाखा को नए 'विश्लेषण' भंडार में विलय करता हूं? – nrz

+1

यदि आप केवल 'विश्लेषण' शाखा में करते हैं, तो 'मास्टर' से 'विश्लेषण' में विलय हो जाता है, फिर भी, उस शाखा को कहीं भी रहने की आवश्यकता नहीं है लेकिन विश्लेषण भंडार। वास्तव में, इसे एक अलग-अलग शाखा होने की आवश्यकता नहीं है: यह उस भंडार में केवल एकमात्र शाखा है, जिसमें मूल/मास्टर' अपस्ट्रीम के रूप में है। आप जो भी विलय करते हैं वह तेजी से आगे होना चाहिए। –

+0

धन्यवाद, यह मुझे बहुत मदद करता है। – nrz

2

केविन रीड द्वारा समझाए गए रेपो को क्लोन करने के विकल्प के रूप में, आप अपने रेपो के लिए दूसरी कार्य प्रतिलिपि बनाने के लिए केवल git-new-workdir का उपयोग कर सकते हैं। इस तरह, दोनों कार्यशील प्रतियां हमेशा एक ही शाखाएं स्वचालित रूप से दिखाई देंगी, क्योंकि वे एक गिट रेपो साझा करते हैं।

रेपो क्लोनिंग पर लाभ यह है कि किसी भी मैन्युअल सिंक्रनाइज़ेशन/विलय के लिए कोई आवश्यकता नहीं है। पल आप वर्कडीर ए में करते हैं, प्रतिबद्धता वर्कडिर बी (उदा। git log) में दिखाई देगी।

केवल चेतावनी: जब आप भंडार को बदलने (करने से, रिबेसिंग, एक शाखा आदि को रीसेट), आप एक ही शाखा अन्य workdir में चेक आउट नहीं होना चाहिए - अन्यथा Git (git-new-workdir: Commit in working tree A causes bogus changes in tree B देखें) थोड़ा उलझन में मिल जाएगा।

देखें: git working on two branches simultaneously

संबंधित मुद्दे