git: नई फ़ाइलों सहित सभी कार्यशील परिवर्तन को पूर्ववत करें


1151

नई अनट्रैक फ़ाइलों सहित कार्यशील निर्देशिका से सभी परिवर्तनों को कैसे हटाएं। मुझे पता है कि git checkout -fऐसा करता है, लेकिन यह अंतिम प्रतिबद्ध के बाद से बनाई गई नई अनट्रैक की गई फ़ाइलों को नहीं हटाता है।

किसी को भी एक विचार है कि कैसे करना है?


1
@ जॉयल एंड वेफरर: आप प्रयास क्यों नहीं करते हैं git help resetऔरgit help clean
शेरनान्देज़

3
अपने git config में इसके लिए एक उपनाम बनाना एक अच्छा विचार है;)
anubina

जवाबों:


1699
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

यह देखने के लिए कि वास्तव में इसे हटाने के बिना पहले हाथ से क्या हटाया जाएगा, -nध्वज का उपयोग करें (यह मूल रूप से एक परीक्षण-रन है)। जब आप वास्तव में हटाने के लिए तैयार हों, तो -nध्वज को हटा दें :

git clean -nfd


16
नोट: git reset --hard मंचन के साथ-साथ कार्यशील निर्देशिका में परिवर्तन को हटा देता है। इसके अलावा, git क्लीन -f -d शायद एक नई अनट्रैक फ़ाइल को जोड़ने के लिए एक बेहतर विपरीत है। सवाल से, प्रश्नकर्ता अनदेखा फ़ाइलों के अपने वर्तमान सेट से काफी खुश हो सकता है।
सीबी बेली

7
अगला उत्तर पढ़ें और -x स्विच से बाहर देखें। (यह आपके स्थानीय कॉन्फिग को भी हटा सकता है जैसे कि पासवर्ड / डीबी-सेटिंग फाइल। उदाहरण के लिए database.yml)
बोरिस

9
इस मामले में थीक्स स्विच अनावश्यक और कुछ हद तक खतरनाक है।
तैम गौतियर

66
git clean -fxdवास्तव में खतरनाक हो सकता है यदि आप नहीं जानते कि आप क्या कर रहे हैं। आप स्थायी रूप से कुछ महत्वपूर्ण महत्वपूर्ण फ़ाइलों को हटा सकते हैं, जैसे कि आपका डेटाबेस, आदि। सावधानी बरतें।
मेसन स्टीवर्ट

10
ध्यान दें कि git clean -f -dअनदेखा किए गए फ़ोल्डरों से भी फाइल डिलीट हो जाएगी। तो आप सभी लोकल लॉग्स और उस तरह की चीजें चला जाएगा। आमतौर पर यह एक बड़ी समस्या नहीं है, लेकिन यह जानना बेहतर है।
साइबरेल

299

सबसे सुरक्षित तरीका, जिसका मैं अक्सर उपयोग करता हूं:

git clean -fd

प्रति /docs/git-cleanपृष्ठ के अनुसार सिंटैक्स स्पष्टीकरण :

  • -f(उर्फ:) --force। अगर Git कॉन्फ़िगरेशन वेरिएबल clean.requireForce को झूठा सेट नहीं किया जाता है, तो git क्लीन फ़ाइलों या निर्देशिकाओं को हटाने से मना कर देगा जब तक कि -f, -n या -i नहीं दिया जाता है। जब तक दूसरा -f नहीं दिया जाता है, Git .गित उप निर्देशिका या फ़ाइल के साथ निर्देशिकाओं को हटाने से इंकार कर देगा।
  • -d। अनट्रैक की गई फ़ाइलों के अलावा अनट्रैकड डाइरेक्टरीज़ को हटा दें। अगर एक अनट्रैकड डायरेक्टरी को एक अलग Git रिपॉजिटरी द्वारा प्रबंधित किया जाता है, तो इसे डिफ़ॉल्ट रूप से हटाया नहीं जाता है। यदि आप वास्तव में इस तरह की डायरेक्टरी को हटाना चाहते हैं तो दो बार विकल्प का उपयोग करें।

जैसा कि टिप्पणियों में उल्लेख किया गया है, ऐसा करना बेहतर हो सकता है git clean -ndजो एक सूखा रन करता है और आपको बताता है कि वास्तव में इसे हटाने से पहले क्या हटा दिया जाएगा।

git cleanडॉक्टर पृष्ठ से लिंक करें : https://git-scm.com/docs/git-clean


124
मैं हमेशा git clean -nd .फ़ाइलों को हटाने से पहले वास्तव में उपयोग करता हूंgit clean -fd .
tbear

14
क्यों? क्या आप कृपया विस्तार से बता सकते हैं।
ग्रेग बी

31
प्रति git स्वच्छ -n विकल्प वास्तव में एक सूखा रन है जो कुछ भी नहीं हटाता है, यह सिर्फ आपको दिखाता है कि क्या किया जाएगा।
RNickMcCandless

2
@tbear, आप हमेशा पहले एक खाली add -A+ commit -a+ कर सकते हैं । प्रत्येक को हटाना और हटाना केवल प्रमुख परिदृश्यों के लिए नहीं है। इसके अलावा, ड्राई रनिंग एक सिल्वर बुलेट नहीं है: क्या होगा अगर आपने समीक्षा के दौरान कुछ याद किया या गलती की है? revert headgit clean
पेसियर

1
यह फ़ाइलें निकालता है, लेकिन यह संशोधनों को पूर्ववत नहीं करता है।
दान

202

सभी अस्थिर फ़ाइलों के लिए:

git checkout -- .

.अंत में महत्वपूर्ण है।

आप .अपनी परियोजना के केवल एक विशिष्ट उप-निर्देशिका को खाली करने के लिए एक उप-निर्देशिका नाम से बदल सकते हैं । समस्या का समाधान यहां विशेष रूप से किया गया है


7
@Vincent: - - चेकआउट कमांड को यह बताकर टाइपिंग की त्रुटियों से बचा जाता है कि कोई और पैरामीटर निर्दिष्ट नहीं है। उनके बिना आप वर्तमान को रीसेट करने के बजाय एक नई शाखा के साथ समाप्त हो सकते हैं!
इगोर रोड्रिगेज

2
यह सबसे सुरक्षित मार्ग है, लेकिन यह अनटैक की गई फ़ाइलों (नई जोड़ी गई फ़ाइलों) को नहीं हटाएगा।
TinkerTenorSoftwareGuy

5
यह हटाए गए, अभी तक अप्रकाशित, फ़ाइलों को पुनर्स्थापित नहीं करता है।
सेरिन

सिर्फ आपकी जानकारी के लिए। मुझसे यह छूट गया। सुनिश्चित करें कि आप उस निर्देशिका में हैं जिसे आप अनस्ट्रेड किए गए परिवर्तनों को हटाना चाहते हैं। उदाहरण के लिए, मैंने एक शाखा में अलग-अलग स्थानों पर 2 अलग-अलग फ़ाइलों में परिवर्तन किए, यानी: src/app/work/filename.jsऔर ../app/working/test/filename.jsgit checkout -- .केवल शाखा पर उपयोग करने से केवल पहली फ़ाइल ( प्रमुख के बिना .. ) नष्ट हो गई । इसलिए मुझे cd ../उस कमांड का उपयोग करके दूसरी फ़ाइल को हटाने के लिए दूसरी स्थान निर्देशिका में आना पड़ा ।
क्रिस 22

57

git cleanकमांड पर एक नजर है ।

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

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

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


मैंने git clean -iमेनू से "क्लीन" की कोशिश की है और चुना है - यह अंत में नई फ़ाइलों को हटा दिया है।
Sany

42

निम्नलिखित कार्य:

git add -A .
git stash
git stash drop stash@{0}

कृपया ध्यान दें कि यह आपके अस्थिर और मंचित दोनों स्थानीय परिवर्तनों को छोड़ देगा। इसलिए आपको इन कमांड्स को चलाने से पहले आपको कुछ भी रखना चाहिए।

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

क्रेडिट: https://stackoverflow.com/a/52719/246724


1
आप सिर्फ के बजाय @ @ 0} को क्यों संदर्भित कर रहे हैं git stash drop?
मिकेल

ईमानदारी से, मुझे याद नहीं है :)
दान

यह एक काम किया। एक नोट के रूप में, सुनिश्चित करें कि आप होम डायरेक्टरी ( git add -A .) में हैं। मैं 30 मीटर से हार गया हूँ कोई फ़ाइल मैच नहीं था। धन्यवाद!
user9869932

मैंने इस दृष्टिकोण का उपयोग किया, और इसमें योग्यता है। हालाँकि, मैंने तब से मूल समस्या, IMHO में jfountain और हीथ डटन द्वारा प्रस्तावित समाधानों को अधिक उपयुक्त पाया है।
हेइज़िको

2
git stash drop stash @ {0} अगर आप कर चुके हैं, तो आप जो भी
स्टैच गिराएंगे

42

आप इसे दो चरणों में कर सकते हैं:

  1. संशोधित फ़ाइलें वापस करें: git checkout -f
  2. हटाए गए फ़ाइलों को हटा दें: git clean -fd

3
+1 सरल होने के कारण। यह भी क्योंकि यह काम करता है और वही करता है जो ओपी चाहता है कि उन्हें ओएमजी से डराए बिना यह सब कुछ हटा देगा।
फरवरी को geekzster

30

मैंने सोचा था कि यह ( चेतावनी: निम्नलिखित सब कुछ मिटा देगा )

$ git reset --hard HEAD
$ git clean -fd

resetपरिवर्तन पूर्ववत। cleanकिसी भी ट्रैक न किए गए दूर करने के लिए Iles और irectories।


यह काम नहीं करता है, मुझे अभी भी एक संघर्ष की चेतावनी मिलती है जब git pullबाद में करते हैं: CONFLICT (content): Merge conflict in...मैंने केवल इसे हल किया हैgit pull --strategy=ours
rubo77


4

git clean -iआपकी पुष्टि के बाद पहले आपको हटाए जाने और आगे बढ़ने के लिए आइटम दिखाएगा। मुझे महत्वपूर्ण फ़ाइलों से निपटने के दौरान यह उपयोगी लगता है जिन्हें गलती से नहीं हटाया जाना चाहिए।

git help cleanअधिक जानकारी के लिए देखें , कुछ अन्य उपयोगी विकल्प भी शामिल हैं।


4

यदि आप सभी परिवर्तनों को छोड़ना चाहते हैं, तो आप किसी भी अन्य विकल्प को किसी अन्य उपनाम में उपयोग कर सकते हैं .gitconfig। उदाहरण के लिए:

[alias]
    discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

उपयोग: git discard


1
यह उपनाम मुझे बहुत पसंद है
झंडे

3

एक वैकल्पिक समाधान परिवर्तनों को करना है, और फिर उन कमिटों से छुटकारा पाना है। इससे पहले तो तत्काल लाभ नहीं होता है, लेकिन यह चंक्स में प्रतिबद्ध होने और बैकअप के लिए एक जीआईटी टैग बनाने की संभावना को खोलता है।

आप इसे वर्तमान शाखा पर कर सकते हैं, जैसे:

git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git revert HEAD
git reset HEAD^^

या आप इसे अलग हेड पर कर सकते हैं। (मान लें कि आप ब्रंचनाम शाखा पर शुरू होते हैं):

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git checkout BRANCHNAME

हालाँकि, आमतौर पर मैं जो कुछ भी करता हूं, वह चांस में करना होता है, फिर कुछ या सभी का नाम "DISCARD: ..." के रूप में रखना चाहिए। फिर बुरे कामों को दूर करने और अच्छे लोगों को रखने के लिए इंटरैक्टिव रिबेट का उपयोग करें।

git add -p  # Add changes in chunks.
git commit -m"DISCARD: Some temporary changes for debugging"
git add -p  # Add more stuff.
git commit -m"Docblock improvements"
git tag archive/local-changes-2015-08-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

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

git lolऔरgit lola शॉर्टकट इस कार्यप्रवाह के साथ बहुत मददगार रहे हैं।


3

मेरे द्वारा उपयोग किए जाने वाले विशिष्ट फ़ोल्डर के लिए:

git checkout -- FolderToClean/*

3
ओपी राज्यों के रूप में, अनटैक की गई फ़ाइलों को डिलीट नहीं करता है।
वॉनब्रांड

0

यह शायद एक नॉब जवाब है, लेकिन: मैं विंडोज़ के लिए TortoiseGit का उपयोग करता हूं और इसमें REVERT नामक एक अच्छी सुविधा है। इसलिए आप अपने स्थानीय गैर-पंजीकृत गैर-परिवर्तनित परिवर्तनों को वापस करने के लिए क्या करते हैं:

  1. आवश्यक फ़ोल्डर के लिए एक संदर्भ मेनू लाएं और रिवर्ट का चयन करें, यह एक रिवर्ट पॉपअप दिखाता है जहां आप परिवर्तित फ़ाइलों को वापस / पुनर्प्राप्त करने के लिए चुन सकते हैं।
  2. यदि आप भी जोड़ी गई फ़ाइलों को हटाना चाहते हैं (जो अभी तक जीआईटी में नहीं हैं) तो कमिट (एक ही संदर्भ मेनू से) पर क्लिक करें यह कमिट पॉपअप लाता है और आपको जोड़े गए फ़ाइलों को दिखाता है, फिर उनमें से प्रत्येक पर राइट क्लिक करें और हटाएं चुनें। लेकिन इस पॉपअप में न ही कमिट बीटीएन दबाएं, जैसा कि आप कमिट नहीं करना चाहते हैं, लेकिन केवल जोड़े गए फाइलों को देखें और उन्हें यहां से हटा दें।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.