चेरी केवल एक फ़ाइल के लिए केवल परिवर्तन कैसे लेती है, पूरी प्रतिबद्धता नहीं


108

मुझे एक शाखा से दूसरी शाखा में शुरू किए गए परिवर्तनों को लागू करने की आवश्यकता है। मैं ऐसा करने के लिए चेरी पिक का उपयोग कर सकता हूं। हालांकि, मेरे मामले में मैं उन परिवर्तनों को लागू करना चाहता हूं जो केवल एक फ़ाइल के लिए प्रासंगिक हैं, मुझे पूरी प्रतिबद्धता को चेरी करने की आवश्यकता नहीं है। उसको कैसे करे?


जवाबों:


137

आप जो हासिल करना चाहते हैं, उसके आधार पर आपके पास अलग-अलग विकल्प हैं:

यदि आप चाहते हैं कि फ़ाइल की सामग्री लक्ष्य शाखा पर समान हो, तो आप उपयोग कर सकते हैं git checkout <branch> -- <filename>। हालाँकि यह उन परिवर्तनों को "चेरी-पिक" नहीं करेगा जो एक ही प्रतिबद्ध में हुए थे, लेकिन केवल उक्त फ़ाइल की परिणामी स्थिति को ही लें। इसलिए यदि आपने कमिट में एक लाइन जोड़ी है, लेकिन पिछले कमिट अधिक बदल गए हैं, और आप केवल उन अन्य परिवर्तनों के बिना उस लाइन को जोड़ना चाहते हैं, तो एक चेकआउट वह नहीं है जो आप चाहते हैं।

अन्यथा यदि आप केवल एक ही फ़ाइल के लिए कमिट में पेश किए गए पैच को लागू करना चाहते हैं, तो आपके पास कई विकल्प हैं। आप git cherry-pick -nइसे चला सकते हैं , यानी इसे कमिट किए बिना, कमिट एडिट कर सकते हैं (उदाहरण के लिए सभी फाइलों को रीसेट करें git reset -- .और केवल उस फाइल को जोड़ें, जिसे आप वास्तव में इस्तेमाल करके बदलना चाहते हैं git add <filename>)। या आप फ़ाइल के लिए अंतर बना सकते हैं और फिर अंतर लागू कर सकते हैं:

git diff <branch>^..<branch> -- <filename> | git apply

22

एक बनाएँ patch fileऔर इसे लागू करें।

git diff branchname -- filename > patchfile
git apply patchfile

संपादित करें:

चूँकि आपको कमिटमेंट से बदलाव करने की आवश्यकता है, इस तरह पैच बनाएँ:

git show sha1 -- filename > patchfile

1
git diff sha1(या git diff branch- यह वैसा ही है यदि शाखा उसी हैश की ओर इशारा करती है) केवल उस हैश के संबंध में वर्तमान कामकाजी निर्देशिका का एक अलग उत्पादन करेगी, लेकिन यह नहीं कि अपने दम पर शुरू की गई एक प्रतिबद्धताओं में क्या बदलाव होता है।
प्रहार

सही बात। उत्तर संपादित किया। धन्यवाद।
सालेश

1
-1 git checkoutएक फ़ाइल नाम के साथ इस नाखून के लिए सही हथौड़ा है। ये दोनों विकल्प अनावश्यक रूप से जटिल हैं।
रीन हेनरिच

7
इस विशेष मामले के लिए, हाँ। लेकिन सामान्य तौर पर, यदि आप किसी विशेष फ़ाइल में किए गए कमिट से परिवर्तन करना चाहते हैं, तो checkoutकाम नहीं करेगा, क्योंकि इसमें अन्य अवांछित पिछले बदलाव शामिल हो सकते हैं, और वर्तमान शाखा में किए गए परिवर्तन शामिल नहीं हो सकते हैं।
सैलेश

11

एक और काम करने के लिए स्थानीय स्तर पर पैच मिलता है और फिर उपयोग होता है:

git checkout {<name_of_branch>, commit's SHA} <path to the file> 

हालांकि यह चेरी-पिकिंग नहीं है।


2
चेतावनी: जैसा कि @poke अपने जवाब में कहता है, यह बदलावों की नकल नहीं करता है; यह फ़ाइल की संपूर्ण स्थिति की प्रतिलिपि बनाता है। इसलिए यदि आप फाइल में कमिटमेंट में बदलाव करना चाहते हैं , तो इस तरह से चेक करके आप किसी भी नए बदलाव को ओवरराइट कर देते हैं जो अच्छा नहीं है।
अलेक्जेंडर बर्ड

7

Git के पास सब कुछ तैयार है :)

महज प्रयोग करें git checkout <sha> <path-to-file>


4
यह चेरी-पिक नहीं है - जो पूरी तरह से फ़ाइल की जांच करती है। लक्ष्य एक प्रतिबद्ध से एक विशेष परिवर्तन करना है। अक्सर वे एक ही चीज होते हैं, लेकिन कभी-कभी वे नहीं होते हैं।
एंड्रयूएफ

6
git checkout the_branch_with_the_change the/path/to/the/file/you/want.extension

यह तब काम करता है जब आप चाहते हैं कि दूसरी ब्रांच से एक भी फाइल मौजूदा वर्किंग ब्रांच में कॉपी की जाए


1
सावधान रहें, फ़ाइल में किए गए परिवर्तन जो दूसरी शाखा से संस्करण में नहीं हैं, खो जाएंगे।
पैट्रिक श्लुटर

उससे सहमत थे। यह उपयोगी है अगर आपको फ़ाइल की एक प्रति चाहिए और आप इसे वर्तमान शाखा में बदलना चाहते हैं
इस्माइल इकबाल

1
ग्लब्स (पथ / *) का उपयोग कर सकते हैं और एक से अधिक पथ / फ़ाइल निर्दिष्ट कर सकते हैं
टोड

1

यह आप क्या देख रहे हैं:

git checkout target-branch sha1 path/to/file

sha1 वैकल्पिक है


11
नहीं, " कमिट में बदलाव करें" "पूरी फाइल नहीं चुनें"
Abyx

1

मैं क्या करने के लिए उपयोग करने के लिए है git ls-tree

बस करो:

git ls-tree -r <commit-id> |grep 'your filename'
# there will be output that shows a SHA1 of your file
git show ${SHA1 of your file} > 'your filename'

यह आपके grep से मेल खाते सभी फ़ाइलनामों को प्रिंट करेगा और कमिट में फाइलों की SHA1 कुंजी देगा।

Git शो का उपयोग आपकी शाखा के बाहर की फाइलों पर भी किया जा सकता है। >एक फ़ाइल में आउटपुट को पाइप करने के लिए आपके शेल से उपयोग करने से आपको वह परिणाम प्राप्त होता है जिसकी आप तलाश कर रहे हैं।


0

आप ऐसा करने की कोशिश कर सकते हैं:

git show COMMIT_ID -- path/to/specific-file | git apply

उदाहरण के लिए:

git show 3feaf20 -- app/views/home/index.html | git apply

-9
git reset HEAD~1

फ़ाइलों को पूर्व-प्रतिबद्ध चरण में ले जाता है

git stash

स्मृति से निकालता है

अब आपकी शाखा बहुत साफ है (पिछली प्रतिबद्ध पर वापस लौट आई है)

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