2009-09-16 13 views
17

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

अब मैं वर्तमान में वापस विलय करना चाहता हूं। सबसे पहले मैं प्रयोगात्मक में संकलित, संकलित और सुनिश्चित किया कि सब कुछ काम कर रहा था। तो मेरे सिर में, प्रायोगिक और वर्तमान "सिंक में" होना चाहिए। लेकिन जब मैं प्रायोगिक वापस वर्तमान में विलय करने की कोशिश करता हूं, तो मुझे संघर्षों का पूरा समूह मिल जाता है। लेकिन मैंने सोचा कि जब मैं वर्तमान में प्रायोगिक में विलय कर चुका हूं तो मैंने पहले से ही हल किया था।

क्या चल रहा है? क्या मैंने पूरी तरह से कुछ गलत समझा है? मैं इसे आसानी से कैसे कर सकता हूं? वास्तव में उन सभी संघर्षों से गुजरना नहीं चाहते हैं ...

उत्तर

22

जब आप किसी व्यक्तिगत संघर्ष पर समाधान करते हैं, तो सारांश संदेश क्या कहता है? यदि आप वर्तमान से विलय करते हैं -> प्रायोगिक प्रमुख मैन्युअल काम के बिना पूरा किए गए थे, तो यह "एक्स स्रोत, 0 लक्ष्य, वाई दोनों, 0 विरोधाभासी" जैसा होना चाहिए। दूसरे शब्दों में, लक्ष्य (वर्तमान) फ़ाइल में कोई सामग्री ब्लॉक नहीं है जो पहले से ही स्रोत शाखा की प्रति (प्रायोगिक) में नहीं हैं। आप ऑटोमर्ज ऑल बटन का सुरक्षित रूप से उपयोग कर सकते हैं।

नोट: ऑटोमर्ज सुरक्षित रहना चाहिए। यह हर मामले को हल करने की क्षमता के लिए प्रारंभिक चेतावनियों के बारे में रूढ़िवादी होने के लिए अनुकूलित है। लेकिन मैं मानता हूं कि हम में से कई - स्वयं शामिल हैं - जब कोई सवाल है तो मर्ज टूल को आग लगाना पसंद है। वर्णित परिदृश्य में, आईएमओ, यहां तक ​​कि सबसे ज्यादा स्कीट आराम कर सकते हैं।


बिल्कुल कोई संघर्ष क्यों है?और क्या होगा यदि सारांश संदेश नहीं है तो & सूखा? खुशी है कि आपने पूछा :) संक्षिप्त उत्तर - क्योंकि संबंधित फाइलों के सामान्य पूर्वजों ("आधार") को निर्धारित करने वाली गणना इस बात पर निर्भर करती है कि उनके बीच संघर्ष विलय कैसे हल हो गया था। सरल उदाहरण: -> बी

  1. दो शाखाओं, ए और बी
  2. फ़ाइल के अलग अलग हिस्सों में एक \ foo.cs में संपादन और बी \ foo.cs बनाने
  3. मर्ज एक की स्थापना
  4. AutoMerge संघर्ष
  5. मर्ज बी -> एक

TFS चाहिए झंडा परस्पर विरोधी के रूप में की घटनाओं के इस क्रम। बी \ foo.cs; 4 और ए \ foo.cs; 2 के बीच निकटतम सामान्य पूर्वज चरण 1 पर वापस सभी तरह से निहित है, और तब से दोनों पक्ष स्पष्ट रूप से बदल गए हैं।

यह कहने के लिए आकर्षक है कि & बी चरण 4 के बाद सिंक में हैं। (अधिक सटीक: चरण 5 के विलय के लिए सामान्य पूर्वज संस्करण # 2 है)। निश्चित रूप से एक सफल सामग्री विलय का तात्पर्य है कि बी \ foo.cs में किए गए सभी परिवर्तन शामिल हैं?

  • व्यापकता: सभी संघर्षों AutoMerged किया जा सकता है नहीं दुर्भाग्य से आप इस कल्पना नहीं कर सकते कई कारणों से कर रहे हैं। आपको उन मानदंडों की आवश्यकता है जो दोनों परिदृश्यों पर लागू हों।

  • सुधार: ऑटोमर्ज सफल होने पर भी, यह हमेशा वैध कोड उत्पन्न नहीं करता है। एक क्लासिक उदाहरण तब उठता है जब दो लोग कक्षा परिभाषा के विभिन्न हिस्सों में एक ही क्षेत्र जोड़ते हैं।

  • लचीलापन: प्रत्येक स्रोत नियंत्रण उपयोगकर्ता के अपने पसंदीदा विलय टूल होते हैं। और उन्हें प्रारंभिक समाधान निर्णय ["किसी भी तरह से सामग्री को मर्ज करने की आवश्यकता है"] और अंतिम चेकइन ["यहां, यह काम करता है]] के बीच विकास/परीक्षण जारी रखने की क्षमता की आवश्यकता है।

  • आर्किटेक्चर: टीएफएस जैसे केंद्रीकृत सिस्टम में, सर्वर बस कुछ भी भरोसा नहीं कर सकता है, बल्कि अपने डेटाबेस + एपीआई की सत्यापन आवश्यकताओं को भी भरोसा नहीं कर सकता है। जब तक इनपुट spec को पूरा करता है, सर्वर को को अलग करने की कोशिश नहीं करनी चाहिए विभिन्न प्रकार के सामग्री विलय किए गए थे। (यदि आपको लगता है कि अब तक परिदृश्य आसानी से प्रतिष्ठित हैं, तो विचार करें: क्या होगा यदि ऑटोमर्ज इंजन में एक बग है? क्या होगा यदि एक दुष्ट क्लाइंट वेबसाईट को मनमाने ढंग से फ़ाइल सामग्री के साथ सीधे कॉल करता है? केवल सतह को खरोंच कर रहा है ... सर्वर को संदेह होना चाहिए एक कारण के लिए!) यह सुरक्षित रूप से गणना कर सकता है आपने मुझे एक परिणामस्वरूप फ़ाइल भेजी है जो स्रोत से मेल नहीं खाती है या लक्षित करती है।

एक साथ इन आवश्यकताओं को लाना है, तो आप एक डिजाइन कि एक काफी व्यापक श्रेणी भी मैनुअल ओवरलैपिंग संपादन से उत्पन्न मर्ज के, सामग्री का आपस में विलय [ऑटो या नहीं] 3 द्वारा प्रदान की शामिल है कि में चरण 4 में हमारे कार्यों गांठ के साथ खत्म पार्टी टूल्स, और फाइलें इस तथ्य के बाद हाथ से संपादित की गईं। टीएफएस शब्दावली में यह AcceptMerge संकल्प है। एक बार इस तरह दर्ज होने के बाद, मर्ज (टीएम) के नियमों को ऐतिहासिक अखंडता और भविष्य के संचालन की सुरक्षा में सबसे बुरी तरह मानना ​​है। इस प्रक्रिया में चरण 4 के लिए आपके अर्थपूर्ण इरादों ("बी में पूरी तरह से शामिल होने वाले प्रत्येक परिवर्तन को # 2 में शामिल किया गया है) को शुद्ध तर्क के कुछ बाइट्स पर गिरा दिया गया था (" बी को निम्नलिखित नई सामग्री + हैंडलिंग के लिए क्रेडिट दें # 2 ")। दुर्भाग्यपूर्ण होने पर, यह "बस" एक यूएक्स/शिक्षा समस्या है। जब लोग विलय के नियम खराब धारणाएं करते हैं तो टूटे हुए कोड और डेटा हानि की ओर अग्रसर होते हैं। इसके विपरीत, आपको बस एक बटन क्लिक करना है।

एफडब्ल्यूआईडब्ल्यू, इस कहानी के कई अन्य अंत हैं। यदि आपने चरण 4 में स्रोत शाखा [उर्फ स्वीकृतिथीर्स] से प्रतिलिपि चुना है, तो चरण 5 में कोई संघर्ष नहीं होगा। अगर आपने AcceptMerge रिज़ॉल्यूशन चुना है, तो एक ही MD5 हैश के साथ फ़ाइल को ए \ foo.cs; 2 के रूप में करने के लिए हुआ । यदि आपने इसके बजाय लक्ष्य लक्ष्य [उर्फ AcceptYours] चुना है, तो डाउनस्ट्रीम परिणाम फिर से बदलते हैं, हालांकि मुझे अभी विवरण याद नहीं है। जब आप अन्य परिवर्तनों (विशेष रूप से नाम बदलें) जोड़ते हैं, तो उपर्युक्त सभी जटिल हो जाते हैं, मेरे उदाहरण की तुलना में सिंक से कहीं अधिक शाखाएं मर्ज करें, चेरी कुछ संस्करण श्रेणियां चुनें और बाद में अनाथों से निपटें ....


संपादित करें: भाग्य के रूप में, किसी और ने बस एमएसडीएन मंच पर एक ही सवाल पूछा था। जैसा कि मेरी प्रकृति बनता है, मैंने उन्हें एक और लंबा जवाब लिखा जो पूरी तरह अलग हो गया! (हालांकि स्पष्ट रूप से एक ही महत्वपूर्ण बिंदुओं पर छूना) उम्मीद है कि इससे मदद मिलती है: http://social.msdn.microsoft.com/Forums/en-US/tfsversioncontrol/thread/e567b8ed-fc66-4b2b-a330-7c7d3a93cf1a

+0

वाह, अच्छी और पूरी तरह से स्पष्टीकरण। यकीन नहीं है कि अगर मैं इसे पूरी तरह से प्राप्त करता हूं, लेकिन मुझे लगता है कि मैं टीएफएस टीम पर नहीं हूं: पी वैसे भी, यह समझ में आता है कि यह उतना आसान नहीं है जितना मैं चाहता था: पीआई । उनमें से कुछ विवादों का नाम बदल रहे थे, जहां मुझे सिर्फ विकल्पों में से एक चुनने के लिए कहा गया था। दूसरों को थोड़ा और जटिल थे। लेकिन ऐसा लगता है कि अब काम कर रहा है :) – Svish

+0

मैंने एक और स्पष्टीकरण पोस्ट किया, उम्मीद है कि कम भ्रमित :) –

3

यह मेरे साथ पहले हुआ है। जब टीएफएस वर्तमान में प्रायोगिक विलय करता है, तो यह आपके हार्ड ड्राइव पर वर्कस्पेस का उपयोग करता है। यदि आपका वर्तमान वर्कस्पेस आपके स्थानीय कंप्यूटर पर पुराना है, तो टीएफएस विवादों को विलय कर देगा।

(पर HD प्रायोगिक)! = (TFS में वर्तमान)! = (ओल्ड पर HD वर्तमान)

वर्तमान के अपने स्थानीय coppy ताज़ा करने के लिए वर्तमान की एक मजबूर प्राप्त कर प्रयास करें और मर्ज की कोशिश फिर।

+0

कोशिश की, लेकिन कुछ भी मदद करने में प्रतीत नहीं हुआ। – Svish

+0

अच्छा अनुमान, फिर भी। यह निश्चित रूप से स्विस के लक्षणों का कारण बन सकता है। –

0

आप शायद इस तरह लाइनों है इससे पहले कि आप मर्ज प्रारंभ करें ...

  • मुख्य शाखा - शामिल कोड ए, बी, सी
  • वर्तमान शाखा - शामिल कोड ए, बी, सी, डी, ई
  • प्रायोगिक शाखा - शामिल कोड ए, बी, सी, डी, एफ, जी, एच

जब आप वर्तमान से ऍक्स्प करने के लिए धक्का, आप प्रयोगात्मक शाखा में सुविधा ई विलय कर रहे हैं।

जब आप एक्सप टू करंट से आगे बढ़ते हैं, तो आपको अभी भी एफ, जी और एच को मर्ज करना होगा। यह वह जगह है जहां आपके संघर्ष की संभावना है।

---- 1 टिप्पणी के जवाब ---- आप स्वत: मर्ज, या मर्ज उपकरण का उपयोग? "संघर्ष में" कुछ ऐसा उदाहरण क्या है?

+0

मेरे पास केवल दो शाखाएं हैं। और, अपने उदाहरण पर जारी रखने के लिए, मैंने पहले से ही प्रायोगिक में वर्तमान में विलय कर लिया है, ताकि प्रायोगिक में ई भी शामिल हो। तो कोई संघर्ष नहीं होना चाहिए, केवल नया कोड। अगर इससे कोई समझ हो ... – Svish

+0

जब संभव हो तो ऑटो विलय करने का प्रयास किया, लेकिन यह हमेशा नहीं था। – Svish

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