गिट में अस्थिर परिवर्तन का हिस्सा


158

मैं अपने अस्थिर परिवर्तनों के कुछ हिस्सों को पूर्ववत कैसे कर सकता हूं लेकिन बाकी को अस्थिर बनाए रखता हूं? जिस तरह से मुझे पता चला है:

git commit --interactive
# Choose the parts I want to delete
# Commit the changes
git stash
git rebase -i master # (I am an ancestor of master)
# Delete the line of the most recent commit
git stash apply

यह काम करता है, लेकिन यह अच्छा होगा अगर git commit --interactiveकेवल बदलावों को वापस करने के लिए कुछ ऐसा हो । कोई बेहतर तरीके?

जवाबों:


264

आप उपयोग कर सकते हैं git checkout -p, जो आपको अपने काम की प्रतिलिपि और सूचकांक के बीच के अंतर से अलग-अलग हॉक चुनने की अनुमति देता है। इसी तरह, git add -pआप इंडेक्स में जोड़ने के लिए लोअर चुनने की git reset -pअनुमति देता है , और इंडेक्स और हेड के बीच के अंतर से इंडेक्स को वापस बाहर करने के लिए आपको व्यक्तिगत हॉक चुनने की अनुमति देता है।

$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .

यदि आप इन परिवर्तनों को संरक्षित करने से पहले अपने गिट रिपॉजिटरी को पहले से ही स्नैपचैट करना चाहते हैं, तो मुझे यह करना पसंद है:

$ git stash; git stash apply

यदि आप अक्सर इसका उपयोग करते हैं, तो आप इसे अलग करना चाह सकते हैं:

[alias]
    checkpoint = !git stash; git stash apply

यदि आप एक अच्छा संपादक मोड या प्लगइन का उपयोग करते हैं, तो व्यक्तिगत हॉक या रेखाओं को बदलना और भी आसान हो सकता है, जो -pकभी-कभी उपयोग करने के लिए थोड़ा अनाड़ी हो सकता है , जैसा कि सीधे उल्टा करने के लिए लाइनों का चयन करने के लिए समर्थन प्रदान कर सकता है। मैं Magit , एक Emacs मोड का उपयोग करता हूं जो Git के साथ काम करने के लिए बहुत सहायक है। मैगिट में, आप चला सकते हैं magit-status, उन परिवर्तनों के लिए भिन्नता खोजें जिन्हें आप वापस करना चाहते हैं, उन पंक्तियों का चयन करें जिन्हें आप वापस करना चाहते हैं (या बस कर्सर को उन पंक्तियों पर रखें जिन्हें आप वापस करना चाहते हैं यदि आप एक बार के बजाय एक हंक वापस करना चाहते हैं एक समय में एक लाइन), और kउन विशिष्ट लाइनों को वापस करने के लिए दबाएं । यदि आप Emacs का उपयोग करते हैं तो मैं मैगिट की अत्यधिक अनुशंसा करता हूं।


मुझे लगता है कि यह उस समाधान के बारे में है जैसा कि मैं मूल रूप से समाधान के साथ आया था, लेकिन मुझे लगता है कि मेरे मूल समाधान में 30 दिनों के लिए हटाए गए लाइनों को बचाने का लाभ है क्योंकि वे प्रतिबद्ध हैं। मुझे लगता है कि शायद यह एक शेल स्क्रिप्ट के चारों ओर लिखा है अच्छा होगा, यद्यपि।
asmeurer

1
क्षमा करें, मुझे अभी पता चला है कि git checkoutएक -pध्वज भी है , जो ठीक वही है जो आप एक ही आदेश में पूछ रहे थे। चरणों के पिछले जटिल सेट के लिए माफी; आप बस उपयोग कर सकते हैं git checkout -p। जहां तक ​​सामान की बचत होती है, संभावित रूप से विनाशकारी कुछ करने से पहले मैं अक्सर एक पेड़ को चालू करने के लिए रिकॉर्ड करने के लिए एक git stash; git stash apply( git checkpointया कुछ ऐसा करता है जो ऐसा करता है ) या कर सकते हैं ताकि कुछ गलत हो जाए तो मैं इसे वापस पा सकूं।
ब्रायन कैंपबेल

वहां तुम जाओ, यही उपाय है! जहां तक ​​उपनाम है, मैं सोच रहा हूं कि कुछ git commit -a -m "Backup Commit" --edit; git reset HEAD^ बेहतर होगा, क्योंकि तब यह मेरी स्थिति को गंदा नहीं करेगा, जिसका मैं कुछ और उपयोग कर सकता हूं। फिर, जब तक आपके पास SHA1 है तब तक आप इसे अगले 30 दिनों के भीतर चेरी-पिक कर सकते हैं। Theeded आपको SHA1 को बाद में खोजने के लिए आपकी सहायता करने के लिए प्रतिबद्ध संदेश में जानकारी जोड़ने देता है। दूसरी ओर, यह गिट रिफ्लग को गंदा कर देगा, इसलिए मुझे लगता है कि यह एक ट्रेडऑफ है जो आप करते हैं उसके आधार पर।
asmeurer

चेकपॉइंट उर्फ ​​मेरे लिए काम नहीं करता है: केवल पहला कमांड निष्पादित होता है, दूसरा नहीं। यह दुखद है, क्योंकि मुझे यह पसंद आया होगा। मैं git संस्करण 1.7.10.4 का उपयोग कर रहा हूं।
फेबियन

क्या git checkout -pपैच को इंडेक्स पर लागू नहीं करने का एक तरीका है लेकिन उन्हें केवल स्टेज करना है?
गेरिमिया

28
git diff > patchfile

फिर पैचफ़ाइल को संपादित करें और उन हिस्सों को हटा दें जिन्हें आप पूर्ववत नहीं करना चाहते हैं, फिर:

patch -R < patchfile

6
हालांकि, यह जवाब इसकी सादगी और आसानी से उपयोग में विशेष रूप से सराहनीय है। +1
थोली

उत्पन्न patchfileविम में बहुत अच्छा लग रहा है और यह वास्तव में मदद करता है!
Bily

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

1
ध्यान दें कि आप git apply -Rइसके बजाय का उपयोग कर सकते हैं patch(सिर्फ गिट के दायरे में रहने के लिए, या इसके विपरीत घटना जो patchउपलब्ध नहीं है)
user1556435

patch: **** malformed patch at line 41: @@ -428,9 +443,9 @@ you should place your code here."
हैप्पीफेस

5

तुम यह कर सकते थे

git checkout master -- path/to/file

प्रत्येक फ़ाइल के लिए जिसे आप रीसेट करना चाहते हैं।


या यदि एक शाखा पर काम कर रहे हों तो मास्टर के स्थान पर हेड का उपयोग करें। जैसा कि यह 'गिट स्टेटस' रिपोर्ट (कम से कम हाल के संस्करणों में) कहती है।
जोनाथन लेफ़लर 14

1

कैसा रहेगा

  1. सूचकांक से परिवर्तन के साथ प्रभावित फ़ाइलों को वापस करें
  2. का उपयोग git add -pकेवल अपने इच्छित परिवर्तन वापस जोड़ने के लिए सूचकांक करने के लिए।

1

जब मैं 'git स्टेटस' चलाता हूं, तो यह कहता है:

$ git status
# On branch fr/fr.002
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   makefile
#
no changes added to commit (use "git add" and/or "git commit -a")
$

इसलिए, अनस्टेटेड संपादन को रद्द करने के लिए, यह मुझे चलाने के लिए कहता है:

git checkout -- makefile

3
मुझे लगता है कि वह इस बारे में सोच रहा था कि एक बार में एक पूरी फ़ाइल नहीं बल्कि अलग-अलग हॉक कैसे वापस करें। यह निश्चित रूप से, समाधान है यदि आपको बस किसी फ़ाइल में सभी परिवर्तनों को पूर्ववत करने की आवश्यकता है।
ब्रायन कैंपबेल

युप - मुझे संदेह है कि आप सही हैं। जैसा कि आपने कहा था 'git checkout -p' और 'git add -p' विकल्प होने की संभावना है।
जोनाथन लेफ्लर

1

ब्रायन कैंपबेल का जवाब मेरे गिट को दुर्घटनाग्रस्त करता है, संस्करण 1.9.2.msysgit.0, अज्ञात कारणों से, इसलिए मेरा दृष्टिकोण स्टेज हंक के लिए है जो मैं रखना चाहता हूं, काम की नकल में परिवर्तन को त्यागना, फिर अस्थिर करना।

$ git add -p
   ... select the hunks to keep
$ git checkout -- .
$ git reset HEAD .

1
भी है git stash -p। आप कर सकते थे git stash -p; git reset --hard; git stash pop। यह प्रभावी रूप से वही है जो आप कर रहे हैं सिवाय इसके कि आपको एक प्रतिबद्ध संदेश लिखना नहीं है।
asmeurer

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

0

आप कर सकते हैं git checkoutऔर इसे उन भागों के नाम दे सकते हैं जिन्हें आप पूर्ववत करना चाहते हैं।

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