किसी और चीज़ पर काम करने के दौरान मैं बिना किसी बदलाव के एक गुच्छा कैसे डाल सकता हूं


98

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

जवाबों:


133

आपके पास मुट्ठी भर विकल्प हैं:

  1. आइटम शेल्व करें। यह परिवर्तनों को बचाता है और उन्हें कार्यशील निर्देशिका से हटा देता है ताकि शाखा जारी रह सके। यह एक परिवर्तन सेट नहीं बनाता है।

    hg shelve --all --name "UnfinishedChanges"
    
    hg unshelve --name "UnfinishedChanges"
    

    अद्यतन / संपादित करें : नए संस्करण का उपयोग करने की आवश्यकता हो सकती है

    hg shelve -n "UnfinishedChanges"
    hg unshelve "UnfinishedChanges"
    

    आप अभी भी --nameएक विकल्प के रूप में उपयोग कर सकते हैं -n, लेकिन व्यापारिक --nameअब ऐसा नहीं लगता है । इसके अतिरिक्त, --allअब इसकी आवश्यकता नहीं है और व्यापारिक इच्छा वास्तव में इस पर ध्यान केंद्रित करती है।

  2. पैच कतार का उपयोग करके आइटम mq। यह कुछ मामलों में आश्रय देने के लिए बहुत भिन्न नहीं है, लेकिन अलग तरह से व्यवहार करता है। अंतिम परिणाम समान है, परिवर्तन हटा दिए जाते हैं और बाद में वैकल्पिक रूप से फिर से लागू किए जा सकते हैं। जब धक्का दिया जाता है, तो पैच तार्किक परिवर्तन-सेट होते हैं, जब पॉपप होते हैं तो वे कहीं और सहेजे जाते हैं और परिवर्तन-सेट इतिहास का हिस्सा नहीं होते हैं।

    hg qnew "UnfinishedWork"
    hg qrefresh
    hg qpop
    
    hg qpush "UnfinishedWork"
    
  3. उन्हें स्थानीय रूप से प्रतिबद्ध करें, पिछले परिवर्तन-सेट पर अपडेट करें और काम करना जारी रखें और अनाम शाखाओं (या कई सिर) का उपयोग करें। यदि आप बदलाव चाहते हैं, तो आप मर्ज कर सकते हैं। यदि आप परिवर्तन नहीं चाहते हैं, तो आप परिवर्तन-सेट को हटा सकते हैं ।

    hg commit -m"Commiting unfinished work in-line."
    hg update -r<previous revision>
    
    hg strip -r<revision of temporary commit>
    
  4. उन्हें एक नामित शाखा के लिए प्रतिबद्ध करें। वर्कफ़्लो तब विकल्प 3 जैसा ही हो जाता है - जब आप तैयार होते हैं तो मर्ज या स्ट्रिप।

    hg branch "NewBranch"
    hg commit -m"Commiting unfinished work to temporary named branch."
    hg update <previous branch name>
    

व्यक्तिगत रूप से मैं विकल्प 3 या 4 का उपयोग करता हूं क्योंकि मुझे परिवर्तन-सेट या चेक-इन आंशिक कोड में कोई दिक्कत नहीं है (इसलिए जब तक कि अंततः इसे धक्का न दिया जाए)। इसका उपयोग नए चरण के सामान के साथ संयोजन के रूप में किया जा सकता है ताकि जरूरत पड़ने पर अन्य उपयोगकर्ताओं से अपने स्थानीय परिवर्तन सेट को छिपाया जा सके।

मैं rebaseमर्ज से बचने के लिए परिवर्तन-सेट को स्थानांतरित करने के लिए कमांड का उपयोग भी करता हूं जहां एक मर्ज कोड के इतिहास में कुछ भी नहीं जोड़ता है। विलय मैं महत्वपूर्ण शाखाओं (जैसे रिलीज शाखाएं), या एक लंबे समय तक रहने वाली सुविधा शाखा से गतिविधि के बीच सहेजने के लिए करता हूं। histeditमेरे द्वारा परिवर्तन-सेटों को संपीड़ित करने के लिए उपयोग की जाने वाली कमांड भी है, जहां उनमें से "चैटिंग" मूल्य को कम करता है।

पैच कतार भी ऐसा करने के लिए एक सामान्य तंत्र है, लेकिन उनके पास स्टैक शब्दार्थ हैं। आप पुश और पॉप पैच करते हैं, लेकिन स्टैक में एक और पैच को "नीचे" किया जाता है, इसके लिए आवश्यक है कि इसके शीर्ष पर भी धक्का दिया जाए।

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


महान जवाब और उपयोगी उदाहरण के लिए धन्यवाद। क्या आपको पता है कि hg बुकमार्क्स का उपयोग करना भी एक विकल्प है?
एरिक

@ एरिक संभवतः, लेकिन मुझे इसका उपयोग करने का कोई अनुभव नहीं है।
एडम हल्ड्सवर्थ

2
3 विकल्प के साथ मदद करने के लिए बुकमार्क का उपयोग किया जा सकता है - आप अपने परिवर्तन को छिपाने के लिए बनाए गए संशोधन को लेबल करने के लिए एक का उपयोग कर सकते हैं। वे अपने दम पर कार्य नहीं कर सकते।
स्टीव काये

विकल्प --allमान्यता प्राप्त नहीं है। यह वैसे भी सभी परिवर्तनों को पूरा करने के लिए एक डिफ़ॉल्ट व्यवहार है।
naXa

@naXa हाय दोस्त, अगर मेरी एक आज्ञा थोड़ी है (शायद क्योंकि संस्करण बदल गया है), कृपया उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें और यदि आवश्यक हो तो मैं इसे स्वीकार करूंगा :-)
एडम हल्ड्सवर्थ

23

व्यक्तिगत रूप से, मुझे अब तक पोस्ट किए गए किसी भी उत्तर पसंद नहीं हैं:

  1. मुझे क्लोनिंग ब्रांचिंग पसंद नहीं है क्योंकि मुझे प्रत्येक प्रोजेक्ट को केवल एक डायरेक्टरी पसंद है। एक ही समय में विभिन्न निर्देशिकाओं पर काम करना मेरे संपादकों की हाल की फाइलों के इतिहास को पूरी तरह से गड़बड़ कर देता है। मैं हमेशा गलत फाइल को बदलना चाहता हूं। इसलिए मैं अब ऐसा नहीं करता।
  2. मैं shelveत्वरित सुधारों के लिए उपयोग करता हूं (यदि मैं अपने गलत परिवर्तन को किसी अन्य शाखा में स्थानांतरित करने के लिए, अगर मुझे लगता है कि मैं गलत हूं)। आप दिनों के बारे में बात कर रहे हैं, किसी भी तरह से मैं दिनों के लिए कुछ नहीं करना चाहूंगा।
  3. मुझे लगता mqहै कि इस तरह के साधारण सिचुएशन के लिए यह बहुत जटिल है

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

मान लीजिए कि आपके पास अपने परिवर्तन शुरू करने वाले परिवर्तनकर्ता ए हैं। इस बिंदु पर आप इसे कुछ समय के लिए अलग रखना चाहते हैं। सबसे पहले, अपना काम करें:

hg ci -m "Working on new stuff"

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

hg bookmark new-stuff

इन संशोधनों से पहले परिवर्तन पर वापस जाएं

hg update A

यहाँ से, आप कार्य करते हैं और परिवर्तन सी उत्पन्न करते हैं। अब आपके पास 2 सिर (बी और सी) हैं, आपको धक्का देने की कोशिश करने पर चेतावनी दी जाएगी। आप उस शाखा के प्रमुख को निर्दिष्ट करके केवल एक शाखा को धक्का दे सकते हैं:

hg push -r C

या आप new-stuffशाखा के चरण को गुप्त में बदल सकते हैं । गुप्त परिवर्तन को धक्का नहीं दिया जाएगा।

hg phase -r new-stuff --secret --force

विस्तृत उत्तर के लिए धन्यवाद! मैं वास्तव में उन (साधारण?) समस्याओं के लिए लोगों के वर्कफ़्लोज़ पढ़ना पसंद करता हूँ।
एरिक

मुझे लगता है कि mq कुछ अधिक के लिए जटिल है सिर्फ इस स्थिति है, लेकिन यह, जिनमें से एक यह उपयोग करता है, की एक व्यापक रेंज है पर्याप्त है कि यह की कीमत है, जबकि समय इसके साथ धाराप्रवाह बनने के लिए निवेश।
नॉर्मन ग्रे

12

स्थानीय स्तर पर अनियंत्रित परिवर्तन रखने के लिए, मेरे लिए सबसे आसान तरीका सिर्फ उन्हें पैच फाइल के रूप में सहेजना है।

hg diff > /tmp/`hg id -i`.patch

और जब आपको पिछले राज्य में वापस जाने की आवश्यकता हो:

hg up <REV_WHERE_SAVED>
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch

मैं पट्टी होगी /tmpऔर hg id -iऔर यह Windoze पर भी काम करेगा।
अनातोली टेकटोनिक

और hg upवहां जरूरत नहीं है।
अनातोली टेकटोनिक

1
यदि मैं किसी अन्य संशोधन पर पैच लागू करूँ तो क्या होगा? खासतौर पर अगर पैचेड फाइल को संशोधित किया गया हो।
Mapcuk

मर्क्यूरियल इसे मर्ज करने की कोशिश करेगा, और आपको वैसे भी संघर्ष से निपटना होगा।
अनातोली टेकटोनिक

6

आप कई बार अपने रेपो को क्लोन कर सकते हैं। मेरे पास एक रूट क्लोन है, फिर वहां से कई चिल्ड हैं। उदाहरण:

  • MyProject.Root
  • MyProject.BugFix1
  • MyProject.BugFix2
  • MyProject.FeatureChange1
  • MyProject.FeatureChange2

4 चिल्ड को रूट से क्लोन किया जाता है और रूट से पुश / पुल / किया जाता है। रूट तो कहीं नेटवर्क / इंटरनेट पर मास्टर रेपो से धक्का / खींचता है। रूट आपके प्रकार के व्यक्तिगत स्टेजिंग क्षेत्र के रूप में कार्य करता है।

तो आपके मामले में, आप बस एक नया रेपो तैयार करेंगे और काम शुरू करेंगे। दूसरे रेपो में अकेले अपना 'आश्रय' काम छोड़ दें। यह इत्ना आसान है।

केवल नकारात्मक पक्ष डिस्क स्थान का उपयोग है, लेकिन अगर आप एक चिंता का विषय थे, तो आप वैसे भी डीवीसीएस का उपयोग नहीं करेंगे;) ओह, और यह आपके विज़ुअल स्टूडियो "हालिया परियोजनाओं" सूची को प्रदूषित करता है, लेकिन क्या।

[निम्नलिखित टिप्पणियों को संपादित करें]: -

फिर निष्कर्ष निकालना ... आप जो कर रहे हैं वह पूरी तरह से ठीक है और सामान्य है। मेरा तर्क है कि यह काम करने का सबसे अच्छा तरीका है जब निम्नलिखित सही हों: 1) यह अल्पकालिक 2 है) आपको अन्य डेवलपर्स के साथ सहयोग करने की आवश्यकता नहीं है 3) बदलावों को आपके पीसी को छोड़ने तक की आवश्यकता नहीं है। / धक्का समय।


शाखाओं का उपयोग नहीं करने का कोई कारण? यह वही है जिसके लिए वे हैं और रेपो-क्लोनिंग की तुलना में काफी तेज हैं।
एडम हल्ड्सवर्थ

मेरे प्रश्न में मैंने निम्नलिखित कहा है: मेरा सामान्य तरीका क्लोन का उपयोग करके एक नई शाखा बनाना था, लेकिन बेहतर तरीके हो सकते हैं।
एरिक

1
@AdamHouldsworth, तकनीकी रूप से ये शाखाएं हैं ... बस कम समय वाले हैं। एक अल्पकालिक काम के लिए नामित शाखा बनाना पूरी तरह से बेवकूफी है। यह शाखाओं के नाम के उद्देश्य का दुरुपयोग करता है जो लंबे समय तक काम की कहानियों के लिए हैं।
नबंवर

@NathanE अगर आपको लगता है कि अल्पकालिक काम के लिए नामित शाखाएं "पूरी तरह से बेवकूफ" हैं, तो अन्य हल्के विकल्पों के रूप में अनाम शाखा, ठंडे बस्ते में डालने या पैच कतार भी है। मेरी राय में, पुन: क्लोनिंग, अन्य विकल्पों के चेहरे पर समान रूप से बेवकूफ है - यह एक संभावित लाभ है दो वीएस उदाहरणों में कोड के दो सेट खुले हैं, लेकिन मुझे शायद ही ऐसा करना है इसलिए क्लोन का उपयोग करना बिल्कुल नहीं है। 'मेरी सेवा करो। स्पष्टीकरण के लिए, मैं नीच नहीं था।
एडम हल्ड्सवर्थ

@ नथनई वे "लंबे समय तक काम की कहानियों" के लिए भी अनन्य नहीं हैं, अगर आप निरंतर एकीकरण का पालन करते हैं तो यह कुछ अच्छा है। डॉक्स से सीधे : "शाखाएँ तब घटित होती हैं जब विकास की रेखाएँ मोड़ती हैं", यदि आप किसी और चीज़ पर काम करने के लिए किसी वस्तु को आश्रय दे रहे हैं, तो यह मेरे लिए भिन्नता की तरह लगता है, चाहे वह कितनी भी लंबी अवधि की क्यों न हो।
एडम हल्ड्सवर्थ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.