जीआईटी का उपयोग करते हुए, मैं चुनिंदा रूप से एक से दूसरे 'कांटे' पर बदलाव को कैसे मर्ज कर सकता हूं?


81

इस परिदृश्य को लें:

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

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



जवाबों:


119

आईआरसी दुनिया की लहरों को ट्रोल करने के बाद, किसी ने एक शानदार समाधान दिया:

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

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

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

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

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

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

    git fetch someUser

  3. अब आप कमांड को चला सकते हैं जैसे कि कम git log someUser/masterSHA1 जिसे आप 'आंशिक रूप से' में मर्ज करना चाहते हैं।

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

    git cherry-pick -n SHA1

    SHA1प्रतिबद्ध SHA, duh कहाँ है!

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

  6. अब आपको सूचकांक को एचईएडी संशोधन के लिए रीसेट करना होगा, फिर आप भरोसेमंद जीआईटी 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एक और विकल्प भी है।


मुझे खुशी है कि तुमने पाया git add -p; यह बहुत शक्तिशाली है। यदि आपके पास पहले से ही प्रश्न है (जैसे --no-commitकि चेरी-पिक पर उपयोग नहीं किया गया है, या यह आपके कमिट में से एक है), तो आप git reset HEAD^इंडेक्स को वापस कमिट करने के लिए उपयोग कर सकते हैं , फिर परिवर्तनों को वापस जोड़ सकते हैं git add -p, चरणों में कमिट कर सकते हैं । यदि ब्रांच टिप पर कमिट नहीं है, तो आप git rebase -iप्रश्न में कमिट को संपादित करने के लिए उपयोग कर सकते हैं और चुन सकते हैं ।
कास्कैबेल

3
अच्छा चल रहा है। याद रखें कि यदि आप पूरी प्रतिबद्धता चाहते हैं, तो आप केवल -nचरण 4 में से बाहर git cherry-pick SHA1
निकलें।

यहाँ कुंजी बिट है git remote add <user> <fork-url>- फिर आप git cherry-pickसामान्य हो सकते हैं ।
टॉम

2

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


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

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

2

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

मेरे पास मेरे विभिन्न प्रकार के रूप में सेट है, और फिर चुनिंदा रूप से विलय करने के लिए मैं शाखा को अलग करता हूं:

git difftool <branch> <file>

फिर मैं वर्तमान शाखा के संस्करण के साथ फलक पर जाता हूं और मूल को vim में संपादित करता हूं (कभी-कभी यह आवश्यक नहीं होता है, लेकिन कभी-कभी vimdiff / tmp में एक संस्करण खोलता है) और रीड-ओनली मोड को अक्षम करें:

:e <file>
:set readonly!

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

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

vimdiff उदाहरण http://j.mp/1dZVllt


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

1

यदि आप केवल कमिटमेंट का पोर्ट चाहते हैं, तो शायद आप चेरी को सबसे बेहतर तरीके से हटा सकते हैं।

git cherry-pick SHA1
git checkout HEAD file1 file2 ... fileN

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


2
क्या यहां चेकआउट जरूरी है? क्या चेरी पिक कमांड आपके कार्य निर्देशिका में परिवर्तन नहीं करता है?
केसी वॉटसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.