2010-10-06 15 views
13

यह अक्सर मेरे काम प्रवाह में होता है: मैं एक अलग शाखा में एक सुविधा पर काम कर रहा हूं, और ऐसा करने के दौरान मैं छोटी चीजों में आऊंगा जिन्हें फिक्सिंग की आवश्यकता है, लेकिन उदाहरण के लिए ढांचे या साइट लेआउट में ऊपर से हैं।Commit किसी अन्य शाखा में परिवर्तन का चयन करें और फिर वर्तमान शाखा पर काम फिर से शुरू करें?

मैं मुख्य पर बदलने में शाखा को विकसित करने और वहाँ का चयन करें फाइलों से परिवर्तन हो, तो एक सुविधा शाखा के लिए वापस जाओ, और इसलिए rebase है कि मैं से बाहर असंबंधित तोड़ मरोड़/bugfixes के साथ वहां जारी रख सकते हैं चाहता हूँ रास्ता।

मैं ऐसा करने के लिए git stash और git stash pop का उपयोग कर रहा हूं, लेकिन मुझे संशोधित फ़ाइलों के समूह से बहुत सारे संघर्ष मिल रहे हैं लेकिन किसी भी तरह से मूल शाखा में प्रतिबद्ध होने की आवश्यकता नहीं है।

क्या विवादों से बचने या किसी भी तरह से वर्तमान स्थिति को बचाने के लिए कोई और तरीका है, और केवल काम करने के लिए किसी अन्य शाखा में काम करने वाले पेड़ परिवर्तनों को चुनने का कोई दूसरा तरीका है? (गिट-स्टैश-चेरी-पिक की तरह ;-))

उत्तर

14
  1. परिवर्तन है कि आप अपने वर्तमान शाखा पर master में चाहते प्रतिबद्ध: Git प्रलेखन एक अच्छा उदाहरण है।
  2. अपने बचे हुए परिवर्तनों
  3. master शाखा में स्विच करें और git cherry-pick का उपयोग अपने पंख शाखा को पीठ पर master
  4. ले जाएँ परिवर्तन ले जाने के लिए, और rebase (वैकल्पिक)
  5. Unstash मूल विशेषता में परिवर्तन
छिपाने की जगह
+0

मैंने एक साधारण परीक्षण चलाया और यह वास्तव में समस्या को हल करता है। मैं उलझन में था कि रीबेज करते समय गिट चेरी द्वारा उठाए गए प्रतिबद्ध को कैसे पहचान लेगा। यह फीचर शाखा पर इसे HEAD से सही ढंग से हटा देता है, और इसे सुविधा के नीचे ले जाता है। यही वही है जो मुझे चाहिए था। चूंकि प्रतिबद्धता sha बदल गई है, मैं केवल अनुमान लगा सकता हूं कि मास्टर को लागू करने के बाद (और इस प्रकार चेरी द्वारा उठाया गया), गिट देखता है कि फीचर शाखा पर हेड प्रतिबद्धता पहले ही हो चुकी है, और इसे दूसरी बार लागू नहीं करती है? –

+1

धन्यवाद कहने के लिए बस एक अपडेट, यह बहुत अच्छा काम करता है। चेरी-पिक के साथ एक बार मेरा संघर्ष हुआ। चूंकि मैंने इसे संघर्ष को हल करने के लिए संपादित किया है, इसलिए गिट ने "फीचर" शाखा के सिर के संबंधित प्रतिबद्धता को रिबेस के बाद हटा दिया नहीं है।लेकिन मैं इसे आसानी से 'गिट रीसेट - हार्ड हेड ~ 1' के साथ हटा सकता हूं। यह मुख्य शाखा में सुविधा का एक रैखिक इतिहास रखता है, और फीचर शाखा; उत्तरार्द्ध हमेशा के लिए एक तेजी से आगे के रूप में। महान। –

+1

उत्कृष्ट। बस मेरे जैसे उन लोगों के लिए जिन्हें चरण 4 में रीबेज भाग देखना था: 'गिट रीबेस मास्टर' –

0

अस्थायी शाखा बनाने के बारे में क्या?

कुछ की तरह:

- oh crap need to do somethning else now 
- git checkout -b ResumeLater 
- git add . 
- git commit 
- git checkout ImportantStuff 
- .... 
- git checkout ResumeLater 
+0

हाय, मुझे नहीं लगता कि यह काम करेगा। मेरी समस्या यह है कि मैंने "files.c" में एक एपीआई कॉल में एक बग को बेहतर या हल किया है, जबकि "फीचर" में नई सुविधा पर काम करते हुए एपीआई ट्विक जरूरी है। मेरे पास अब मेरी शाखा में 20 संशोधित फाइलें हैं, लेकिन मैं केवल फाइलों को "विकसित" शाखा में वापस लाने के लिए चाहता हूं। अगर मैं छेड़छाड़ करता हूं और पॉप करता हूं, तो मुझे सभी संशोधित फ़ाइलों से संघर्ष का एक गुच्छा मिलता है। आदर्श रूप में, मुझे "गिट स्टैश पॉप " की आवश्यकता है, इसलिए मैं केवल उस फ़ाइल के लिए परिवर्तन कर सकता हूं जो मैं अपने आधार "विकास" शाखा पर करना चाहता हूं। –

+0

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

2

मैं आमतौर पर यह दूसरी तरह के आसपास है। मैं अपनी फीचर शाखा में काम करना जारी रखता हूं जब तक कि मैं वहां प्रतिबद्ध नहीं हूं। जैसे ही मैं हूं, मैं सभी परिवर्तनों को जोड़ता हूं जो शाखा के लिए नई प्रतिबद्धता में हैं, लेकिन मास्टर में शामिल नहीं हैं। git add -p et.al इसे वास्तव में आसान बनाते हैं। एक बार इंडेक्स में सभी प्रासंगिक परिवर्तन, मैं शाखा में प्रतिबद्ध हूं। शेष बचे हुए गंदे परिवर्तन मास्टर के हैं और जब मैं उस पर स्विच करता हूं तो ठीक उसी तरह ले जाया जाएगा ताकि मैं इसे वहां कर सकूं।

+0

यह एक दिलचस्प कामकाज है। शाखा स्विच करते समय आपको त्रुटियां नहीं मिलतीं क्योंकि यह तब सूचकांक में है? –

+0

मुझे उल्लेख करना चाहिए था कि मुझे रीबेस विधि पसंद है क्योंकि जब भी मैं एक शाखा विलय करता हूं, मुझे पता है कि कोई संघर्ष नहीं होगा (सुविधा शाखा हमेशा मुख्य के शीर्ष पर है, यानी "फास्ट फॉरवर्ड")। यही कारण है कि मैं मुख्य शाखा में चयनित परिवर्तन करना चाहता हूं, फिर फीचर शाखा को रीबेस करना चाहता हूं। मुझे लगता है कि यह टाइप करने से मुझे एहसास हुआ कि यह पहले बदलावों को कम किए बिना नहीं होगा। यह बस मैं आसानी से ऐसा करने के लिए असामान्य काम के साथ * गिट चेकआउट * करने में सक्षम था; लेकिन हाल ही में मुझे बहुत सारी त्रुटियां मिल रही हैं और गिट मुझे किसी अन्य शाखा में चेकआउट करने की इजाजत नहीं देगी, और मैं इसके पीछे पैटर्न नहीं देख सकता। –

+0

यदि आपको गंदे परिवर्तन आपके द्वारा स्विच की जा रही शाखा पर लागू नहीं होते हैं तो आपको त्रुटियां मिलेंगी। लेकिन उस घटना की संभावना पतली लगती है। यदि आप केवल उस फीचर शाखा के लिए काम कर रहे हैं, या यदि यह अधिक सामान्य चीजों को ठीक करता है तो कोई आम तौर पर एक अंतर खंड से बता सकता है। यदि आपके पास अब शाखा से संबंधित कोई परिवर्तन नहीं है, तो चीजें आमतौर पर ठीक होने लगती हैं। यह ज्यादातर चीजों के लिए एक अच्छा पर्याप्त समाधान प्रतीत होता है, विशेष रूप से यह मानते हुए कि फीचर शाखाएं अल्पकालिक रहती हैं और अक्सर मास्टर पर छूट होती हैं, इसलिए सुविधाओं के दायरे के बाहर मोड़ आमतौर पर न्यूनतम – rafl

1

MacOS पर, GitX, यह बहुत चयनात्मक करने rafl का वर्णन करता है की तरह करने के लिए आसान हो जाता है इतना है कि यह वातावरण में लिप्त हों दृष्टिकोण अगर है कि एक अच्छा तरीका है।

यह भी प्रतिबद्ध करने के लिए संभव/व्यावहारिक है शाखा-वाई परिवर्तन और मास्टर-वाई अलग-अलग कामों में परिवर्तन करते हैं, फिर शाखा से कामों को निर्यात करने के लिए git format-patch का उपयोग करें और git am उन्हें मास्टर में खींचने के लिए।

यहां खतरे यह है कि यदि परिवर्तनों के आसपास की फाइलें बहुत अलग हैं, तो इस मामले में मास्टर में काम करने के दौरान संघर्ष हो सकते हैं।

+2

'गिट-गुई', जो कि गिट का हिस्सा होता है, एक जीयूआई में और क्रॉस-प्लेटफॉर्म फैशन में कार्यक्षमता भी प्रदान करता है। एक शाखा से दूसरे में काम करने के लिए 'प्रारूप-पैच' और 'am' का उपयोग करना बहुत अजीब लगता है। यह 'गिट चेरी-पिक' के लिए है। – rafl

+0

सभी अच्छे अंक, विस्तार के लिए धन्यवाद। – pjmorse

+0

गीटएक्स भयानक है, हर समय इसका इस्तेमाल करें। यह सच है कि यह बहुत चुनिंदा काम करने में मदद करता है। –

2

--merge विकल्प का उपयोग कर master शाखा पर वापस स्विच करने का प्रयास करें। यह दो शाखाओं के बीच एक तीन तरह का विलय करने की कोशिश करेगा।

2. After working in the wrong branch, switching to the correct 
    branch would be done using: 

     $ git checkout mytopic 

    However, your "wrong" branch and correct "mytopic" branch 
    may differ in files that you have modified locally, in which 
    case the above checkout would fail like this: 

     $ git checkout mytopic 
     error: You have local changes to 'frotz'; not switching branches. 

    You can give the -m flag to the command, which would try a 
    three-way merge: 

     $ git checkout -m mytopic 
     Auto-merging frotz 

    After this three-way merge, the local modifications are not 
    registered in your index file, so git diff would show you what 
    changes you made since the tip of the new branch. 
+0

हाँ मैं इसका उपयोग करने और गंदे विलय के साथ समाप्त होने के बारे में थोड़ा चिंतित था। लेकिन आपका पिछला उत्तर बहुत अच्छा काम करता है और उसे "गंदे" काम करने वाले पेड़ के साथ चेकआउट की आवश्यकता नहीं होती है। लॉजिकल ऑर्डर में, जब आपने उन्हें अभी किया था, तो मास्टर शाखा से संबंधित छोटे बदलाव करने में सक्षम होना भी बहुत अच्छा है। –

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