Git में फ़ाइल में चयनात्मक रूप से परिवर्तन या चेकआउट किया जाता है?


88

क्या कोई कमांड है जो आपको कार्य निर्देशिका में फ़ाइल (या फ़ाइलों) में परिवर्तन को आंशिक रूप से पूर्ववत करने की अनुमति देता है?

माना कि आपने एक फ़ाइल को बहुत संपादित किया है, लेकिन आपको एहसास है कि आप कुछ बदलावों को प्रतिबद्ध अवस्था में वापस करना चाहते हैं, लेकिन अन्य परिवर्तनों को नहीं।

मैं इसके लिए एक विकल्प की कल्पना कर रहा हूं git checkoutजो बहुत काम करता है git add -p, यानी यह हंक द्वारा फ़ाइल हंक के माध्यम से जाता है और पूछता है कि आप इसे रखना चाहते हैं या नहीं।

जवाबों:


85

आप उपयोग कर सकते हैं

git add -p <path>

आप एक विशेष फ़ाइल में रखना चाहते हैं कि विखंडू मंच करने के लिए, फिर

git checkout -- <path>

फ़ाइल के चरणबद्ध संस्करण की जाँच करके, जो आप रखना नहीं चाहते थे, कार्यशील परिवर्तनों को छोड़ना।

अंत में, आप उपयोग कर सकते हैं

git reset -- <path>

फ़ाइल के सबसे हाल ही में प्रतिबद्ध संस्करण में फ़ाइल के मंचित संस्करण को वापस लाने के लिए आपको अपने परिवर्तनों को बिना रुके छोड़ देना चाहिए।


इस सरल उपयोग के मामले के लिए, जो हर दूसरे संस्करण नियंत्रण प्रणाली को सिर्फ "रिवर्ट" कहता है, Git कमांड इतना अस्पष्ट क्यों है?
जान हेटिच

5
@Jan क्या अन्य संस्करण नियंत्रण प्रणाली की revertकमांड आपको यह चुनने की अनुमति देती है कि किसी फ़ाइल के भीतर कौन से परिवर्तन वापस किए गए हैं? वास्तव में पूछ रहा हूं, क्योंकि मेरे पास केवल सीवीएस और गिट के साथ अनुभव है। Git में, git checkout -- path/to/fileएक एकल कमांड है जो उस फ़ाइल के सभी परिवर्तनों को बदल देता है, लेकिन यह ऊपर के समान नहीं है।
मचिअकिग

3
वहाँ भी है git checkout --patchऔर git reset --patchजो git add --patchनवीनतम गिट में काम करते हैं ।
मैट कोनोली

2
@ रुडी, --आमतौर पर विकल्पों को समाप्त करने का संकेत देते हैं, और यह कि इसके बाद आने वाले किसी भी तर्क की शाब्दिक व्याख्या की जानी है। इसका मतलब यह है कि यदि आप ./फ़ाइल नाम के बाद आते हैं, तो आपको किसी भी फ़ाइलनाम से पहले जोड़ना नहीं होगा, जो कि ऋण चिह्न के साथ शुरू होता है --
१२:१२ बजे zrajm

जब मैं का उपयोग git checkout --patchकरता है पीछे की ओर प्रकट होता है। माइनस सिंबल मेरी वर्किंग कॉपी को टेक्स्ट एड कर रहे हैं और प्लस सिंबल मेरी वर्किंग कॉपी से रिमूव लाइन हैं।
फेलिप अल्वारेज़

115

जीआईटी संस्करण के साथ> = 1.7.1 मैं कर सकता हूं

git checkout -p

मुझे यकीन नहीं है कि जब यह फीचर पेश किया गया था।


11
यह ध्यान देने योग्य है कि आप git reset -pस्टेजिंग क्षेत्र / इंडेक्स से चुनिंदा अस्थिर परिवर्तनों के लिए भी कर सकते हैं । मुझे यह भी पता नहीं है कि मेरे सिर के ऊपर से गिट के किस संस्करण में यह पेश किया गया था।

यह सही उत्तर है, इसे क्यों स्वीकार नहीं किया गया।
वुकॉन्ग

1
@wukong क्योंकि यह जवाब सवाल के 2 साल बाद पोस्ट किया गया है। इस क्षण (2009) में, चार्ल्स का जवाब सबसे अच्छा समाधान था
pomeh

8

git checkout $fileफ़ाइल की स्थिति $fileको अंतिम प्रतिबद्ध स्थिति में बदल देता है। मुझे लगता है कि आप git checkout SHA-1 -- $fileSHA-1 द्वारा पहचान की गई फ़ाइल को वापस करने के लिए उपयोग कर सकते हैं ।


1
हाँ, बिल्कुल नहीं जो मैं चाहता हूं, क्योंकि मैं फ़ाइल में किए गए कुछ बदलावों को रखना चाहता हूं और दूसरों को वापस करना चाहता हूं
1800 जानकारी

1

आपको वापस जाने और चुनने के लिए कितने कमिट की आवश्यकता है? यदि यह सिर्फ एक है, तो शायद इसके ठीक पहले एक शाखा लें, आपके द्वारा की गई फ़ाइल की जांच करें और फिर git add -pइसे जोड़ने का उपयोग करें कि आप इसे कैसे चाहते हैं। फिर आप वापस उस स्थान पर जा सकते हैं जहाँ आप थे और अपनी अस्थायी शाखा से फ़ाइल की जाँच करें।

अर्थात्:

git checkout -b temp troublesome-commit^
git checkout troublesome-commit -- path/to/file
git add -p path/to/file
git commit -c troublesome-commit
git checkout @{-1}
git checkout temp -- path/to/file
git commit path/to/file
git branch -D temp

अन्य विकल्पों में कमिट करना और कमिट को एडिट करना git rebase -i(कमिट को मार्क करना edit, फिर ए करना git reset HEAD^और फिर से शेल में वापस आने पर कम करना)।

यदि आपको जिन परिवर्तनों का चयन करने की आवश्यकता है, वे कमिट की एक श्रृंखला में फैले हुए हैं, तो उन्हें पैच (या उन सभी को कवर करने वाला पैच) के रूप में निकालना बेहतर हो सकता है और पैच को हाथ से संपादित कर सकते हैं, उन परिवर्तनों को निकाल सकते हैं जिन्हें आप रखना चाहते हैं, और अवशिष्ट को खिलाना git apply --reverse


मैं वास्तव में कुछ भी करने के लिए प्रतिबद्ध नहीं हूं, मैं उन बदलावों को पूर्ववत करना चाहता हूं जो केवल मेरे काम की नकल में हैं
1800 सूचना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.