version control - टीएफएस: सर्वोत्तम अभ्यासों को मिलाएं




version-control tfs (2)

हमारे पास एक मानक शाखा वास्तुकला है जहां हमारे पास प्रत्येक टीम के लिए एक विकास शाखा है, एक आम एकीकरण शाखा (जहां से सभी विकास शाखाएं शाखाएं हैं) और एकता से शाखाओं का उत्पादन शाखा।

विकास के चरण के दौरान मैं विकास शाखा में कई कमाई करता हूं। चरण के अंत में मैं अपने परिवर्तनों को एकीकरण में और बाद में उत्पादन के लिए मर्ज करता हूं।

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

मैं सर्वोत्तम अभ्यासों के बारे में आपकी राय सुनना चाहता हूं


मैंने हमेशा ही एकीकरण शाखा में कई तरह से एकीकरण किया है, केवल मेरे द्वारा विलय की गई परिवर्तनों की श्रेणी को निर्दिष्ट करते हुए।

विकास के चरण में अलग-अलग कार्य मदों से संबंधित कार्य आइटम विकास के चरण के काम आइटम हैं। मुझे नहीं लगता कि उन्हें एकीकरण या रिलीज के लिए रोल करने की कोई ज़रूरत है

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

तो यह संक्षेप में बताओ मुझे कोई कारण नहीं है क्योंकि थोक विलय के साथ नहीं जाना


  1. देव से विलय * -> एकीकरण और एकता -> उत्पादन हमेशा "कॉपी" मर्ज होना चाहिए। यह आपकी डाउनस्ट्रीम शाखाओं की स्थिरता को संरक्षित करने का सबसे सुरक्षित तरीका है
    1. लक्ष्य शाखा से नवीनतम परिवर्तन लेने के लिए पहले दूसरे दिशा में मर्ज करें (जैसे इंटीग्रेशन -> डेविस)।
    2. यदि कोई संघर्ष है, तो केस आधार पर मामले पर डीफ्स को संभाल लें। स्वीकार करें मेर्ज (या तो ऑटो या मैनुअल) आमतौर पर वांछित परिणाम होता है, लेकिन कभी-कभी आप एक या अन्य शाखा की प्रतिलिपि को अपरिवर्तित करना चाहेंगे।
    3. इन परिवर्तनों को पूरी तरह से शामिल, प्रतिक्रिया करने और स्थिर करने के लिए स्रोत शाखा (हमारे मामले में देव # 2) का उपयोग करें
    4. इच्छित दिशा में मर्ज करें (जैसे देव 2 -> एकीकरण) सभी संघर्षों को स्वीकार करें जैसा कि स्वीकार करें [उर्फ "स्रोत से कॉपी करें"]
    5. सुनिश्चित करें कि लक्ष्य # 1-4 के बीच लक्ष्य शाखा में कोई बदलाव नहीं है अगर देव शाखा जल्दी और अक्सर मर्ज स्वीकार कर रहा है, जैसे यह होना चाहिए, तो यह उम्मीद है कि-छोटी प्रक्रिया के दौरान लक्ष्य शाखा को लॉक करने के लिए भारी नहीं होना चाहिए। यदि आप किसी भी कारण मौत के एक "बड़ा धमाका" मर्ज की आशा करते हैं, तो एक अच्छा मौका लॉकिंग अन्य टीमों को एक ही बात करने से समानांतर करने से रोक देगा, इसलिए आपको तैयार होने तक चरण # 1-4 के बार-बार पुनरावृति करना पड़ सकता है ।
  2. जब भी संभव हो "मर्ज" मर्ज करें यही है, चीजों को एक ही क्रम में मर्ज कर दें, जिनकी जांच की गई थी। अगर 10, 20 और 30 में परिवर्तन किए गए हैं तो ए - बी से विलय करने के लिए उम्मीदवार हैं, तो इनमें से कोई भी मर्ज श्रेणियां एक "पकड़ो": 10 ~ 10, 10 ~ 20, 10 ~ 30 # 10 छोड़ने वाली कोई भी बदलाव की सीमा को "चेरी पिक" के रूप में जाना जाता है। एक बार जब आप चेरी उठाते हैं, तो आप कुछ खतरों में चले जाते हैं:
    1. आप मर्ज डाउन का उपयोग नहीं कर सकते हैं , ऊपर वर्णित मॉडल की प्रतिलिपि बनाएँ । अकेले ही, लौरा विंगरर्ड कहेंगे कि आप एक कटौती पर कूद रहे हैं।
    2. अगर आपकी सीमा में छुई गई किसी भी फाइल को पहले भी छू दिया गया था, तो आपको एक 3-रास्ता सामग्री मर्ज करना होगा ताकि केवल चेरी-चुने गए डिफों का प्रसार किया जा सके। कोई अंतर उपकरण सही नहीं है; आप उद्देश्य से अधिक कोड लाने का एक गैर-जोखिम जोखिम जोड़ रहे हैं, गलती से लक्ष्य में किए गए परिवर्तनों को ओवरराइट करते हैं, तार्किक बगें शुरू करते हैं जहां दो शाखाएं अलग हो जाती हैं, आदि।
    3. अनुमानित रूप से अधिक स्थिर शाखा में आपके द्वारा किए जा रहे परिवर्तनों का सेट एक ऐसे कॉन्फ़िगरेशन का प्रतिनिधित्व करता है जिसे पहले कभी नहीं बनाया गया या परीक्षण किया गया था आप लक्ष्य शाखा के अंतिम राज्य के बारे में एक सभ्य अनुमान बना सकते हैं। "मैं मॉड्यूल फू को प्रभावित करने वाले सभी परिवर्तनों को मर्ज कर रहा हूं, और मैंने देव में फू के नए संस्करण का परीक्षण किया है, ताकि फ़ू एकीकरण में कैसे व्यवहार करेगा, है ना?" ज़रूर ... शायद ... यदि आप अपने सिर में हर निर्भरता को ट्रैक कर सकते हैं (जिसमें वह सब कुछ शामिल है जो एकता में बदल गया हो, जब आप देव का परीक्षण कर रहे थे)। लेकिन ये अनुमान आपके एससीएम उपकरण श्रृंखला से किसी भी तरह से ज्ञात या मान्य नहीं हैं।
    4. विशेष रूप से टीएफएस में, चेरी उठाकर जहां नाम स्थान परिवर्तन शामिल हैं, सिर्फ जलाए जाने के लिए कह रहे हैं। यदि आपकी संस्करण रेंज और / या पथ स्केप में नाम बदलने के स्रोत को शामिल नहीं किया जाता है, तो यह इसके बजाय एक शाखा के रूप में आ जाएगा। यदि आप लक्ष्य को बाहर निकालते हैं, तो वह एक हटाए गए पेंड यदि आपके पथ के क्षेत्र में एक हटाना की जड़ शामिल नहीं है, तो आपको गुप्त त्रुटियां मिलेंगी। यदि आपकी सीमा एक समय हटाना और पुनः हटाना के बीच में फैलती है, तो आपको लक्ष्य में दिखाई देने वाली "प्रेत" फाइलें प्राप्त होंगी, भले ही आपने खुद को हटाना रद्द न करें यदि आप अपने सभी पथ और संस्करण स्कोप के साथ चलें मर्ज करते हैं, लेकिन ऐसा नहीं करते हैं, तो सभी उम्मीदवार परिवर्तनों के समाप्त होने के बाद स्रोत नाम से अलग लक्ष्य नाम के साथ समाप्त करना संभव है। मुझे यकीन है कि इस कॉम्बो के गलत तरीके से जाने के लिए और भी बहुत सारे तरीके हैं जो अभी नहीं आ रहे हैं ... बस मुझ पर भरोसा करें
  3. मर्ज होने से पहले हमेशा लक्ष्य शाखा पर जाएं। अंतिम सुरक्षा के लिए उन्नत संस्करण: कार्यस्थान को सिंक्रनाइज़ करें, जहां आप टिप के पास या उसके पास की एक विशिष्ट परिवर्तन संख्या में विलय करेंगे, फिर भी [पकड़ने] उसी बदलाव के लिए मर्ज करेंगे ऐसा करने से कुछ संभावित मुद्दों से बचा जाता है:
    1. बासी कोड में मर्ज करना, भ्रमित 3-रास्ता डिफिफ प्रदान करते हुए जो टिप पर आपको दिखाई देने वाले बदलावों को हटाते हैं। [आप अंततः उन्हें चेकिन पर पुनः प्राप्त करें + संकल्प लें, लेकिन जब आपको दोनों से बचा जा सकता है, तो दो जोखिम भरा डिफों के माध्यम से जाने का कोई कारण नहीं है]
    2. संघर्ष समाधान प्रक्रिया के माध्यम से दो बार जाने के लिए: एक बार मर्ज पर, चेकिन पर एक बार। सामान्य मामले में इस से बचने का कोई रास्ता नहीं है, लेकिन अधिकांश समय में # आप एक साथ मिलकर किए गए परिवर्तनों के साथ मिलकर + संकल्प बनाते हैं, उस तुलना में छोटा है, जो आपको ऐसे कार्यस्थानों में मिलते हैं, जो कि दिन या सप्ताह का हो सकता है तारीख।
  4. लेबल (या वर्कस्पेस) से मर्ज न करें, जब तक आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं आइए टीएफएस लेबल्स की पेशकश की सुविधाओं की समीक्षा करें और उसके बाद विश्लेषण करें कि क्यों प्रत्येक सुरक्षित और सुसंगत विलय के लिए अनुचित है।
    1. लेबल समय में कई बिंदुओं का प्रतिनिधित्व कर सकते हैं यदि कोई लेबल वीसीएस के लगातार स्नैपशॉट का प्रतिनिधित्व करता है - और इसका हमेशा उद्देश्य था - तो उसके पास तिथि या परिवर्तनों के # पर कोई तकनीकी लाभ नहीं है दुर्भाग्य से यह बताना मुश्किल है कि क्या एक लेबल वास्तव में समय के अनुरूप है। यदि नहीं, तो लेबल से विलय करने के लिए नेतृत्व कर सकते हैं:
      1. अनजाने चेरी-पिकिंग, यदि सीमा एक लेबल के साथ शुरू होती है जो एक आइटम को अपने पहले उम्मीदवार के आगे एक समय पर इंगित करता है
      2. अनजाने में बहिष्करण, यदि सीमा उस लेबल से शुरू होती है जो श्रेणी के अंत से पहले एक आइटम को इंगित करती है
      3. अनजाने में बहिष्करण, यदि सीमा एक लेबल के साथ समाप्त होती है जो श्रेणी की शुरुआत से पहले किसी आइटम को इंगित करती है
    2. लेबल संस्करणों में मदों का एक विशिष्ट समूह दर्शाता है। उन फ़ाइलों और फ़ोल्डरों को जानबूझकर बहिष्कृत करने के लिए उपयोग किया जा सकता है जो एक शुद्ध रिकर्सिव क्वेरी अन्यथा दिखाई देगी। यह सुविधा भी, मर्ज ऑपरेशन के लिए एक खराब मैच है। (और फिर, यदि आपको इस क्षमता की ज़रूरत नहीं है , तो आप दिनांक और परिवर्तनों के साथ कुछ भी प्राप्त किए बिना निम्नलिखित जोखिम उठा रहे हैं।)
      1. लंबित हटाना के रूप में मर्ज किए जाने के बजाय लेबल में मौजूद आइटम को केवल उपेक्षित कर दिया जाएगा। अब तक कवर किनारे वाले कुछ मामलों के विपरीत, यह एक बड़ा सौदा है जो मुख्यधारा के परिदृश्यों में होने की संभावना है, लेकिन ज्यादातर लोग याद करते हैं। [परिणामस्वरूप, टीएफएस 2010 लेबल के भीतर हटाए गए आइटम्स के लिए समर्थन जोड़ता है।]
      2. अनजान चेरी का चयन, यदि आप उस लेबल को एक आइटम जोड़ते हैं जो कुछ समय के लिए मौजूद है, लेकिन पूर्ववर्ती साइड इफेक्ट में से एक के कारण पहले विलय से बाहर रखा गया था।
      3. जानबूझकर चेरी का चयन इस सुविधा से जुड़ा हुआ यह मर्ज हमारे दिशानिर्देशों में से एक को तोड़ने के लिए है, इसलिए जाहिर है कि यह बिल्कुल सही कारण नहीं है। इसके अलावा, यह फ़ाइल स्तर पर चेरी उठाता है, जो परिवर्तनों से "साधारण" चेरी का चयन करने से भी ज्यादा खतरनाक है
    3. लेबल अनुकूल अनुकूलन नाम, मालिक, और टिप्पणियां हैं इस प्रकार हमारे पास एक शुद्ध उपयोगिता अंतर बनाम तिथियां / बदलाव हैं; कोई तकनीकी लाभ प्रदान नहीं किया जाता है लेकिन यहां तक ​​कि यह उतना आकर्षक नहीं है जितना लगता है। टीएफएस UI में वास्तव में लेबलों को प्रदर्शित करने के लिए बहुत कुछ नहीं करता, जबकि आप सभी जगहों पर परिवर्तनों की टिप्पणियां देख सकते हैं। स्वामी द्वारा पूछताछ तेज (सर्वर साइड) है, लेकिन अधिकतर अन्य खोज धीमे हैं (क्लाइंट साइड) जब तक कि आप सटीक लेबल नाम नहीं जानते हों प्रबंधन सुविधाएं लगभग मौजूद नहीं हैं कोई चैंज या ऑडिटिंग नहीं, केवल टाइमस्टैम्प कुल मिलाकर, इन परिवर्तनों द्वारा प्रदान की जाने वाली प्रतिज्ञा को छोड़ने का शायद ही कोई कारण नहीं है।
  5. हमेशा एक बार में पूरी शाखा को मिलाएं। फ़ाइलें या सब-पार्टियों को विलय करना कभी-कभी मोहभंग होता है, लेकिन अंततः केवल एक नए आवरण के तहत चेरी-उठा लेने के लिए होता है।
  6. आगे की योजना। दुर्भाग्य से, टीएफएस में पुन: पेरेंटिंग शाखाएं एक दर्दनाक विषय है। कभी-कभी यह कठिन होता है, कभी-कभी यह केवल कुछ ही कदम है, लेकिन यह कभी स्पष्ट नहीं है ; कोई कमांड में निर्मित नहीं है (2010 तक) इसे 2005/2008 में खींचकर आपके वर्तमान शाखा संरचना, वांछित ढांचे का बहुत गहरा ज्ञान और विभिन्न टीएफ आदेशों के दुष्प्रभावों का दुरुपयोग करने की आवश्यकता है।
  7. शाखाओं के अंदर शाखाएं न बनाएं उदाहरण के लिए, शाखाओं और मर्ज को कभी-कभी अनुशंसित युग्मित परियोजनाओं के बीच सामान्य मॉड्यूल या बायनेरिज़ बनाए रखने का एक तरीका माना जाता है। मुझे नहीं लगता कि यह आपके साथ शुरू करने के लिए बहुत अच्छी सलाह है - अपने निर्माण प्रणाली को अपना प्राथमिक काम ठीक से करने के लिए बेहतर है, अपने स्रोत नियंत्रण प्रणाली को कुछ करने में जो वास्तव में ऐसा करने के लिए डिज़ाइन नहीं किया गया है, की तुलना में बेहतर है। वैसे भी, यह "साझाकरण" युक्तियां बहुत सारी परियोजनाओं के साथ एससीएम उद्देश्यों के लिए एक व्यापक शाखा पदानुक्रम के अंदर रहते हैं। यदि आप सावधान नहीं हैं, तो टीएफएस खुशी से आपको वर्जिनियल कंट्रोल मदों के बीच कई-से-कई शाखा संबंधों को पैदा करने देगा। गुड लक यह कि बाहर सॉर्ट कर रहा है (मुझे एक बार इसे एक ग्राहक के लिए करना था, अच्छा नहीं था।)
  8. स्वतंत्र रूप से दो शाखाओं में समान सापेक्ष पथ वाली फाइलें न बनाएं; उपयोग उन्हें मर्ज करने के लिए शाखाओं के आसपास या आप घंटे बिताएं नाम स्थान संघर्ष का पीछा करेंगे। (2010 में एन / ए)
  9. उस पथ के शीर्ष पर फ़ाइलों को फिर से जोड़ न दें जहां मौजूद अन्य वस्तुओं का उपयोग किया जा सकता है चाहे पुराने आइटम का नाम बदल दिया गया हो / हटा दिया गया हो, या बस हटाए गए, आपको मर्ज समय पर चुनौतियों का सामना करना होगा; कम से कम, इसे पूरी तरह से प्रचार करने के लिए दो चेकइन की आवश्यकता होगी। (2010 में एन / ए, हालांकि अनुभव अभी कुछ हद तक अवक्रमित है, केवल 1 चेकइन आवश्यक है, आइटम की सामग्री संरक्षित है, लेकिन नाम का इतिहास उस शाखा में है और सभी डाउनस्ट्रीम शाखाओं में है)
  10. जब तक आप यह नहीं जानते कि आप क्या कर रहे हैं / बल फ्लैग का उपयोग न करें सभी / बल विलय प्रभावी रूप से चेरी उठाता है, जिससे बहुत ही जोखिम होते हैं (कोड को हल करने की प्रक्रिया, आदि आदि के दौरान खो जाना)।
  11. जब तक आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं / आधारहीन झंडे का उपयोग न करें आपको हटाए जाने पर याद आती है - लेबल के समान, उस नाम के बजाय हमेशा अशुभ किनारे के मामलों की बजाय शाखाओं में घुस जाते हैं। आपको कोई भी डेबिट / क्रेडिट सुरक्षा नहीं मिलती। और सबसे खराब, आप नए शाखा रिश्तों का निर्माण करेंगे कभी कभी। (कोई भी प्रतिक्रिया उपयोगकर्ता को दिखाती है कि क्या प्रत्येक लक्ष्य वस्तु नया है, नए रिश्ते के साथ पुरानी है या पुराने संबंधों के साथ पुराना है)
  12. बचें / छोड़ें (और समतुल्य रूप से, स्वीकार करें अपने प्रस्तावों) जब संभव हो कुछ परिवर्तनों को छोड़कर केवल बाद वाले को स्वीकार करने के लिए चेरी-पिकिंग का एक और नाम है :)
  13. सामान्य में अपने प्रस्तावों के साथ सावधान रहें प्रत्येक के पास अद्वितीय डाउनस्ट्रीम प्रभाव हैं जो हाथों पर मर्ज पर इसके प्रभाव से अलग हैं।
    1. स्वीकार्यता एक "प्रति" मर्ज पाने का एक त्वरित और शक्तिशाली तरीका है, जैसा कि पहले दिशानिर्देश में वकालत की गई है। यदि आप इसे अन्य परिदृश्यों में भी उपयोग करते हैं, तो याद रखें कि आप केवल फाइल सामग्री को समान बनाने के लिए टीएफएस नहीं बता रहे हैं। आप यह कह रहे हैं कि दो फाइल पूरी तरह से एक संस्करण पीओवी से सिंक्रनाइज़ेशन में हैं बुद्धिमानी के लिए, लक्ष्य फ़ाइल में कोई भी पूर्व परिवर्तन जो विपरीत दिशा में विलय हो सकता है, उसे अब स्वीकार नहीं किया जाएगा जब आप स्वीकार्यथीर्स को जांचते हैं।
    2. ध्यान दें कि एक AcceptMerge (ऑटो या मैनुअल) जिसके परिणामस्वरूप सामग्री स्रोत फ़ाइल के समान है सर्वर द्वारा स्वीकृत थीमर्स माना जाएगा। चेकइन webservice प्रोटोकॉल में पाया जाने वाला कोई भिन्नता नहीं है
    3. जब आपका नाम बदल जाता है तो स्वीकृति का उपयोग करना आपके दिमाग को मोड़ सकते हैं आप जल्दी से एक ऐसे परिस्थिति में समाप्त हो जाएंगे जहां "समान" आइटम के विभिन्न शाखाओं में अलग-अलग नाम हैं। यह मानते हुए कि आपके पास पहली जगह में परिवर्तनों को त्यागने का एक अच्छा कारण है, यह घटना असुरक्षित प्रति से है - वास्तव में, संभवतः यह संभव है कि आप अपने मेकफाइल के लिए ब्रेक ब्रेक या एक बंद अनुकूलन से बचें। यह सिर्फ इंसानों के लिए भ्रमित है, और आपके पास किसी भी स्वचालन स्क्रिप्ट को तोड़ने की संभावना है जो कि ग्रहण करते हैं कि वृक्ष संरचना शाखा से शाखा के अनुरूप हैं
    4. AcceptMerge एक कारण के लिए डिफ़ॉल्ट है कभी-कभी यह कड़ाई से जरूरी लगने की तुलना में अधिक संस्करण विरोध की ओर जाता है, लेकिन जब सही मर्जिंग की आवश्यकता होती है तो सबसे सुरक्षित विकल्प होता है। (उदाहरण प्राथमिक दिशानिर्देश के चरण # 1 "मर्ज हो जाएं, कॉपी करें"।) जब तक आप अन्य दिशानिर्देशों का पालन कर रहे हैं, तब तक मर्ज की संख्या में मैन्युअल ध्यान देने की आवश्यकता होती है - नाटकीय रूप से इसलिए यदि आप एक से आ रहे हैं वर्कफ़्लो चेरी-पिकिंग पर भारी है
  14. बग्स को उन परिवर्तनों से जोड़ा जाना चाहिए जहां तय वास्तव में किया गया था। यदि आपको बाद में डाउनस्ट्रीम शाखाओं में ड्रिल करने की आवश्यकता है, तो यह देखने के लिए कि कब (और संभवत: कैसे) बगफिक्स का प्रचार किया गया था, यह एक विशुद्ध स्रोत नियंत्रण फ़ंक्शन है अतिरिक्त सामान के साथ कार्य आइटम को प्रदूषित करने की कोई आवश्यकता नहीं है, जिस तरीके से आप मूल रूप से विलीन हो जाते हैं, उसमें बहुत कम बदलाव करते हैं। 2005/2008 में आप 'टीएफ मर्ज' कमांड या एट्रिस साइडकिक्स जैसे तृतीय पक्ष यूआई के साथ मर्ज इतिहास का पता लगा सकते हैं। 2010 में आपको निफ्टी विज़ुअलाइजेशन विजुअल स्टूडियो में बनाया गया है। MSDN पर निर्देश और स्क्रीनशॉट




tfs