मैं Git में अस्थिर परिवर्तनों को कैसे छोड़ दूं?


4815

मैं अपनी कार्य प्रतिलिपि में उन परिवर्तनों को कैसे छोड़ दूं जो सूचकांक में नहीं हैं?


9
git-cleanकेवल काम कर रहे पेड़ से अनियोजित
Yega

24
ऊपर असनार की टिप्पणी को स्पष्ट करने के लिए, git-clean -dfखतरनाक हो सकता है। यह स्थानीय अनट्रैक की गई फ़ाइलों को हटा देगा (जैसे कि a .ignignore द्वारा कवर) सभी ध्यान से नीचे पढ़ें और गिट चेकआउट पर विचार करें। इसके बजाय
जैक्सनटरबरी

15
'git clean -df' सावधान! मैंने कोशिश की और खोए हुए मुख्य फ़ोल्डर खो दिए गए हैं जो बहाल नहीं हो पा रहे हैं ... आउच!
गाबे करकानिस

46
मारना git statusकैसे करना है पर एक सुझाव देता है! git checkout -- .
पाउलो

4
@Paulo: जुलाई 2019 से शुरू होकर, git statusसुझाव देता है git restore:। git restoreइस उद्देश्य के लिए एक नया आदेश है। देखें मेरी 2019 अद्यतन
प्रोजिटोस

जवाबों:


2684

एक और तेज तरीका है:

git stash save --keep-index --include-untracked

--include-untrackedयदि आपको इसके बारे में पूरी जानकारी नहीं है तो आपको इसमें शामिल होने की आवश्यकता नहीं है।

उसके बाद, git stash dropयदि आप चाहें तो आप उस स्‍टैश को एक कमांड से ड्रॉप कर सकते हैं।


122
और इसके बारे में पूरी तरह से जानना चाहते हैं --include-untracked
TJ क्राउडर

9
@KarimSamir: प्रश्न विशेष रूप से उन परिवर्तनों के बारे में पूछता है जो सूचकांक में नहीं हैं । git resetआदेश भी सूचकांक में परिवर्तनों को हटा देगा।
ग्रेग हेवगिल

146
git checkout -। बहुत तेज़ है
फ्रैंक 16

38
न तो git stash, और न ही किसी भी प्रकार की git checkoutअस्थिरता को हटा देगा। के आउटपुट के अनुसार git status, यहां वास्तविक सही उत्तर कुछ स्वाद हैgit reset HEAD
क्रिस वॉर्थ

127
यह स्टैक स्टैक को प्रदूषित करता है। git checkout -- .केवल एक आदेश के साथ काम करता है।
फेलिप टोनेलो

5333

वर्तमान कार्यशील निर्देशिका में सभी अप्रतिबंधित फ़ाइलों के लिए:

git checkout -- .

एक विशिष्ट फ़ाइल उपयोग के लिए:

git checkout -- path/to/file/to/revert

--यहाँ तर्क अस्पष्टता को दूर करने के लिए ।


117
यह गिट कैनोनिकल तरीका लगता है। यदि आप टाइप करते हैं तो वास्तव में आपको क्या करना हैgit status
ABMagil

27
अगर वहाँ फाइलें नहीं हैं तो काम नहीं करता है। गिट कहते हैं error: The following untracked working tree files would be overwritten by checkout: ...
माइकल आइल

92
नौसिखिया सवाल, क्या "चेक चेकआउट -" शब्दार्थ से?
19:

120
@ निंजैक का git checkout -- .मतलब वही है git checkout ., सिवाय इसके कि आप इस तथ्य के बारे में स्पष्ट हों कि आप शाखा के नाम को निर्दिष्ट नहीं कर रहे हैं। वे दोनों कहते हैं कि मैं वर्तमान में जिस शाखा पर हूं उसके लिए HEAD संस्करण की जाँच करें। ' या './'। यदि आप git checkout branch-name directory-or-file-nameसामान्य रूप से करते हैं, तो आपको directory-or-file-nameशाखा का हेड संस्करण प्राप्त होता है branch-name
अंकिल

23
IMO यह वैरिएंट अपूर्ण है, क्योंकि यह उस स्थिति को नहीं संभालता है जब आपकी बदली हुई रिपॉजिटरी सफाई परिवर्तन के क्षण में HEAD संशोधन पर नहीं है और आप इसे HEAD में अपडेट नहीं करना चाहते हैं, और केवल परिवर्तनों को साफ़ करना चाहते हैं।
एलेक्सियॉट

1897

ऐसा लगता है कि पूर्ण समाधान है:

git clean -df
git checkout -- .

git cleanसभी अनट्रैक की गई फ़ाइलों को हटा देता है ( चेतावनी : जबकि यह सीधे .गितिग्नोर में बताई गई अनदेखी की गई फ़ाइलों को नहींgit checkout हटाएगा , यह फ़ोल्डरों में रहने वाली उपेक्षित फाइलों को हटा सकती है ) और सभी अनचाहे परिवर्तनों को हटा देती है।


116
अन्य दो उत्तर वास्तव में काम नहीं करते हैं, यह एक ने किया।
जॉन हंट

18
@dval यह पहला कमांड है जो अनइन्डेक्स की गई फाइलों को हटाता है और दूसरे को अनस्टेज्ड बदलावों (इंडेक्स फाइल्स के) को हटाता है। इसलिए यदि आपके पास कोई भी परिवर्तन नहीं हुआ है तो यह अंतिम प्रतिबद्धता के अनुसार होने के समान हैgit reset --hard
अमानुएल नेगा

3
उपयोग -dff अगर अनट्रैकड डायरेक्टरी एक git क्लोन है।
अक्युया

87
साफ-सुथरे चलने के लिए सावधानी बरतें। यदि आप यह नहीं समझते हैं कि यह क्या करता है, तो आप उन फ़ाइलों को हटा सकते हैं जिन्हें आप रखना चाहते हैं, जैसे robots.txt, अपलोड की गई फ़ाइलें, आदि
ctlockey

40
जैसा कि @ctlockey ने कहा, पहली कमांड डायरेक्ट्रीज को भी डिलीट कर देती है अगर वे केवल अनदेखा फाइलों से बने होते हैं ... मेरे प्रोजेक्ट पर कॉन्फ़िगरेशन फ़ाइलों का एक पूरा गुच्छा खो गया :( सावधान रहें।
मैक्सिम लोरेंट

326

यह वर्तमान निर्देशिका के लिए वर्तमान सूचकांक की जाँच करता है, वर्तमान निर्देशिका से फ़ाइलों में सभी परिवर्तनों को नीचे की ओर फेंक देता है।

git checkout .

या यह जो सूचकांक से सभी फाइलों की जाँच करता है, कार्यशील ट्री फ़ाइलों को अधिलेखित करता है।

git checkout-index -a -f

28
हाय, के बीच अंतर क्या है git checkout .और git checkout -- .?
इवान हू

5
@ इवान: इस मामले में कोई अंतर नहीं है।
रॉबर्ट सिएमर

10
@ रॉबर्ट सेमर और सामान्य मामले में?
RJFalconer

2
@ इवान: यह सवाल पूछने के लिए खराब जगह। - यह ओपी के प्रश्न से संबंधित नहीं है, और यहां उत्तर से असंबंधित है।
रॉबर्ट सिएमर

14
+1 यह सही उत्तर है, क्योंकि यह उस मामले को सही ढंग से संभालता है जहां कुछ फाइलों में मंचन और अन-मंचित दोनों परिवर्तन होते हैं। ध्यान दें कि यह समाधान अस्थिर परिवर्तनों को अस्वीकार करता है; यदि आप उन्हें बनाए रखना चाहते हैं, तो आपको @ greg-hewgill के उत्तर का उपयोग करना चाहिए git stash save --keep-index
रयूबबार

248
git clean -df

वर्त्तमान निर्देशिका से शुरू होकर संस्करण नियंत्रण में न आने वाली फ़ाइलों को पुन: हटाकर काम करने वाले पेड़ को साफ करता है।

-d: अनट्रैक की गई फ़ाइलों के अलावा अनट्रेक्टेड डायरेक्ट्रीज को हटा दें

-f: बल ( clean.requireForceसेटिंग के आधार पर आवश्यक नहीं हो सकता है )

git help cleanमैनुअल देखने के लिए चलाएँ


इस जवाब में सभी वोट क्यों नहीं हैं? 2011 में वापस जवाब दिया और अभी भी सही है।
यूजीन ब्रैगनेट्स

106

मेरी पसंदीदा है

git checkout -p

यह आपको चुनिंदा रूप से चांस को वापस करने की सुविधा देता है।

यह सभी देखें:

git add -p

9
मुझे त्यागने से पहले वास्तविक बदलाव को देखने की क्षमता पसंद है।
पेंघे गेंग

यही है वह जो मेरे द्वारा उपयोग किया जाता है। git चेकआउट -p और फिर "a" सभी स्वीकार करने के लिए।
मैटिस

2
मैंने कभी सोचा नहीं है। यह -pसुरक्षा की एक अच्छी अतिरिक्त परत जोड़ता है। इसे git clean -dवास्तव में ओपी का जवाब देने के लिए मिलाएं ।
Stephan Henningsen

96

चूंकि कोई भी उत्तर सटीक विकल्प संयोजन का सुझाव नहीं देता है जो मैं उपयोग करता हूं, यहां यह है:

git clean -dfx
git checkout .

उपयोग किए गए git cleanविकल्पों के लिए यह ऑनलाइन सहायता पाठ है :

-d

अनट्रैक की गई फ़ाइलों के अलावा अनट्रैकड डाइरेक्टरीज़ को हटा दें। अगर एक अनट्रैकड डायरेक्टरी को एक अलग Git रिपॉजिटरी द्वारा प्रबंधित किया जाता है, तो इसे डिफ़ॉल्ट रूप से हटाया नहीं जाता है। -fयदि आप वास्तव में ऐसी निर्देशिका को हटाना चाहते हैं तो दो बार विकल्प का उपयोग करें ।

-f

Git विन्यास चर हैं clean.requireForceपर सेट नहीं है false, Git स्वच्छ जब तक दिए गए फाइल या निर्देशिका नष्ट करने के लिए मना कर देगा -f, -nया -i.gitजब तक दूसरा नहीं -fदिया जाता तब तक Git उपनिर्देशिका या फ़ाइल के भीतर निर्देशिका हटाने से इंकार कर देगा ।

-x

.gitignore(प्रति निर्देशिका) और से अनदेखा नियमों का उपयोग न करें $GIT_DIR/info/exclude, लेकिन फिर भी -eविकल्पों के साथ दिए गए उपेक्षा नियमों का उपयोग करें। यह बिल्ड उत्पादों सहित सभी अनट्रैक फ़ाइलों को हटाने की अनुमति देता है। यह git resetएक साफ निर्माण का परीक्षण करने के लिए एक प्राचीन काम कर निर्देशिका बनाने के लिए (संभवतः के साथ संयोजन के रूप में ) इस्तेमाल किया जा सकता है ।

साथ git checkout .ही रेपो की जड़ में करने की जरूरत है।


इस समाधान के लिए +1। आपकी टिप्पणी के बारे में कि "गिट चेकआउट। रेपो की जड़ में किए जाने की आवश्यकता है", शायद आप उल्लेख कर सकते हैं कि हम git reset --hardइसके बजाय बस कर सकते हैं ? (जो वास्तव में समतुल्य है git reset --hard HEADऔर जो भी वर्तमान निर्देशिका है, उस पर काम करना चाहिए ...)
ErikMD

2
पहले कमांड के बारे में git clean -dfx, यहां एक टिप दी गई है जिसे मैं चलाने git clean -d -x -nसे पहले सुरक्षित पक्ष पर उपयोग करता हूं: बस पहले चलाएं , फ़ाइलों की सूची को हटाने के लिए, फिर रनिंग द्वारा ऑपरेशन की पुष्टि करें git clean -d -x -f(मैंने तर्क दिया -n, -f
प्रतिक्रिया

5
त्वरित ध्यान दें कि यह अपरिवर्तनीय है, और यदि आपके पास फ़ाइलें हैं तो आप .gitignoreउन्हें खो देंगे। तो इससे पहले अपने प्रोजेक्ट का बैकअप लेने पर विचार करें।
रोब

69

यदि आप केवल मौजूदा फ़ाइलों में परिवर्तन को दूर करना चाहते हैं , तो उपयोग करें checkout( यहां प्रलेखित )।

git checkout -- .
  • कोई शाखा निर्दिष्ट नहीं है, इसलिए यह वर्तमान शाखा की जांच करती है।
  • डबल-हाइफ़न ( --) गिट को बताता है कि इसके दूसरे तर्क (पथ) के रूप में क्या लिया जाना चाहिए, कि आपने एक शाखा के विनिर्देश को छोड़ दिया है।
  • अवधि ( .) सभी रास्तों को इंगित करती है।

यदि आप अपनी अंतिम प्रतिबद्ध के बाद से जोड़ी गई फ़ाइलों को निकालना चाहते हैं, तो clean( यहां प्रलेखित ) का उपयोग करें :

git clean -i 
  • -iविकल्प शुरू की एक इंटरैक्टिव clean, गलत विलोपन को रोकने के लिए।
  • कुछ अन्य विकल्प त्वरित निष्पादन के लिए उपलब्ध हैं; प्रलेखन देखें।

यदि आप बाद में उपयोग करने के लिए होल्डिंग स्पेस में परिवर्तन करना चाहते हैं , तो यहांstash ( दस्तावेज में देखें ):

git stash
  • सभी परिवर्तनों को Git के Stash में स्थानांतरित कर दिया जाएगा, संभव बाद की पहुंच के लिए।
  • मुट्ठी भर विकल्प अधिक सूक्ष्मता से टकराते हुए उपलब्ध हैं; प्रलेखन देखें।

यह आपके परिवर्तनों को बिल्कुल बदल देगा और पिछली प्रतिबद्ध से नई जोड़ी गई फ़ाइलों को छोड़ देगा।
योहन चुंग

स्पष्टीकरण के लिए इसे उकेरा गया :)
Archie G. Quiñones

62

मैंने वास्तव में इस लेख को यह समझाने के लिए मददगार पाया कि कब किस कमांड का उपयोग किया जाए: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/

कुछ अलग मामले हैं:

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

    git checkout -- foo.txt

  2. यदि आपने फ़ाइल का मंचन किया है, तो git रीसेट का उपयोग करें। रीसेट करने के लिए सूचकांक को एक मैच के लिए बदलता है।

    git reset -- foo.txt

मुझे संदेह है कि इसका उपयोग git stashकरना एक लोकप्रिय विकल्प है क्योंकि यह थोड़ा कम खतरनाक है। यदि आप git रीसेट का उपयोग करते समय गलती से बहुत अधिक उड़ा देते हैं तो आप हमेशा इसके पीछे जा सकते हैं। रीसेट डिफ़ॉल्ट रूप से पुनरावर्ती है।

आगे की सलाह के लिए ऊपर दिए गए लेख को देखें।


60

ऐसा करने का सबसे आसान तरीका इस कमांड का उपयोग करना है:

इस कमांड का इस्तेमाल वर्किंग डायरेक्टरी में बदलावों को छोड़ने के लिए किया जाता है -

git checkout -- .

https://git-scm.com/docs/git-checkout

Git कमांड में, अनटैक की गई फ़ाइलों का उपयोग करके प्राप्त किया जाता है:

git stash -u

http://git-scm.com/docs/git-stash


19
दो बार मैं यहां आ चुका हूं, इस जवाब को पढ़ें, और .अंत में भूल गए । मुझे भविष्य के लिए: अवधि आवश्यक है !
बेजडो

2
मुझे एक उप निर्देशिका में सभी स्थानीय परिवर्तनों से छुटकारा पाने की आवश्यकता थी, बिना हर दूसरे बदलाव को उड़ाने के बिना। इस उत्तर ने बहुत मदद की, धन्यवाद
सहयोगी

2
कृपया बताएं कि दोनों कमांड क्या करते हैं। यह वास्तव में कोई स्पष्टीकरण नहीं है।
क्रिस केनेडी

2
अति उत्कृष्ट। चेकआउट एक कमांड में करता है जो दो में सबसे लोकप्रिय होता है। git clean -fdसूचकांक में नहीं साफ फ़ाइलों के साथ पालन किया जा सकता है ।
ओलिगोफ़्रेन

49

यदि आप अस्थिर परिवर्तनों को रखने में रुचि नहीं रखते हैं (विशेषकर यदि मंचित परिवर्तन नई फाइलें हैं), तो मुझे यह काम मिला:

git diff | git apply --reverse

44

git checkout -f


man git-checkout:

-f, --force

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

सूचकांक से रास्तों की जाँच करते समय, अनमैरिड एंट्रीज़ पर असफल न हों; इसके बजाय, अनमैरिड एंट्रीज़ को अनदेखा किया जाता है।


2
यह सूचकांक में परिवर्तन को छोड़ देगा !! (और ओपी को उन्हें छोड़ने की आवश्यकता है।)
रॉबर्ट सीमर

44

जैसा कि आप git स्टेटस टाइप करते हैं , (वर्किंग डायरेक्टरी में बदलावों को छोड़ने के लिए "git checkout - ..." का उपयोग किया जाता है )

जैसे git checkout -- .


1
डाउनवोट किया गया क्योंकि यह सभी फ़ाइलों को जल्दी से छोड़ने में मदद नहीं करता है। तीन डॉट्स इंगित करते हैं कि आपको सभी फाइलों को सूचीबद्ध करने की आवश्यकता है। यह विशेष रूप से बुरा है अगर आपको एक ही बार में कई टन फ़ाइलों को त्यागने की आवश्यकता है, जैसे। एक बड़े मर्ज के दौरान आपके द्वारा रखे जाने वाले सभी संशोधनों का मंचन करने के बाद
usr-local-

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

39

आप गिट स्टैश का उपयोग कर सकते हैं - अगर कुछ गलत हो जाता है, तो आप अभी भी स्टैश से वापस आ सकते हैं। यहाँ कुछ अन्य उत्तर के समान है, लेकिन यह भी सभी अस्थिर फ़ाइलों को हटा देता है और सभी अप्रचलित फ़ाइलों को भी हटा देता है:

git add .
git stash

यदि आप जांचते हैं कि सब कुछ ठीक है, तो स्टैश को फेंक दें:

git stash drop

बिलाल मकसूद के साथ जवाब git cleanने मेरे लिए भी काम किया, लेकिन मेरे पास बहुत अधिक नियंत्रण है - अगर मैं गलती से sth करता हूं, तब भी मैं अपने बदलाव वापस पा सकता हूं

अपडेट करें

मुझे लगता है कि 1 और बदलाव है (न जाने क्यों यह मेरे लिए पहले काम कर गया है):

git add . -A के बजाय git add .

-Aहटाए गए फ़ाइलों के बिना मंचन नहीं किया जाएगा


38

2019 अपडेट:

के बाद से जुलाई 2019 , एक नया आदेश जो वास्तव में यह करता है किया गया है: git restore

में git status, अब Git इस कमांड का उपयोग करने की सिफारिश git checkoutकरता है जैसे कि यह करता था।

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

इसलिए, एक पैथस्पेक से मेल खाती हुई फ़ाइलों को पुनर्स्थापित करने के लिए (उनके अस्थिर परिवर्तनों से छुटकारा पाने के लिए), आप करेंगे:

git restore <pathspec>

उदाहरण के लिए, वर्तमान निर्देशिका में सभी अस्थिर परिवर्तनों को पुनर्स्थापित करने के लिए, आप चला सकते हैं:

git restore .

यदि आप इसे प्रोजेक्ट के रूट से चलाते हैं, तो यह संपूर्ण रिपॉजिटरी में सभी अस्थिर परिवर्तनों को पुनर्स्थापित करेगा।

ध्यान दें, जैसा कि git checkout -- .(Mariusz Nowak द्वारा बताया गया है), यह केवल Git द्वारा ट्रैक की गई फ़ाइलों में परिवर्तन को छोड़ देगा और किसी भी नई अनट्रैक की गई फ़ाइलों को नहीं छोड़ेगा। यदि आप नई अनट्रैक की गई फ़ाइलों सहित किसी भी अस्थिर परिवर्तन को छोड़ना चाहते हैं, तो आप एक अतिरिक्त चला सकते हैं:

git clean -df

बाद में इस आदेश के साथ बहुत सावधान रहें क्योंकि आप उन फ़ाइलों को छोड़ सकते हैं जिन्हें आपने निकालने का इरादा नहीं किया था।


ध्यान दें git restore: क्योंकि यह एक नया कमांड है, इसका मैन पेज एक चेतावनी देता है:

यह कमांड प्रायोगिक है। व्यवहार बदल सकता है।

इसलिए यह संभव है कि यदि भविष्य में व्यवहार में परिवर्तन होता है तो यह उत्तर पुराना हो सकता है। इस प्रकार इसका man git-restoreउपयोग करने से पहले एक त्वरित चलाने के लिए बुद्धिमान हो सकता है।


2
मैं केवल नए जोड़े गए फ़ाइलों को प्रभावित किए बिना अपने अस्थिर परिवर्तनों को वापस लेना चाहता था इसलिए git restore .पूरी तरह से काम किया। धन्यवाद।
सौरभ मिश्रा

3
मैंने किया git restore <filename>और यह पूरी तरह से काम किया।
मर्लिन

1
मेरे लिए ठीक काम किया।
प्रोमेथियस

1
मैन पेज के अनुसार git restore .वर्तमान निर्देशिका में सभी फाइलों को पुनर्स्थापित करता है, पूरे रिपॉजिटरी में नहीं।
जर्नो

1
तुम सही हो। धन्यवाद! मैंने अभी इसका परीक्षण किया है और वास्तव में, यह मामला है। यह, हालांकि, पुनरावर्ती है। इसलिए जब परियोजना की जड़ से चलाया जाता है, तो यह पूरे भंडार पर लागू होता है। मैं अपने उत्तर को संपादित करूंगा।
प्रोजिटोस

35

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

इसलिए मैं यह सुनिश्चित करने के लिए ऐसा करता हूं कि जब मैं रीसेट कर लेता हूं तो वे वहां नहीं बैठते हैं (बाद में - उत्पत्ति / राजवंश पर gitignores को छोड़कर)

नोट: यदि आप फ़ाइलों को अभी तक ट्रैक नहीं करना चाहते हैं, लेकिन GITIGNORE में नहीं तो आप इस चरण को छोड़ना चाह सकते हैं, क्योंकि यह इन अनट्रैक की गई फ़ाइलों को आपके दूरस्थ रिपॉजिटरी (धन्यवाद @XtrmJosh) पर नहीं मिलेगा।

git add --all

फिर म

git fetch --all

फिर मैं उत्पत्ति के लिए रीसेट करता हूं

git reset --hard origin/branchname

यह एक वर्ग में वापस डाल देगा। बस शाखा की री-क्लोनिंग की तरह, स्थानीय और जगह पर मेरी सभी gitignored फ़ाइलों को रखें।

प्रति उपयोगकर्ता टिप्पणी नीचे अपडेट की गई: उपयोगकर्ता जो भी वर्तमान शाखा है, उसे रीसेट करने के लिए विविधता।

git reset --hard @{u}

यह मेरा पसंदीदा विकल्प है, लेकिन आप सभी परिवर्तनों को पहले क्यों जोड़ते हैं? जहां तक ​​मुझे पता है कि यह सिर्फ Git फ़ाइलों में निर्देशिका लिस्टिंग को संशोधित करता है, git रीसेट --hard का उपयोग करते हुए, यह वैसे भी खो जाएगा जबकि निर्देशिका अभी भी हटा दी जाएगी।
XtrmJosh 10

मैं मैक या लिनक्स पर नहीं है, github विंडोज़ की पॉवरशेल कभी-कभी रीसेट के बाद फ़ाइलों को छोड़ देती है। मुझे लगता है कि इसकी वजह से रीसेट रीसेट रेपो में सभी फ़ाइलों को इसकी मूल स्थिति में सेट करता है। अगर वे नहीं जोड़े गए हैं, तो वे छुआ नहीं गए हैं। डेस्कटॉप क्लाइंट फिर "इस फ़ाइल को यहाँ है और यह प्रतिबद्ध होने की जरूरत है"
निक

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

मैं एक मैक पर इस मुद्दे पर अब भी भाग गया। यदि फ़ाइल कभी-कभी रेपो में ट्रैक नहीं की जाती है तो गिट रीसेट रीसेट इसे स्पर्श नहीं करता है। मैं वास्तव में "WHY" को अलग नहीं कर सकता, लेकिन जब ऐसा होता है, अगर मैं रीसेट करता हूं, और मेरे पास अभी भी 1 अनमैच्ड फाइल या दो है, तो मैं जोड़ देता हूं
Nick

2
इसका एक अच्छा सा रूपांतर मुझे पसंद है git reset --hard @{u}जो वर्तमान रिमोट-ट्रैकिंग शाखा के लिए शाखा को रीसेट करता है
user2221343

31

ऊपर दिए गए सभी समाधानों की कोशिश की, लेकिन अभी भी नई, अस्थिर फ़ाइलों से छुटकारा नहीं पाया।

git clean -fउन नई फ़ाइलों को हटाने के लिए उपयोग करें - हालांकि सावधानी के साथ! बल विकल्प पर ध्यान दें।


21

बस कहते हैं

git stash

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

git stash apply 

या गिट स्टैश पॉप


21

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

git stash -u

किया हुआ। आसान।

यदि आप वास्तव में गुप्त कोष में ढेर के बारे में परवाह है तो आप के साथ पालन कर सकते हैं git stash drop। लेकिन उस बिंदु पर आप बेहतर उपयोग कर रहे हैं (Mariusz Nowak से):

git checkout -- .
git clean -df

फिर भी, मुझे git stash -uसबसे अच्छा लगता है क्योंकि यह केवल एक कमांड में सभी ट्रैक किए गए और अनट्रैक किए गए परिवर्तनों को "डिस्कार्ड" करता है । अभी तक git checkout -- .केवल छोड देता है परिवर्तन, और ट्रैक किए गए git clean -dfकेवल छोड देता ट्रैक न किए गए परिवर्तन ... और दोनों आदेशों टाइपिंग है अब तक बहुत ज्यादा काम :)


नोट: git stash -uजल्द ही (Git 2.14.x / 2.15, Q3 2017) थोड़ा विकसित होगा: stackoverflow.com/a/46027357/6309
VONC

अगर मुझे ओपी का प्रश्न मिलता है तो अनुक्रमित फाइलों को सही रखना चाहिए। केवल अस्थिर परिवर्तन को हटाया जाना चाहिए। तो git stash -kमेरी राय में होना चाहिए ।
स्नैप

21

एक स्थायी त्याग करने के लिए: git reset --hard

बाद के परिवर्तनों को सहेजने के लिए: git stash


16

यह उन निर्देशिकाओं में भी काम करता है जो हैं; सामान्य गिट अनुमतियों के बाहर।

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

हाल ही में मेरे पास आया


हालांकि, खबरदार कि सामग्री को नजरअंदाज नहीं किया है यह मूल अनुमति बरकरार नहीं रखेगा! इसलिए यह एक सुरक्षा जोखिम पैदा कर सकता है।
18

@Wicejr आप गलत हैं, कृपया पढ़ें git help clean"- अनट्रैक की गई फ़ाइलों के अलावा अनट्रेक्टेड डायरेक्ट्रीज को हटा दें।"
ग्लासगॉस्ट

आपने अपनी सभी फ़ाइलों को विश्व पढ़ने / लिखने के लिए क्यों सेट किया? अच्छा अभ्यास नहीं।
घटि

@ छोटी मेरी ख़राब, 664 सही है? उत्तर को संपादित करने के लिए आपका स्वागत है।
ग्लासगॉस्ट

सभी अनुमतियों को 664 पर सेट करना परियोजना की किस प्रकार की अनुमतियों के बारे में बहुत सी धारणाएँ बनाता है। मुझे लगता है कि कमांड के उस हिस्से का उपयोग कुछ लोगों के लिए मुद्दों का कारण होगा।
१18


14
cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory

12

मेरी राय में,

git clean -df

चाल चलनी चाहिए। गिट क्लीन पर गिट प्रलेखन के अनुसार

git-clean - काम करने वाले पेड़ से अनट्रैक की गई फ़ाइलों को हटा दें

विवरण

वर्त्तमान निर्देशिका से शुरू होकर संस्करण नियंत्रण में न आने वाली फ़ाइलों को पुन: हटाकर काम करने वाले पेड़ को साफ करता है।

आम तौर पर, Git के लिए केवल अज्ञात फ़ाइलों को हटा दिया जाता है, लेकिन अगर -x विकल्प निर्दिष्ट किया जाता है, तो उपेक्षित फ़ाइलें भी हटा दी जाती हैं। उदाहरण के लिए, सभी निर्माण उत्पादों को हटाने के लिए उपयोगी हो सकता है।

यदि कोई वैकल्पिक ... तर्क दिए जाते हैं, तो केवल वे ही मार्ग प्रभावित होते हैं।

विकल्प

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

-f --force यदि Git कॉन्फ़िगरेशन वेरिएबल clean.requireForce को झूठा सेट नहीं किया जाता है, तो git क्लीन चलाने के लिए तब तक मना कर देगा जब तक कि दिए गए -f, -n या -i।


11

कोई फर्क नहीं पड़ता कि आपका रेपो किस स्थिति में है, आप हमेशा किसी भी पिछले कमिट को रीसेट कर सकते हैं:

git reset --hard <commit hash>

यह उन सभी परिवर्तनों को छोड़ देगा जो उस प्रतिबद्ध के बाद किए गए थे।


2
यह सूचकांक में सब कुछ भी नहीं छोड़ेगा (न कि केवल चीजें जो सूचकांक में नहीं हैं), जो ओपी के लिए पूछ रहा है उससे परे है।
लाइनस अरवर जूल

10

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

यह तकनीक तब उपयोगी होती है, जब किसी कारण से, आप किसी भी सामान्य तंत्र (जैसे rm) द्वारा आसानी से अनट्रैक की गई सभी फ़ाइलों को हटा नहीं सकते हैं।


9

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

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

मेरे पास अक्सर इस तरह की स्थिति वाले संदेश होंगे (कम से कम 2/4 फ़ाइलें शामिल):

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# 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:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

एक गहरी नजर यह ध्यान रखेगी कि इन फाइलों में डॉप्लेगैंगर्स हैं जो केस ऑफ में एक अक्षर हैं। किसी तरह, और मुझे पता नहीं है कि मुझे इस रास्ते को शुरू करने के लिए क्या करना चाहिए (जैसा कि मैं इन फाइलों के साथ खुद को अपस्ट्रीम रेपो से काम नहीं कर रहा था), मैंने इन फ़ाइलों को स्विच किया था। इस पृष्ठ (और अन्य पृष्ठों) पर सूचीबद्ध कई समाधानों को आज़माएं मदद करने के लिए प्रतीत नहीं हुआ।

मैं अपनी कांटे की रिपॉजिटरी और सभी स्थानीय रिपॉजिटरी को हटाकर और फिर से काम करके समस्या को ठीक करने में सक्षम था। यह अकेला पर्याप्त नहीं था; अपस्ट्रीम को नए फाइलनामों के लिए फ़ाइलों का नाम बदलना पड़ा। जब तक आपके पास कोई काम नहीं है, कोई विकी नहीं है, और कोई भी मुद्दा नहीं है जो अपस्ट्रीम रिपॉजिटरी से निकलता है, तो आपको ठीक होना चाहिए। कम से कम कहने के लिए अपस्ट्रीम आपके साथ बहुत खुश नहीं हो सकता है। मेरी समस्या के रूप में, यह निस्संदेह एक उपयोगकर्ता त्रुटि है क्योंकि मैं गिट के साथ प्रवीण नहीं हूं, लेकिन यह तथ्य कि गिट के साथ किसी मुद्दे पर अंक तय करना आसान है।


7

जब आप किसी अन्य व्यक्ति को एक स्लैश स्थानांतरित करना चाहते हैं:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

[संपादित करें] टिप्पणी के रूप में, यह संभव है कि स्टैम्स का नाम दिया जाए। ठीक है, अगर आप अपना स्टाश साझा करना चाहते हैं, तो इसका इस्तेमाल करें;)


5
दरअसल गिट स्टैश का टाइटल हो सकता है। उदाहरण के लिए git stash save "Feature X work in progress"
कॉलिन डी बेनेट

7

आप अपना खुद का उपनाम बना सकते हैं जो यह बताता है कि इसे विवरणात्मक तरीके से कैसे किया जाए।

मैं परिवर्तनों को छोड़ने के लिए अगले उपनाम का उपयोग करता हूं।


काम के पेड़ में एक (फ़ाइल) की सूची में परिवर्तन छोड़ें

discard = checkout --

फिर आप इसे सभी परिवर्तनों को छोड़ने के लिए अगले के रूप में उपयोग कर सकते हैं:

discard .

या सिर्फ एक फ़ाइल:

discard filename

अन्यथा, यदि आप सभी परिवर्तनों को और अनट्रैक की गई फ़ाइलों को भी छोड़ना चाहते हैं, तो मैं चेकआउट और क्लीन के मिश्रण का उपयोग करता हूं:

कार्यशील पेड़ में परिवर्तन और अनियोजित फ़ाइलों को साफ और त्यागें

cleanout = !git clean -df && git checkout -- .

तो उपयोग अगले के रूप में सरल है:

cleanout

अब अगले जीथुब रेपो में उपलब्ध है जिसमें बहुत सारे उपनाम हैं:


7

मेरे पास एक अजीब स्थिति थी जहां एक फ़ाइल हमेशा अस्थिर होती है, इससे मुझे हल करने में मदद मिलती है।

git rm .itattributes
git add-a
git reset --hard

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