आंशिक रूप से चेरी-गिट के साथ कमिट करना


501

मैं 2 अलग-अलग शाखाओं पर काम कर रहा हूं: रिलीज और विकास

मैंने देखा कि मुझे अभी भी कुछ बदलावों को एकीकृत करने की आवश्यकता है जो विकास शाखा में रिलीज शाखा के लिए प्रतिबद्ध थे ।

समस्या यह है कि मुझे कमिटमेंट की जरूरत नहीं है, केवल कुछ फाइलों में कुछ अड़चनें हैं, इसलिए एक सरल

git cherry-pick bc66559

चाल नहीं करता है।

जब मैं ए

git show bc66559

मैं अंतर देख सकता हूं लेकिन वास्तव में मेरे वर्तमान कार्यशील पेड़ पर आंशिक रूप से आवेदन करने का एक अच्छा तरीका नहीं जानता।

जवाबों:


792

मुख्य बात जो आप यहाँ चाहते हैं, वह है git add -p( -pएक पर्यायवाची शब्द --patch)। यह सामग्री में जांच करने के लिए एक इंटरैक्टिव तरीका प्रदान करता है, जिससे आपको यह तय करने में मदद मिलती है कि प्रत्येक हंक को अंदर जाना चाहिए, और यहां तक ​​कि आवश्यक होने पर आपको मैन्युअल रूप से पैच को संपादित करने की अनुमति देता है।

चेरी-पिक के संयोजन में इसका उपयोग करने के लिए:

git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset                   # unstage the changes from the cherry-picked commit
git add -p                  # make all your choices (add the changes you do want)
git commit                  # make the commit!

(मुझे याद दिलाने के लिए टिम हेनिगन को धन्यवाद कि git-cherry-pick में एक andno-प्रतिबद्ध विकल्प है, और फेलिक्स राबे के लिए धन्यवाद कि आपको रीसेट करने की आवश्यकता है! यदि आप केवल कुछ चीजों को कमिट से बाहर छोड़ना चाहते हैं! , आप git reset <path>...बस उन फ़ाइलों को अस्थिर करने के लिए उपयोग कर सकते हैं ।)

add -pयदि आवश्यक हो तो आप निश्चित रूप से विशिष्ट पथ प्रदान कर सकते हैं । यदि आप एक पैच के साथ शुरू कर रहे हैं आप के cherry-pickसाथ बदल सकता है apply


यदि आप वास्तव में एक चाहते हैं git cherry-pick -p <commit>(वह विकल्प मौजूद नहीं है), तो आप उपयोग कर सकते हैं

git checkout -p <commit>

यह आपके द्वारा निर्दिष्ट किए गए वचन के विरुद्ध वर्तमान प्रतिबद्धता को अलग करेगा, और आपको व्यक्तिगत रूप से उस भिन्न से भिन्न लागू करने की अनुमति देगा। यह विकल्प अधिक उपयोगी हो सकता है यदि आप जिस कमेटी में खींच रहे हैं वह उस कमिट में उस हिस्से में विलय कर रही है जिसमें आप दिलचस्पी नहीं ले रहे हैं (ध्यान दें, हालांकि, इससे checkoutभिन्न है cherry-pick: पूरी तरह से सामग्री checkoutलागू करने की कोशिश करता है , भिन्नता लागू करता है । यह माता-पिता से निर्दिष्ट प्रतिबद्ध है। इसका मतलब है कि यह केवल उस कमिट से अधिक लागू हो सकता है, जो आप चाहते हैं कि तुलना में अधिक हो सकता है।)<commit>cherry-pickcheckout


दरअसल, अगर मैं git 1.7.5.4 के साथ सलाह का पालन करता हूं, तो 'git add -p' 'no changes' कहता है क्योंकि यह सब पहले से ही इंडेक्स में है। मुझे 'git add' से पहले 'git reset HEAD' करने की आवश्यकता है - किसी भी विकल्प के साथ उस रीसेट से बचने का कोई तरीका?
फेलिक्स राबे

@FelixRabe: मैं वास्तव में आश्चर्यचकित हूं कि कुछ बिंदुओं नेcherry-pick -n स्पष्ट रूप से परिवर्तनों का मंचन नहीं छोड़ा - सम्मेलन निश्चित रूप से यह है कि --no-commitविकल्प प्रतिबद्ध होने से ठीक पहले बंद हो जाते हैं, अर्थात सभी परिवर्तनों के साथ। मैं उत्तर में रीसेट जोड़ दूंगा।
Cascabel

1
@ बेलिक्स वह है, जो यदि अन्य शाखा पर है, लेकिन आपकी वर्तमान शाखा ABCDEF नहीं है , git checkout -p <F>तो आपको केवल F से परिवर्तन नहीं मिलता है, यह आपको ABCDEF मिल जाता है, जो आपको एक साथ मिलाता है और आपको यह बताता है कि आप इसका कौन सा भाग चाहते हैं । पार करना कि एफ से केवल कुछ बदलावों के लिए नीचे एक दर्द है। दूसरी ओर, git cherry-pick -n <F>आपको केवल एफ से परिवर्तन मिलते हैं - और यदि उनमें से कुछ संघर्ष में परिवर्तन करते हैं, तो यह मददगार रूप से आपको बताता है ताकि आप समझ सकें कि कैसे ठीक से विलय किया जा सकता है।
कास्केबेल

जब परिवर्तन एक फ़ाइल जोड़ रहा था तो मुझे इसके साथ समस्या थी। git resetमंचन फ़ाइलों को हटा जाएगा और add -pसिर्फ कह सकते हैं कि 'जोड़ने के लिए कुछ भी नहीं है'।
इयान ग्रिंजर

72

मुझे पता है कि मैं एक पुराने प्रश्न का उत्तर दे रहा हूं, लेकिन ऐसा लगता है कि ऐसा करने का एक नया तरीका यह है कि अंतःक्रियात्मक रूप से बाहर की जाँच करें:

git checkout -p bc66559

क्रेडिट क्या मैं अंतःक्रियात्मक रूप से दूसरे गिट कमिट से हॉक उठा सकता हूं?


36

आप जो परिवर्तन चाहते हैं, उसे आप जिस शाखा से बदलना चाहते हैं, उसके मुखिया मान लें, गिट चेकआउट का उपयोग करें

एक फ़ाइल के लिए:

git checkout branch_that_has_the_changes_you_want path/to/file.rb

कई फ़ाइलों के लिए बस डेज़ी श्रृंखला:

git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb

5
वह संपूर्ण फ़ाइल की प्रतिलिपि बनाता है: न केवल परिवर्तन।
जेरेमी सूची

1
यह उत्तर, यहाँ अभी तक किसी भी अन्य उत्तर के रूप में, एक बड़ी खामी है: यह आपके नाम के तहत करने के बजाय, परिवर्तन के मूल लेखक को संरक्षित नहीं करता है। यदि कोई परिवर्तन अच्छा है, तो आप किसी का क्रेडिट चुरा रहे हैं, यदि कोई परिवर्तन बुरा है, तो आप खुद को आग लगा रहे हैं। ऐसा लगता है कि git चेरी-पिक -p होने के आसपास कोई रास्ता नहीं है, और शर्म की बात है कि यह अभी भी वहां नहीं है।
pfalcon

15

माइक Monkiewicz उत्तर पर बिल्डिंग आप आपूर्ति की गई sha1 / ब्रांच से चेकआउट करने के लिए एक या अधिक फाइलें भी निर्दिष्ट कर सकते हैं।

git checkout -p bc66559 -- path/to/file.java 

यह आपको उन परिवर्तनों को अंतःक्रियात्मक रूप से चुनने की अनुमति देगा जो आपने फ़ाइल के अपने वर्तमान संस्करण में लागू किए हैं।


5
यह समस्याग्रस्त है यदि फ़ाइल का वर्तमान संस्करण उस संस्करण से काफी अलग है। आपको कई अप्रासंगिक परिवर्तनों (जो प्रतिबद्ध में प्रकट नहीं होते हैं) के साथ संकेत दिया जाएगा। इसके अलावा, आप जो परिवर्तन वास्तव में चाहते हैं, वह "प्रच्छन्न रूप" में वर्तमान के अंतर के रूप में प्रकट हो सकता है, मूल अंतर के रूप में नहीं। यह संभव है कि मूल अंतर जिसे आप संघर्ष चाहते हैं, और ठीक से विलय करना है; आपके पास यहां वह अवसर नहीं होगा।
कज़

1

यदि आप कमांड लाइन पर फ़ाइलों की एक सूची निर्दिष्ट करना चाहते हैं, और एक परमाणु आदेश में पूरी बात प्राप्त करें, तो प्रयास करें:

git apply --3way <(git show -- list-of-files)

--3way: यदि एक पैच सफाई से लागू नहीं होता है, तो गिट एक मर्ज संघर्ष पैदा करेगा ताकि आप चला सकें git mergetool। Omitting --3wayGit को पैच पर छोड़ देगा, जो सफाई से लागू नहीं होता है।


0

यदि "आंशिक रूप से चेरी पिकिंग" का अर्थ है "फ़ाइलों के भीतर, कुछ परिवर्तन चुनना लेकिन दूसरों को त्यागना", तो इसे लाकर किया जा सकता है git stash:

  1. पूरी चेरी उठाओ।
  2. git reset HEAD^ पूरे चेरी-उठाया प्रतिबद्ध को अस्थिर कार्य परिवर्तनों में परिवर्तित करने के लिए।
  3. अब git stash save --patch: अंतःक्रियात्मक रूप से अवांछित सामग्री का चयन करें।
  4. आपके काम करने की कॉपी से किए गए परिवर्तनों को Git रोल बैक करता है।
  5. git commit
  6. अनचाहे बदलावों का दंश दूर फेंकें git stash drop:।

युक्ति: यदि आप अवांछित परिवर्तनों को एक नाम देते हैं: git stash save --patch junkतो यदि आप अभी (6) करना भूल जाते हैं, तो बाद में आप यह पहचान लेंगे कि यह क्या है।


यदि आप सिर्फ चेरी-पिक करते हैं, तो रीसेट करें ... आप कुछ भी नहीं करेंगे। जैसा कि ऊपर कहा गया है, आपको या तो एक चेरी-पिक -नो-कमिट के साथ करना होगा, या एक रीसेट - हेड हेड ~। ध्यान दें कि आप नकारात्मक तरीके से प्रक्रिया कर रहे हैं (जो आप नहीं चाहते हैं उसका चयन करें)। उपरोक्त स्वीकृत समाधान या तो सकारात्मक या नकारात्मक दृष्टिकोण की अनुमति देता है।
पियरे-ओलिवियर वेरेस

0

git format-patchजिस कमेटी की आप परवाह करते हैं उसका हिस्सा बाहर निकालने के git amलिए और दूसरी शाखा में लगाने के लिए उपयोग करें

git format-patch <sha> -- path/to/file
git checkout other-branch
git am *.patch
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.