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



Answers

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

git checkout path/to/file/to/revert

सभी अस्थिर फ़ाइलों का उपयोग करने के लिए:

git checkout -- .

अंत में अवधि शामिल करना सुनिश्चित करें।

Question

मैं अपनी कार्यशील प्रति में परिवर्तनों को कैसे हटा सकता हूं जो इंडेक्स में नहीं हैं?




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

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

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

git add --all

तब मैं

git fetch --all

फिर मैं मूल पर रीसेट कर दिया

git reset --hard origin/branchname

यह इसे वापस वर्ग में रखेगा। शाखा की आरई क्लोनिंग की तरह, जब भी मेरी सभी गिटिग्नर फाइलें स्थानीय रूप से और जगह पर रखती हैं।

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

git reset --hard @{u}



जब आप किसी और को छेड़छाड़ करना चाहते हैं:

# 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

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




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

git stash -u

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

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

git checkout -- .
git clean -df

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




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

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

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

discard = checkout --

फिर आप सभी परिवर्तनों को त्यागने के बगल में इसका उपयोग कर सकते हैं:

discard .

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

discard filename

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

काम करने वाले पेड़ में बदलावों और अनचाहे फ़ाइलों को साफ और त्यागें

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

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

cleanout

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




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

git checkout .

या यह इंडेक्स से सभी फाइलों को जांचता है, काम कर रहे पेड़ फ़ाइलों को ओवरराइट करता है।

git checkout-index -a -f



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

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

मुझे अक्सर इस तरह गिट स्टेटस संदेश होंगे (कम से कम 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

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

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




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

गिट आरएम। gitattributes
गिट एड-ए
गिट रीसेट - हार्ड




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

git diff | git apply --reverse



git checkout -f

man git-checkout :

-f, --force

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

इंडेक्स से पथों की जांच करते समय, अनमोल प्रविष्टियों पर असफल न हों; इसके बजाय, अनमोल प्रविष्टियों को नजरअंदाज कर दिया जाता है।




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

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

हाल ही में मुझे हुआ




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

तो अवांछित स्थानीय परिवर्तनों को वापस करने के लिए मैं अक्सर अभ्यास में क्या करता हूं, सभी अच्छी चीजें करने के लिए, और फिर शाखा को रीसेट करना है।

यदि अच्छी चीजें एक ही प्रतिबद्धता में प्रतिबद्ध होती हैं, तो आप अंततः चरणबद्ध या अस्थिर होने के लिए "आखिरी प्रतिबद्धता में संशोधन" का उपयोग कर सकते हैं यदि आप आखिरकार इसे थोड़ा अलग करना चाहते हैं।

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

तो संक्षेप में, मैं बस प्रतिबद्ध करता हूं, शाखा रीसेट करता हूं, और अंतिम प्रतिबद्धता में संशोधन करता हूं।




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

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




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

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

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

    git checkout -- foo.txt

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

    git reset -- foo.txt

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

आगे की सलाह के लिए ऊपर दिए गए लेख पर नज़र डालें।




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

git checkout -p

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

यह भी देखें:

git add -p



Links