2010-11-11 7 views
48

मेरे पास दो शाखाएं, डिफ़ॉल्ट और शाखा 1 है। गलती से हमारी टीम में एक व्यक्ति ने डिफ़ॉल्ट रूप से शाखा 1 को विलय कर दिया। शाखा 1 में सामग्री अभी तक डिफ़ॉल्ट रूप से विलय करने के लिए तैयार नहीं है (इसमें & निर्माण वातावरण का एक बड़ा पुनर्विक्रय शामिल है)।मैं Mercurial में विलय कैसे कर सकता हूं और बाद में उस शाखा के साथ फिर से विसर्जित कर सकता हूं?

हमने 'एचजी बैकआउट' के साथ एक प्रयोग किया, विलय का समर्थन किया (सुनिश्चित नहीं है कि यह करने का सही तरीका है)। फिर शाखा 1 से परिवर्तन डिफ़ॉल्ट रूप से हटा दिए जाते हैं, जो ठीक है - लेकिन हम शाखा 1 के साथ पुनर्जन्म नहीं कर सकते हैं।

हमें इस मुद्दे को कैसे हल करना चाहिए?

+0

मर्ज धकेल दिया गया है और अब बहुत से लोगों को सार्वजनिक है, या आप खजाने की एक चलाया सूची को नुकसान की जा सकती है? –

+0

मुझे यह कहने से नफरत है, लेकिन आप तब तक नहीं कर सकते जब तक कि कोई भी खींच नहीं लेता है। –

+0

दुर्भाग्य से विलय को सार्वजनिक भंडार में धकेल दिया गया था और कुछ लोगों ने इसे वापस करने के लिए कोई बदलाव करने से पहले इसे खींच लिया था। –

उत्तर

84

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

कोई और परिवर्तन नहीं, साझा नहीं किया गया (कोई धक्का नहीं/खींचता है)

प्रोग्रामर विलय कर दिया गया है, लेकिन कुछ भी नहीं किया है, और न ही (रों) वह, किसी के साथ परिवर्तन को साझा किया है किसी भी तरह से

इस मामले में में, बस स्थानीय क्लोन त्यागें, और एक मिल एक सुरक्षित भंडार से ताजा क्लोन।

मर्ज की चोटी पर स्थानीय परिवर्तन, साझा

प्रोग्रामर विलय कर दिया गया है, और मर्ज के आधार पर काम जारी रखा। विलय के बाद वाले परिवर्तनों को रखा जाना चाहिए, लेकिन मर्ज स्वयं को हटा दिया जाना चाहिए।परिवर्तन किसी

इस मामले में के साथ साझा नहीं किया गया है (निम्नलिखित changesets + विलय) मैं चार में से एक करना होगा: रिबेस एक्सटेंशन का उपयोग करने, इस एक स्थान से changesets चले जाएँगे

  1. कोशिश अन्य को। यदि परिवर्तन कोड-परिवर्तनों पर आधारित होते हैं जो विलय के साथ पेश किए गए थे, तो अंतर को सुलझाने के लिए कुछ मैन्युअल कार्य किया जाना चाहिए।
  2. पैच-कतार में रखे जाने वाले परिवर्तनों को खींचने के लिए एमक्यू एक्सटेंशन का उपयोग करने का प्रयास करें, फिर उन्हें एक अलग स्थान पर दबाएं। हालांकि, यह विलय
  3. पर आधारित परिवर्तनों के संदर्भ में REBASE एक्सटेंशन के समान समस्या होगी, एक स्थान से दूसरे स्थान पर परिवर्तनों की प्रतिलिपि बनाने के लिए TRANSPLANT एक्सटेंशन का उपयोग करने का प्रयास करें। फिर भी, पहले दो के साथ एक ही समस्या मौजूद है।
  4. फिर से काम करें, शायद अलग-अलग बदलावों की मदद से उन परिवर्तनों में किए गए परिवर्तनों को करने के लिए जिन्हें मैं त्यागना चाहता हूं, और उन्हें सही स्थान पर फिर से करें।

मर्ज changeset + सभी निम्नलिखित changesets से छुटकारा पाने के लिए, वहाँ विकल्पों में से एक जोड़ी है:

  1. उपयोग MQ विस्तार में पट्टी आदेश

    hg strip <hash of merge changeset> 
    
  2. क्लोन और खींचें, और आगे बढ़ने वाले परिवर्तनों के हैश निर्दिष्ट करें, लेकिन मर्ज सहित नहीं। संक्षेप में, क्षतिग्रस्त क्लोन से एक नए में खींचकर एक नया क्लोन बनाएं, और उस मर्ज में खींचने से बचें जिसे आप नहीं चाहते हैं।

    hg clone damaged -r <hash of first parent> . 
    hg pull damaged -r <hash of second parent> 
    

मर्ज दूसरों को धक्का दे दिया, क्लोन

पर नियंत्रण प्रोग्रामर भंडार में महारत हासिल करने या किसी को किसी और धक्का दे दिया गया है, या कोई प्रोग्रामर रिपोजिटरी से खींच लिया। हालांकि, आप (सभी डेवलपर्स के समूह में) सभी रिपॉजिटरीज पर नियंत्रण रखते हैं, जैसा कि आप अधिक काम करने से पहले सभी से संपर्क कर सकते हैं और बात कर सकते हैं

इस मामले में, मैं देखता हूं कि चरण 1 या 2 किया जा सकता है, लेकिन इसे कई जगहों पर किया जाना पड़ सकता है, इसलिए इसमें बहुत सारे काम शामिल हो सकते हैं।

अगर किसी ने मर्ज चेंजेट के आधार पर काम नहीं किया है, तो मैं साफ करने के लिए चरण 1 या 2 का उपयोग करता हूं, फिर मास्टर रिपोजिटरी को दबाता हूं, और सभी को मास्टर रिपोजिटरी से ताजा क्लोन प्राप्त करने के लिए कहता हूं।

मर्ज धक्का दे दिया, आप क्लोन

प्रोग्रामर पर नियंत्रण की जरूरत नहीं है mergeset धक्का दे दिया, और आप नहीं जानते कि जो मर्ज changeset होगा। दूसरे शब्दों में, यदि आप इसे से रिपॉजिटरीज़ से मिटाने में सफल होते हैं, तो जो अभी भी है, उससे एक भटकने वाला धक्का इसे वापस लाएगा।

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

M   <-- this is the one you want to disregard 
/\ 
* * 
| | 
* * 
| | 

, बस दो शाखाओं में काम जारी रखने के: तो फिर बाद में आप दो विलय

| | 
* * 
| M |  <-- this is the one you want to disregard 
|/ \| 
* * 
| | 
* * 
| | 

, असली मर्ज आप चाहते हैं:

m 
/\ 
* * 
| | 
* * 
| M |  <-- this is the one you want to disregard 
|/ \| 
* * 
| | 
* * 
| | 

फिर आप एक अशक्त मर्ज कर सकते हैं लटकते सिर से छुटकारा पाने के लिए। दुर्भाग्यवश मुझे नहीं पता कि TortoiseHg को छोड़कर इसे कैसे किया जाए। इसमें एक चेकबॉक्स है जहां मैं शाखाओं में से किसी एक से परिवर्तन को त्याग सकता हूं।

टोर्टोइज एचजी के साथ, मैं उस मर्ज को अपडेट करूंगा जो मैं रखना चाहता हूं (सबसे ऊपर, लोअरकेस एम), फिर नीचे दिए गए लटकते मर्ज हेड पर राइट-क्लिक करें और फिर "मर्ज लक्ष्य से सभी परिवर्तनों को छोड़ दें" अन्य) संशोधन ": discard changes from target

+7

आपका एचजी फू मजबूत है .. और आपके पास गैर-फ्रीहैंड सर्किल (इसलिए +1) के अलावा एसीआईआई आरेख हैं, लेकिन आरेखों और मंडलियों के साथ इसका कोई संबंध नहीं था :) –

+1

मेरी इच्छा है कि मैं कुछ और वोट दूंगा बार .... –

+4

जैसा कि [उत्तर # 4397 9 0 प्रश्न # 7476481] में उल्लेख किया गया है (http://stackoverflow.com/a/7476481/439790), परिवर्तनों को त्यागने का तरीका यह है: 'hg विलय 4 --tool आंतरिक: स्थानीय' – zigarn

0

आप वास्तव में अच्छी तरह से विलय का समर्थन नहीं कर सकते हैं। आईएमओ, इसे संभालने का सबसे अच्छा तरीका सिर्फ विलय को त्यागना होगा और विलय से पहले परिवर्तनों के झुंड को जारी रखना होगा, जिससे एक लटकना सिर छोड़ दिया जा सकता है (जिसे छीन लिया जा सकता है)। यदि विलय के बाद से अन्य परिवर्तन हुए हैं, तो उन्हें नए "अच्छे" सिर पर पुनर्जीवित किया जा सकता है।

0

इस उत्तर मानता है कि आप पहले से ही

यह धकेल दिया (कम से कम एक) अनसुलझे सिर, में परिणाम होगा क्या तुम सिर्फ भूल गया पर निर्भर करता है। किस शाखा से सिर्फ धक्का दिया गया है इसके आधार पर अधिक।

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

मैं आमतौर पर इस कारण से शाखा विलय करने से पहले रेपो का बैकअप (स्थानीय रूप से) क्लोन करता हूं। मैं हमेशा खींचने से पहले जांचता हूं।

एरिक रेमंड is working on something जो कम या कम है DVCS अज्ञेयवादी जो उम्मीद कर सकते हैं (उम्मीद है) आपके द्वारा वर्णित ओप्स की तरह परिस्थितियों में मदद कर सकते हैं, लेकिन मुझे नहीं लगता कि वह एचजी समर्थन को एक या दो सप्ताह के लिए पूरी तरह कार्यान्वित करने जा रहा है। फिर भी, यह देखने लायक हो सकता है।

लेकिन, केवल उपयोगी अगर किसी ने 'ओउप्स' टिप खींच ली है।

0

महान इनपुट के लिए सभी को धन्यवाद! चूंकि हम समस्या को हल करने के लिए भीड़ में थे, और हमारा समूह Mercurial के लिए अपेक्षाकृत नया है, हम एक बहुत व्यावहारिक समाधान का उपयोग किया।

हमारे भंडार सर्वर पर हमने एक नया भंडार बनाया, फिर हमने पुराने भंडार को विलय से ठीक पहले संशोधन तक क्लोन किया। फिर सर्वर पर नए क्लोन को धक्का दिया और सभी को नया लिंक भेज दिया। सौभाग्य से हम एक बहुत छोटी विकास टीम हैं।

शायद नहीं सबसे cosher तरह से समस्या को हल करने, लेकिन यह काम किया :)

+0

इसे उत्तर के रूप में चिह्नित नहीं किया जाना चाहिए, लास वी। कार्ल्सन प्रतिक्रिया होना चाहिए। – EtienneT

+0

यह उस समय हम हल नहीं किया गया था, लेकिन मैं सहमत हूं। लस समाधान सही है। –

0

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

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

2

हमने 'एचजी बैकआउट' के साथ एक प्रयोग किया, विलय का समर्थन किया (सुनिश्चित नहीं है कि यह करने का सही तरीका है)। फिर शाखा 1 से परिवर्तन डिफ़ॉल्ट रूप से हटा दिए जाते हैं, जो ठीक है - लेकिन हम शाखा 1 के साथ पुनर्जन्म नहीं कर सकते हैं।

मैं विलय रद्द करने के लिए बैकआउट का उपयोग करता हूं। आप रीमर्ज नहीं कर सकते हैं, लेकिन आप "बैकआउट बैकआउट मर्ज" करने में सक्षम हैं, यानी जब आप रिमर्ज करना चाहते हैं, तो आप "बैक आउट मर्ज चेंजेट ..." पर 'एचजी बैकआउट' बनाते हैं और फिर शाखा को फिर से मर्ज करते हैं।

उदाहरण:

7  M  remerge 
    6 / \ 
    5 * |  hg backout 3 (backout backout) 
    4 | *  fix error 
    3 * |  hg backout 2 
    2 M |  fail merge 
    / \ 
    1 *  * 
    |  | 
+0

यह प्रमोशिंग दिखता है। वास्तव में मुझे क्या चाहिए! मैं इसका परीक्षण करूंगा। –

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

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