2009-09-10 12 views
74

इस परिदृश्य लें:जीआईटी का उपयोग करके, मैं किसी अन्य 'कांटा' से परिवर्तनों को चुनिंदा रूप से खींच/विलय कैसे कर सकता हूं?

  1. मैं 'कांटा' के लिए github.com पर एक codebase निर्णय लेते हैं, और मेरी दिनचर्या शुरू कर: संपादित करें - कमिट - पुश; उर्फ हैक हैक हैक।
  2. कुछ बदलाव करने के बाद, मुझे लगता है कि एक ही प्रोजेक्ट पर एक और व्यक्ति ने कुछ बदलाव किए हैं, और मुझे उन्हें पसंद है!
  3. मुझे लगता है कि मैं उन्हें अपने साथ विलय करना चाहता हूं। समस्या यह है कि, मैं केवल एक विशेष प्रतिबद्धता का 'भाग' चाहता हूं, जो उसने किया है।

इन चुनिंदा परिवर्तनों को प्राप्त करने का सबसे प्रभावी तरीका क्या होगा, मेरे 'कांटा' में विलय हो गया?

उत्तर

112

आईआरसी दुनिया की लहरों trolling के बाद, किसी के लिए एक महान समाधान दिया!

संपादित करें: ठीक है, शायद यह इतना आसान नहीं है। यहाँ पूर्ण कदम हैं:

  1. सबसे पहले आप अपने भंडार में रहना होगा, अपने कार्यशील निर्देशिका को पाने के लिए आईएनजी आवश्यक cd है।

  2. अब आपको दूरस्थ शाखा जोड़ने की आवश्यकता है, और फिर इसे प्राप्त करें। ऐसा करते हैं: इस तरह के git log someUser/master रूप

    git remote add someUser git://github.com/someUser/someRepo.git

    git fetch someUser

  3. अब आप चला सकते हैं आदेशों SHA1 प्रतिबद्ध आप 'आंशिक रूप से' में मर्ज करना चाहते हैं खोजने के लिए।

  4. एक बार जब आप SHA है, तो आप अब चला सकते हैं:

    git cherry-pick -n SHA1

    जहां SHA1 प्रतिबद्ध SHA, ओह है!

  5. वहाँ बहुत संभव है निर्भर करता है कितनी पुरानी है प्रतिबद्ध है, और कितनी बार परियोजना परिवर्तन की उस विशेष क्षेत्र, संघर्ष किया जाएगा। क्षमा करें, लेकिन आपको इन्हें अपने भरोसेमंद संपादक के साथ मैन्युअल रूप से हल करना होगा। तो विम, या जो कुछ भी आप का उपयोग बाहर खींच, और जब तक आप मंच है जहाँ आप परिवर्तन पसंद करने के लिए मिल संघर्ष में दूर हैक।

  6. अब आप सिर संशोधन के सूचकांक पुनर्स्थापित करने के लिए है, तो आप तो भरोसेमंद GIT add --patch आदेश का उपयोग कर सकते हैं लेने और चुनें आप क्या परिवर्तन चाहते है:

    git reset HEAD

    git add --patch या git add -p

  7. हाँ! समय कमिट:

    git commit -m "I merged a select amount of changes"

  8. गड़बड़ (सामान आप git add --patch में करने के लिए कहा नहीं) और केवल अपने काम भंडार में चुने गए परिवर्तनों को रखने को साफ करने के लिए, चलाएँ:

    git reset --hard HEAD

    स्पष्ट रूप से git checkout -f एक और विकल्प भी है।

+0

मुझे खुशी है कि आपको 'git add -p' मिला है; यह बेहद शक्तिशाली है। यदि आपके पास पहले से ही प्रश्न में प्रतिबद्धता है (उदाहरण के लिए चेरी-पिक पर '- नो-प्रतिबद्ध' का उपयोग नहीं किया गया है, या यह आपके कामों में से एक है), तो आप सूचकांक को रिवाइंड करने के लिए 'गीट रीसेट HEAD ^' का उपयोग कर सकते हैं पीछे, फिर चरणों में काम करते हुए 'git add -p' के साथ परिवर्तनों को वापस जोड़ें। यदि प्रतिबद्धता शाखा टिप पर नहीं है, तो आप 'गिट रिबेस -आई' का उपयोग कर सकते हैं और प्रश्न में प्रतिबद्धता को संपादित करना चुन सकते हैं। – Cascabel

+0

इसके लिए बहुत बहुत धन्यवाद! –

+1

अच्छा चलना-माध्यम। याद रखें कि अगर आप सिर्फ ** पूरे ** प्रतिबद्ध चाहते हैं, तो आप केवल चरण 4 में '-n' उत्सर्जित करें। इस तरह:' गिट चेरी-पिक SHA1' – Hulvej

1

यदि आप केवल एक प्रतिबद्धता के बंदरगाह चाहते हैं, तो संभवतः आप चेरी द्वारा चुने गए प्रतिबद्धताओं को चुन सकते हैं और उन फ़ाइलों को रीसेट कर सकते हैं जिन्हें आप स्पर्श नहीं करना चाहते हैं।

git cherry-pick SHA1 
git checkout HEAD file1 file2 ... fileN 
बेशक

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

+2

क्या चेकआउट आवश्यक है? क्या चेरी पिक कमांड आपके कामकाजी निर्देशिका में परिवर्तन नहीं करता है? –

2

मैं जो चाहता हूं उस पर स्पष्ट नहीं हूं। यदि आप अन्य फोर्क्स से केवल कुछ ही काम करना चाहते हैं, तो आप git cherry-pick SHA का उपयोग कर सकते हैं। gitready पर पूर्ण स्पष्टीकरण।

git cherry-pick SHA1 --no-commit 
git add --patch 

उम्मीद है कि है कि एक ही सवाल के साथ किसी और को मदद करता है:

+0

मैं केवल एक 'अंश'/'अनुभाग'/'एक विशेष प्रतिबद्धता की कुछ पंक्तियों' के बाद हूं, जो मेरे भंडार में विलय हो गया है। विशेष रूप से फ़ाइल विशिष्ट नहीं है। – Tim

+0

उस स्थिति में, गिट प्रारूप-पैच SHA, गिट लागू एक विकल्प है – hgmnz

2

मुझे वास्तव में टिम का समाधान पसंद है, हालांकि कभी-कभी मुझे विमडिफ में टिंकरिंग पसंद है। इस समस्या का मेरा समाधान कच्चा है, लेकिन यह मेरे लिए काम करता है क्योंकि मुझे विम पसंद है।

मैं vimdiff मेरी difftool के रूप में स्थापित किया है, और फिर चुनिंदा विलय करने के लिए मैं शाखा फर्क:

git difftool <branch> <file> 

तब मैं वर्तमान शाखा के संस्करण के साथ फलक के पास जाकर इस isn vim में मूल संपादित (कभी कभी 'आवश्यक टी, लेकिन कभी कभी vimdiff में/tmp एक संस्करण खुलता है) और केवल पढ़ने के लिए को निष्क्रिय मोड:

:e <file> 
:set readonly! 

अब मैं इस तरह के do और dp रूप vim के पैच उपकरणों का उपयोग लागू करने के लिए जो मैं चाहता सकते हैं, और अन्य छोटे बनाने जैसे ही मैं जाता हूं। जब मैं कर रहा हूं, तो मैं फ़ाइल को सहेजता हूं, विम से बाहर निकलता हूं, और फिर मंच को नियमित संपादन की तरह गिट में फ़ाइल करता हूं।

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

vimdiff example http://j.mp/1dZVllt

+0

मुझे नहीं लगता कि यह उत्तर पूरी तरह से एक स्वतंत्र पूर्ण उत्तर होने के योग्य के रूप में योग्यता प्राप्त करता है। उपयोगी जानकारी, लेकिन विशेष रूप से प्रासंगिक नहीं है। (यह उत्तर के शीर्ष पर क्यों है?) –

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

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