सवाल मैं गिट प्रबंधित प्रोजेक्ट में पिछले सभी राज्यों में सभी स्थानीय परिवर्तनों को कैसे वापस कर सकता हूं?


मेरे पास एक परियोजना है जिसमें मैं भाग गया git init। कई काम करने के बाद, मैंने किया git status जिसने मुझे बताया कि सबकुछ अद्यतित था और इसमें कोई स्थानीय बदलाव नहीं था।

तब मैंने लगातार कई बदलाव किए और महसूस किया कि मैं सबकुछ दूर फेंकना चाहता हूं और अपनी मूल स्थिति में वापस आना चाहता हूं। क्या यह आदेश मेरे लिए यह करेगा?

git reset --hard HEAD

1549
2017-07-18 07:52


मूल




जवाब:


यदि आप अपनी कार्यशील प्रतिलिपि में किए गए परिवर्तनों को वापस करना चाहते हैं, तो ऐसा करें:

git checkout .

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

git reset

यदि आप अपने द्वारा किए गए परिवर्तन को वापस करना चाहते हैं, तो ऐसा करें:

git revert <commit 1> <commit 2>

अगर आप अनचाहे फ़ाइलों को हटाना चाहते हैं (उदा।, नई फाइलें, जेनरेट की गई फाइलें):

git clean -f

या अनचाहे निर्देशिका (उदा।, नई या स्वचालित रूप से जेनरेट की गई निर्देशिका):

git clean -fd

2821
2017-07-18 07:57



इतने लंबे समय के बाद fwiw, git checkout path/to/file केवल स्थानीय परिवर्तनों को वापस कर देगा path/to/file - Matijs
नीचे दिए गए उत्तरों पर +1 भी गिट क्लीन-एफ (अनचाहे परिवर्तनों को हटाने के लिए) और -fd (अनचाहे निर्देशिकाओं को हटाने के लिए) का भी उल्लेख करते हैं। - ptdev
और यदि आप अपनी अनचाहे फ़ाइलों को भी साफ करना चाहते हैं, तो इसे पढ़ें stackoverflow.com/questions/61212/... - Surasin Tancharoen
git checkout . तथा git reset [--hard HEAD] काम नहीं किया, मुझे एक करना पड़ा git clean -fd मेरे परिवर्तनों को वापस करने के लिए। - BrainSlugs83
git reset आपके परिवर्तनों को रीसेट नहीं करता है, git reset --hard क्या वो। - Cerin


नोट: आप भी दौड़ना चाहते हैं

git clean -fd

जैसा

git reset --hard

मर्जी नहीं अनचाहे फ़ाइलों को हटाएं, जहां गिट-क्लीन ट्रैक की गई रूट निर्देशिका से किसी भी फाइल को हटा देगा जो गिट ट्रैकिंग के अंतर्गत नहीं है। चेतावनी - इसके साथ सावधान रहें! यह देखने के लिए कि यह क्या हटाएगा, पहले गिट-क्लीन के साथ ड्राई-रन चलाने में मददगार है।

जब आप त्रुटि संदेश प्राप्त करते हैं तो यह भी विशेष रूप से उपयोगी होता है

~"performing this command will cause an un-tracked file to be overwritten"

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

इस स्थिति में, एक सूखी दौड़ करने से आपको उन फ़ाइलों की एक सूची दिखाने में भी मदद मिलेगी जिन्हें ओवरराइट किया जाएगा।


334
2017-07-20 05:37



फ़ाइल क्लीन कमांड "गिट क्लीन-एफ" है। अनचाहे निर्देशिकाओं को "गिट क्लीन-डी" के साथ हटा दिया जाता है - Jonathan Mitchell
गिट क्लीन-एफडी (डीडी के लिए बल आवश्यक है) - electblake
-एन या - ड्राई-रन ड्राई-रन के लिए झंडे हैं। - stephenbez
गिट क्लीन-एफडी अगर आपके गिट रिपोजिटरी में एक और गिट रिपोजिटरी है। डबल एफ के बिना इसे हटाया नहीं जाएगा। - Trismegistos


यदि आप सभी परिवर्तनों को वापस करना चाहते हैं और वर्तमान रिमोट मास्टर के साथ अद्यतित होना चाहते हैं (उदाहरण के लिए आप पाते हैं कि मास्टर हेड आगे बढ़ गया है क्योंकि आपने इसे बंद कर दिया है और आपका पुश 'अस्वीकार कर दिया जा रहा है') आप इसका उपयोग कर सकते हैं

git fetch  # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.

59
2018-04-22 20:48





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

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d

47
2017-07-19 12:16



गिट रिफ्लॉग के लिए विलियम, एक टन धन्यवाद। मैंने अपने पेड़ को पुराने संस्करण में रीसेट कर दिया है और यह सुनिश्चित नहीं किया कि हाल ही में कैसे पुनः प्रयास किया जाए। आपके गिट रीफ्लॉग ने मुझे बचाया। एक बार फिर से धन्यवाद। - palaniraja
मुझे भी बचाया! मेरे मामले में मेरे साथ साहसिक git rebase -i गलत हो गया था (एक संपादन गलती के कारण कुछ काम खत्म हो गया)। इस टिप के लिए धन्यवाद मैं एक अच्छी स्थिति में वापस आ गया हूँ! - paneer_tikka
30 दिनों के डिफ़ॉल्ट से आपका क्या मतलब है! - Mohe TheDreamy
@MheheTheDreamy मेरा मतलब है कि एक समय सीमा है। आखिरकार कचरा कलेक्टर पहुंचने योग्य संदर्भों को हटा देगा जब उनकी उम्र उस सीमा से अधिक हो जाएगी। डिफ़ॉल्ट (और शायद अभी भी) 30 दिनों के लिए इस्तेमाल किया जाता है। तो पुराने संदर्भ उपलब्ध नहीं हो सकते हैं। - William Pursell


पुन: क्लोन

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  •  स्थानीय, गैर-धक्का देता है
  •  आपके द्वारा ट्रैक की गई फ़ाइलों में किए गए परिवर्तनों को वापस लाता है
  •  आपके द्वारा हटाए गए ट्रैक की गई फ़ाइलों को पुनर्स्थापित करता है
  •  सूचीबद्ध फाइलें / डीआईआरएस हटाता है .gitignore (फाइल बनाने की तरह)
  •  उन फ़ाइलों / डीआईआर को हटा देता है जिन्हें ट्रैक नहीं किया जाता है और इन नहीं .gitignore
  •  आप इस दृष्टिकोण को नहीं भूलेंगे
  •  वेस्ट बैंडविड्थ

निम्नलिखित अन्य आदेश हैं जिन्हें मैं रोज भूल जाता हूं।

स्वच्छ और रीसेट करें

git clean -f -d -x
git reset --hard
  •  स्थानीय, गैर-धक्का देने वाला काम नहीं हटाता है
  •  आपके द्वारा ट्रैक की गई फ़ाइलों में किए गए परिवर्तनों को वापस लाता है
  •  आपके द्वारा हटाए गए ट्रैक की गई फ़ाइलों को पुनर्स्थापित करता है
  •  सूचीबद्ध फाइलें / डीआईआरएस हटाता है .gitignore (फाइल बनाने की तरह)
  •  उन फ़ाइलों / डीआईआर को हटा देता है जिन्हें ट्रैक नहीं किया जाता है और इन नहीं .gitignore

स्वच्छ

git clean -f -d -x
  •  स्थानीय, गैर-धक्का देने वाला काम नहीं हटाता है
  •  आपके द्वारा ट्रैक की गई फ़ाइलों में किए गए परिवर्तनों को वापस नहीं लाता है
  •  आपके द्वारा हटाई गई ट्रैक की गई फ़ाइलों को पुनर्स्थापित नहीं करता है
  •  सूचीबद्ध फाइलें / डीआईआरएस हटाता है .gitignore (फाइल बनाने की तरह)
  •  उन फ़ाइलों / डीआईआर को हटा देता है जिन्हें ट्रैक नहीं किया जाता है और इन नहीं .gitignore

रीसेट

git reset --hard
  •  स्थानीय, गैर-धक्का देने वाला काम नहीं हटाता है
  •  आपके द्वारा ट्रैक की गई फ़ाइलों में किए गए परिवर्तनों को वापस लाता है
  •  आपके द्वारा हटाए गए ट्रैक की गई फ़ाइलों को पुनर्स्थापित करता है
  •  सूचीबद्ध फाइलें / डीआईआरएस हटाता है .gitignore (फाइल बनाने की तरह)
  •  उन फ़ाइलों / डीआईआर को हटा नहीं देता है जिन्हें ट्रैक नहीं किया जाता है और इन नहीं .gitignore

टिप्पणियाँ

उपरोक्त सभी की पुष्टि करने के लिए टेस्ट केस (बैश या sh का उपयोग करें):

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'

यह भी देखें

  • git revert पूर्व प्रतिबद्धता पूर्ववत करने के लिए नई प्रतिबद्धताएं बनाने के लिए
  • git checkout पूर्व कार्य करने के लिए समय पर वापस जाने के लिए (पहले आदेशों के ऊपर चलने की आवश्यकता हो सकती है)
  • git stash के समान git reset ऊपर, लेकिन आप इसे पूर्ववत कर सकते हैं

41
2018-03-20 12:37



उपरोक्त उत्तरों से चोरी के लिए खेद है। मैं लगातार इस संदर्भ का उपयोग करता हूं, जो ज्यादातर मेरे लिए पोस्ट करता है। - William Entriken
मुझे पूरा यकीन है कि पहला विकल्प (पुन: क्लोन) वास्तव में "स्थानीय, गैर-धक्का देता है" हटा देता है :) - Marandil
लाल एक्स और हरे रंग की चेकमार्क का क्या अर्थ है? क्या लाल एक्स इसके आगे की वाक्य को अस्वीकार करता है? - styfle
@styfle ऐसा कुछ करता है, ऐसा कुछ नहीं करता है - William Entriken
@FullDecent यह पढ़ने के लिए भ्रमित है। "स्थानीय, गैर-धक्का देता है" को हटा नहीं देता है। इसका मतलब है कि यह हटा नहीं है। डबल नकारात्मक मतलब है कि यह हटा देता है? - styfle


डेंजर अहमद: (कृपया टिप्पणियां पढ़ें। मेरे उत्तर में प्रस्तावित आदेश निष्पादित करने से आप जितना चाहें उतना अधिक हटा सकते हैं)

मुझे चलाने वाली निर्देशिकाओं सहित सभी फ़ाइलों को पूरी तरह से निकालने के लिए

git clean -f -d

34
2017-09-11 07:10



किसी को भी दर्द को बचाने के लिए मैं बस गया: यह भी हटा देगा .gitignore-d फाइलें भी! - landons
क्षमा करें अगर मैंने आपको कोई परेशानी पैदा की। उसके बाद मैंने बस उस फ़ोल्डर में सब कुछ वापस करने और हटाने की कोशिश की। मुझे सटीक परिस्थितियों को याद नहीं है, लेकिन "-d" मेरे लिए काम करने वाली एकमात्र चीज थी। मुझे उम्मीद है कि मैंने आपको बहुत दर्द नहीं किया है :-) - Tobias Gassmann
कोई नुकसान नहीं किया। मेरे पास बैकअप था, लेकिन यह शायद एक अस्वीकरण वारंट;) - landons


उत्तरों का एक गुच्छा पढ़ने और उन्हें आजमाने के बाद, मुझे विभिन्न किनारे के मामलों का पता चला है जिसका मतलब है कि कभी-कभी वे कामकाजी प्रति को पूरी तरह साफ नहीं करते हैं।

ऐसा करने के लिए मेरी वर्तमान बैश स्क्रिप्ट यहां दी गई है, जो हर समय काम करती है।

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD

काम करने की प्रतिलिपि रूट निर्देशिका से चलाएं।


34
2018-06-04 07:25



अंतिम आदेश मुझे देता है error: pathspec 'HEAD' did not match any file(s) known to git. - 0xC0000022L
जब मैंने "-" बाहर निकाला तो यह मेरे लिए काम करता था। git checkout HEAD - Jester
git reset --hard ट्रैक की गई फ़ाइलों को वापस लाता है (चरणबद्ध या नहीं) git clean -f -d अनचाहे फ़ाइलों को हटा देता है, git checkout -- HEAD तब हमें इसकी आवश्यकता क्यों है? - v.shashenko
हमें डबल हाइफ़न की आवश्यकता नहीं है। एक टाइपो होना चाहिए। - Farax


बस कहो

git stash

यह आपके सभी स्थानीय chages को हटा देगा। और आप बाद में इसका उपयोग करके भी उपयोग कर सकते हैं

git stash apply 

29
2018-04-24 12:18



उपयोग git stash pop स्वचालित रूप से आपके लिए सबसे ऊपर दिखाए गए परिवर्तन को हटा देगा - Arrow Cen
git stash drop काम करने की प्रतिलिपि पर लागू किए बिना नवीनतम छेड़छाड़ की स्थिति को हटाने के लिए। - deerchao


मैं एक समान समस्या से मुलाकात की। समाधान का उपयोग करना है git log स्थानीय प्रतिबद्धता का कौन सा संस्करण रिमोट से अलग है यह देखने के लिए। (उदा। संस्करण है 3c74a11530697214cbcc4b7b98bf7a65952a34ec)।

फिर उपयोग करें git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec परिवर्तन को वापस करने के लिए।


26
2017-08-28 07:34