2012-02-04 5 views
45

में एकाधिक स्टैश को गठबंधन करने के लिए यह पिछले दो हफ्तों में शाखा frontend पर एक पाइपलाइन है।गिट

| [email protected]{3}[email protected]{1} (दो छोटे कामों को छोड़कर) के बाद से सभी कोड है
| छोटे कमिट
| छोटे प्रतिबद्ध
| दो हफ्ते पहले भारी थोक प्रतिबद्धता, अब rebased और [email protected]{1}

मेरा कामकाजी पेड़ वर्तमान में साफ है।
[email protected]{1} दो हफ्ते पहले सामान्य विकास कोड की थोक प्रतिबद्धता से सामग्री है (इसे पहले स्थान पर रखा जाना चाहिए था)। यह प्रतिबद्धता पूर्ववत हो गई और छेड़छाड़ करने के लिए चले गए।
[email protected]{3}[email protected]{1} के बाद से उस पेड़ पर सबसे नया काम है (कुछ बदलाव किए गए हैं)।

मुझे अपने काम करने वाले पेड़ में इन दोनों छेड़छाड़ों को एक साथ जोड़ना होगा ताकि मैं इस विशाल पूल के काम से कई काम कर सकूं।

मैं git stash apply [email protected]{1} तो भाग गया मैंने कोशिश की:

git stash apply [email protected]{3}
git stash show -p | git stash apply [email protected]{3}

लेकिन मैं दोनों ही मामलों में 'गंदा काम कर पेड़' मिलता है। मैं इस काम को एक साथ कैसे मिला सकता हूं? क्योंकि [email protected]{3} नया है, मैं चाहता हूं कि यह [email protected]{1} पर विवाद हो, जहां भी विवाद हो।

उत्तर

35

यदि आप काम कर रहे पेड़ में संशोधित फ़ाइलों के साथ कोई संघर्ष नहीं करते हैं तो आप केवल एक स्टैश लागू कर सकते हैं, इसलिए, सुनिश्चित करें कि git status में कोई संशोधित फ़ाइलें नहीं हैं, यदि वहां हैं, तो उन्हें प्रतिबद्ध करें। फिर करें:

git stash apply [email protected]{1} 
git commit -a 
# Enter your commit message 
git stash apply [email protected]{3} 

फिर आप या तो एक नया प्रतिबद्ध कर सकते हैं, या पिछले एक को जोड़कर उन्हें जोड़ सकते हैं। प्रत्येक आवेदन के बाद आपको मर्ज विवादों को हल करने की आवश्यकता हो सकती है।

इसके अलावा, आप कभी apply बजाय git stash pop उपयोग करने के लिए, ध्यान दें कि [email protected]{3}[email protected]{2} बन जाएगा के बाद से पहले एक बंद पॉप था तय है।

+0

दो stashes बड़े हैं शुरू की है और ओवरलैपिंग काम है, जिसके कारण मैं करता से बचना चाहता था का एक बहुत होते हैं। क्या उन्हें सिर्फ काम करने वाले पेड़ में गठबंधन करना संभव है, या क्या मुझे इन बड़े हिस्सों को करने के लिए मजबूर होना पड़ता है और फिर 2 क्रैपी काम करता है और उन्हें विम में ~ 10 अच्छे कामों में विभाजित करता है? – sscirrus

+0

दूसरी बात यह है: _ मैं यह सब कोड_ नहीं करना चाहता हूं। इसके महत्वपूर्ण भाग अभी भी विकास के लिए हैं। – sscirrus

+7

काम करने वाले पेड़ में संयोजन और संशोधन के बीच क्या अंतर है? या दूसरे छेड़छाड़ के बाद 'गीट रीसेट HEAD ^' कर रहा है? आप एक गंदे काम करने वाले पेड़ पर एक छिद्र लागू नहीं कर सकते हैं, इसलिए आपको * आवेदन करने से पहले * प्रतिबद्ध होना चाहिए, लेकिन इसका मतलब यह नहीं है कि आप लागू होने के बाद उस प्रतिबद्धता को पूर्ववत नहीं कर सकते हैं। –

2

मुझे एक ही समस्या थी और इसे इस तरह हल किया गया।

स्टैश में से किसी एक को लागू करने के लिए git stash pop का उपयोग करें। फिर git diff -p > ../stash.diff के साथ इस छिद्र का एक पैच बनाएं। फिर आप अपने काम करने वाले पेड़ को रीसेट कर सकते हैं (या फिर परिवर्तनों को छीन सकते हैं), और git stash pop [email protected]{1} के साथ अन्य स्टैश पॉप कर सकते हैं। यदि आप इस समय अपने पैच को लागू करते हैं तो आप दो अलग-अलग स्टैश को 'विलय' कर सकते हैं।

आपको शायद हल करने के लिए कुछ संघर्ष होंगे। यदि सब कुछ ठीक हो जाता है तो आप स्टैश किए गए परिवर्तनों को छोड़ सकते हैं।

+0

या बस एक भिन्नता के रूप में @ {1} को खींचें और स्थानीय रूप से लागू करें (उदाहरण के लिए सरराइड का उत्तर और टिप्पणियां) लेकिन यह भी काम करता है, धन्यवाद! – rogerdpack

9

एक बेहतर तरीका केवल git stash show -p [email protected]{whatever} > stash-{whatever}.diff का उपयोग करना है और फिर प्रत्येक के लिए git apply का उपयोग करना है।

+0

यदि परिवर्तन ओवरलैप नहीं होते हैं तो यह अब तक का सबसे सरल है। मैं सामग्री को मर्ज करने के लिए काम करने के लिए मूर्खतापूर्ण महसूस करता हूं। –

+1

@ मार्सेलोडिनीज़: यदि सामग्री बदलती है तो हमेशा एक प्रतिबद्धता होनी चाहिए। बिल्कुल मूर्ख नहीं है। – siride

+0

पैच के रूप में एक स्टैश को लागू करना काम करेगा यदि स्टैश काफी मामूली है लेकिन अगर इंटरमीडिएट, गैर-तुच्छ व्हाइटसाइट्स परिवर्तन या फ़ाइल पथ में परिवर्तन – Kirby

74

यह थोड़ा शामिल है, लेकिन यह लगभग हमेशा काम करता है:

  1. पहले गुप्त कोष

    $ git stash pop 
    
  2. अस्थायी रूप से पॉप पहले गुप्त कोष

    $ git add . && git commit -am 'WIP' 
    
  3. से परिवर्तन हो दूसरी छड़ी पॉप

    $ git stash pop 
    
  4. पूर्ववत करें अस्थायी प्रतिबद्ध, परिवर्तन रखने यह

    $ git reset --soft HEAD^ 
    
+4

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

+0

'गिट diff' में एकीकृत परिवर्तन देखने के लिए अपनी फ़ाइल को रीसेट करना न भूलें, क्योंकि वर्तमान में रीसेट किए गए परिवर्तन का मंचन किया गया है और अलग से देखा 'गिट diff --staged'। – Nakilon

+0

यह सबसे अच्छा समाधान जैसा प्रतीत होता है, लेकिन मुझे अभी भी समझ में नहीं आ रहा है कि हम अवांछित परिवर्तनों के दौरान मौजूदा स्टैश को क्यों नहीं हटा सकते हैं। उदाहरण के लिए, 'गिट स्टैश पॉप' के बाद 'गिट स्टैश पॉप' को चलाने के लिए अच्छा लगेगा। शायद मैं गिट स्टैश आंतरिक के बारे में कुछ याद कर रहा हूँ। – modulitos