git - गिट में एक फ़ाइल की कामकाजी प्रति संशोधनों को पूर्ववत करें?




file version-control (8)

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

हालांकि, मैं केवल उस फ़ाइल की कामकाजी प्रतिलिपि को पूर्ववत करना चाहता हूं, इसके साथ कुछ भी नहीं।

मैं उसको कैसे करू?


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

git checkout -- file

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

आप फ़ाइल का एक विशेष संस्करण भी देख सकते हैं:

git checkout v1.2.3 -- file         # tag v1.2.3
git checkout stable -- file         # stable branch
git checkout origin/master -- file  # upstream master
git checkout HEAD -- file           # the version from the most recent commit
git checkout HEAD^ -- file          # the version before the most recent commit

महज प्रयोग करें

git checkout filename

यह मौजूदा शाखा से नवीनतम संस्करण के साथ फ़ाइल नाम को प्रतिस्थापित करेगा।

चेतावनी: आपके परिवर्तनों को त्याग दिया जाएगा - कोई बैकअप नहीं रखा गया है।


मैं SHA आईडी का उपयोग करके अपनी फ़ाइलों को पुनर्स्थापित करता हूं, मैं क्या करता हूं git checkout <sha hash id> <file name>


मैं हमेशा इसके साथ भ्रमित हो जाता हूं, इसलिए यहां एक अनुस्मारक परीक्षण मामला है; आइए bash लें कि हमारे पास git का परीक्षण करने के लिए यह bash स्क्रिप्ट है:

set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email [email protected]
echo 1 > a.txt
echo 1 > b.txt
git add *
git commit -m "initial commit"
echo 2 >> b.txt
git add b.txt
git commit -m "second commit"
echo 3 >> b.txt

इस बिंदु पर, कैश में परिवर्तन नहीं किया गया है, इसलिए git status है:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

यदि इस बिंदु से, हम git checkout , नतीजा यह है:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

यदि इसके बजाय हम git reset , तो परिणाम यह है:

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

तो, इस मामले में - यदि परिवर्तन चरणबद्ध नहीं होते हैं, तो git reset कोई फर्क नहीं पड़ता है, जबकि git checkout परिवर्तनों को ओवरराइट करता है।

अब, git add b.txt कि उपरोक्त स्क्रिप्ट से अंतिम परिवर्तन चरणबद्ध / कैश किया गया है, यह कहना है कि हमने अंत में git add b.txt को भी git add b.txt

इस मामले में, इस बिंदु पर git status है:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   b.txt

यदि इस बिंदु से, हम git checkout , नतीजा यह है:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

यदि इसके बजाय हम git reset , तो परिणाम यह है:

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

इसलिए, इस मामले में - यदि परिवर्तन चरणबद्ध होते हैं, तो git reset मूल रूप से अस्थिर परिवर्तनों में चरणबद्ध परिवर्तन करेगा - जबकि git checkout पूरी तरह से परिवर्तनों को ओवरराइट करेगा।


यदि आपकी फ़ाइल पहले ही चरणबद्ध है (तब होता है जब फ़ाइल संपादित होने के बाद आप गिट एड आदि करते हैं) आपके परिवर्तनों को अस्थिर करने के लिए।

उपयोग

git reset HEAD <file>

फिर

git checkout <file>

यदि पहले से ही चरणबद्ध नहीं है, तो बस उपयोग करें

git checkout <file>

यदि आपने अभी तक अपनी प्रतिबद्धता को धक्का नहीं दिया है या अन्यथा साझा नहीं किया है:

git diff --stat HEAD^...HEAD | \
fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ --
git commit -a --amend

यह उत्तर स्थानीय परिवर्तनों को पूर्ववत करने के लिए आवश्यक कमांड के लिए है जो एकाधिक या एकाधिक फ़ोल्डर्स (या निर्देशिका) में एकाधिक विशिष्ट फ़ाइलों में हैं। यह उत्तर विशेष रूप से ऐसे प्रश्नों को संबोधित करते हैं जहां उपयोगकर्ता के पास एक से अधिक फ़ाइल होती है लेकिन उपयोगकर्ता सभी स्थानीय परिवर्तनों को पूर्ववत नहीं करना चाहता:

यदि आपके पास एक या अधिक फाइलें हैं, तो आप उन फ़ाइलों में से प्रत्येक को सैम कमांड ( git checkout -- file ) लागू कर सकते हैं, जिसमें से प्रत्येक स्थान को अंतरिक्ष द्वारा अलग किया गया है:

git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext

नाम 1 / name2 / fileOne.ext nameA / subFolder / fileTwo.ext के बीच स्पेस अबाउट को ध्यान में रखें

एक ही फ़ोल्डर में एकाधिक फ़ाइलों के लिए:

यदि आपको किसी निश्चित निर्देशिका में सभी फ़ाइलों के लिए परिवर्तनों को त्यागने की आवश्यकता होती है, तो निम्नानुसार गिट चेकआउट का उपयोग करें:

git checkout -- name1/name2/*

उपरोक्त में तारांकन नाम 1 / name2 के तहत उस स्थान पर सभी फ़ाइलों को पूर्ववत करने की चाल करता है।

और, समान रूप से निम्नलिखित एकाधिक फ़ोल्डरों के लिए सभी फ़ाइलों में परिवर्तन पूर्ववत कर सकते हैं:

git checkout -- name1/name2/* nameA/subFolder/*

फिर उपरोक्त में नाम 1 / name2 / * nameA / subFolder / * के बीच की जगह को ध्यान में रखें।

नोट: name1, name2, nameA, subFolder - इन सभी उदाहरण फ़ोल्डर नाम फ़ोल्डर या पैकेज को इंगित करते हैं जहां प्रश्न में फ़ाइल मौजूद हो सकती है।


मैंने गिट बैश के माध्यम से किया है:

(use "git checkout -- <file>..." to discard changes in working directory)

  1. गिट स्थिति [इसलिए हमने एक फ़ाइल वैड संशोधित देखा है।]
  2. गिट चेकआउट - index.html [मैं index.html फ़ाइल में बदल गया है:
  3. गिट स्थिति [अब उन परिवर्तनों को हटा दिया गया था]







undo