स्थानीय कमिट करने के बाद मैं अपनी फ़ाइलों को फिर से कैसे खोल सकता हूँ?


268

मैंने निम्नलिखित कमांड निष्पादित किया है

git add <foo.java>
git commit -m "add the foo.java file"

अब मैं अपने स्थानीय कमिट को कैसे हटा सकता हूं और fst.java को अनस्टेज कर सकता हूं।

यदि मैं टाइप करता हूं git reset --hard, तो मैंने पाया कि यह मेरे संशोधित foo.javaको मूल में बदल देता है ।

जवाबों:


451

git reset --soft HEAD~1आपको जो चाहिए वो करना चाहिए। इसके बाद, आप सूचकांक में पहले परिवर्तन (साथ दिखेंगे git diff --cached), और आपके नवीनतम परिवर्तन मंचन नहीं करेंगे। git statusफिर इस तरह दिखेगा:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   foo.java
#
# 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:   foo.java
#

फिर आप git add foo.javaएक साथ दोनों बदलाव कर सकते हैं और कर सकते हैं ।


मैंने उत्तर को संपादित किया: "परिवर्तन किए जाने के लिए" पहले परिवर्तन हैं, और "परिवर्तनों के लिए प्रतिबद्ध नहीं हैं" में दूसरे परिवर्तन हैं।
एंट्टी जूल

4
इस उत्तर में जो वर्णित है वह वास्तव में क्या git commit --amendकरता है; लेकिन अधिक जटिल वर्कफ़्लो के साथ। यह ओपी द्वारा पूछे गए सवाल का जवाब नहीं देता है, इसके बावजूद एक अच्छी दिशा ( git reset) दे रहा है ।
7heo.tk

2
इसे काम करने के लिए '^' को '~' से बदलना पड़ा, इसलिए ऐसा दिखता है:git reset --soft HEAD~
Shahar

3
git रीसेट करें --soft HEAD ~ 1 फिर git रीसेट HEAD
Joko Wandiro

मैं क्या चाहता हूँ के लिए एकदम सही जवाब!
दीपइन्जावा

78

उपयोग:

git reset HEAD^

यह डिफ़ॉल्ट रूप से "मिश्रित" रीसेट करता है, जो आपने पूछा था कि क्या करेगा; सबसे हाल की प्रतिबद्ध को हटाकर, अस्थिर में foo.java डालें।


2
क्या आप मुझे समझाएंगे कि "मिश्रित" रीसेट, "सॉफ्ट" रीसेट और "हार्ड" रीसेट क्या है?
किट हो

1
@ किट हो - गिट रीसेट मैनुअल में इनका बेहतरीन वर्णन है।
मनोज् यों १३:११ को

4
@ किट, @manojisions: तो क्या stackoverflow.com/questions/2530060/… (बेशर्म प्लग)
Cascabel

5
यह वास्तव में एकमात्र सही उत्तर है। कमिट करने के बाद दो अन्य उत्तर फिर से फाइलों को स्टेज करेंगे ।
7heo.tk

git reset --softकाम नहीं किया, लेकिन git reset HEAD^किया
शब्दशः

43

मेरे लिए, यह करने के लिए निम्नलिखित अधिक पठनीय (इस प्रकार बेहतर) तरीका है:

git reset HEAD~1

इसके बजाय 1, कोई भी संख्या हो सकती है जिसे आप अनस्टेज करना चाहते हैं।


39

git reset --softबस इसके लिए है: यह पसंद है git reset --hard, लेकिन फाइलों को नहीं छूता है।


4
यह सबसे आसानी से समझा जा सकने वाला स्पष्टीकरण था जिसे मैंने अभी तक (केवल 11 शब्दों में) सुना है! धन्यवाद!
9

3
वह उत्तर गलत है। git reset"जैसा है git reset --hardलेकिन फाइलों को नहीं छूता है।" नहीं है git reset --softgit reset --softपरिवर्तनों को चरणबद्ध करेगा, इसलिए यदि आप उन्हें नहीं करना चाहते हैं, तो आपको उन्हें उस स्थिति में चरणबद्ध करने के लिए नहीं जोड़ना होगा, लेकिन आपको git resetउन्हें (हाँ, दूसरी बार और बिना --soft) करना होगा। तो यह उत्तर छोटा है, लेकिन गलत है।
7heo.tk

12

अपनी अंतिम प्रतिबद्ध में सभी फाइलों को अस्थिर करने के लिए -

git reset HEAD~


8

"रीसेट" स्थानीय रूप से परिवर्तनों को पूर्ववत करने का तरीका है। जब आप कमिट करते हैं, तो आप " git add " के साथ शामिल करने के लिए परिवर्तनों का चयन करते हैं - जिसे "स्टेजिंग" कहा जाता है। और एक बार जब बदलावों का मंचन हो जाता है, तो आप उन्हें " कमिट " कर देते हैं।

स्टेजिंग या कमिट में से वापस आने के लिए, आप HEAD को "रीसेट" करें। शाखा पर, HEAD एक git वैरिएबल है जो सबसे हालिया कमेंट की ओर इशारा करता है। इसलिए यदि आपने मंचन किया है, लेकिन प्रतिबद्ध नहीं है, तो आप " HEAD रीसेट करें ।" वह मंच से परिवर्तन करके वर्तमान HEAD तक का समर्थन करता है। यह " git reset --mixed HEAD ~ 0 के लिए शॉर्टहैंड है ।"

यदि आप पहले से ही प्रतिबद्ध हैं, तो HEAD पहले से ही उन्नत हो चुका है, इसलिए आपको पिछली कमिटमेंट का बैकअप लेना होगा। यहाँ आप " HEAD ~ 1 रीसेट करें " या " HEAD ^ 1 रीसेट करें " या " रीसेट HEAD ~ " या " रीसेट HEAD ^ " - सभी संदर्भ HEAD माइनस एक।

बेहतर प्रतीक कौन सा है, ~ या ^? ~ टिल्ड को एकल धारा के रूप में सोचें - जब प्रत्येक प्रतिबद्ध में एक ही माता-पिता होते हैं और यह अनुक्रम में बदलाव की एक श्रृंखला होती है, तो आप टिल्ड का उपयोग करके धारा का संदर्भ ले सकते हैं, जैसा कि HEAD ~ 1, HEAD ~ 2, HEAD ~ 3, माता-पिता, दादा-दादी, परदादा, आदि के लिए (तकनीकी रूप से यह पहले की पीढ़ियों में पहला माता-पिता ढूंढ रहा है)।

जब कोई मर्ज होता है, तो कमिट में एक से अधिक माता-पिता होते हैं। जब ^ कैरेट खेलने में आता है - तो आप याद रख सकते हैं क्योंकि यह शाखाओं को एक साथ आने को दर्शाता है। कैरेट का उपयोग करके, HEAD ^ 1 पहला माता-पिता होगा और HEAD ^ 2 उदाहरण के लिए, एकल प्रतिबद्ध - माता और पिता का दूसरा माता-पिता होगा।

इसलिए यदि आप सिंगल-पैरेंट कमिट पर सिर्फ एक हॉप वापस ले रहे हैं, तो HEAD ~ और HEAD ^ समतुल्य हैं - आप दोनों में से किसी एक का उपयोग कर सकते हैं।

इसके अलावा, रीसेट हो सकता है --soft , --mixed , या --hard । एक नरम रीसेट बस कमिट को वापस करता है - यह HEAD को रीसेट करता है, लेकिन यह पहले की कमिट से फाइलों की जांच नहीं करता है, इसलिए वर्किंग डायरेक्टरी में सभी बदलाव संरक्षित हैं। और --soft रीसेट भी चरण ( सूचकांक के रूप में भी जाना जाता है ) को साफ नहीं करता है , इसलिए सभी फ़ाइलों का मंचन अभी भी मंच पर होगा।

A --mixed रीसेट (डिफ़ॉल्ट) भी पहले की गई फ़ाइलों की जाँच नहीं करता है, इसलिए सभी परिवर्तन संरक्षित हैं, लेकिन चरण को हटा दिया गया है। यही कारण है कि एक सरल " जीआईटी रीसेट हेड " चरण बंद कर देगा।

A --hard रीसेट HEAD को रीसेट करता है, और यह स्टेज को क्लियर करता है, लेकिन यह पहले की गई सभी फाइलों को भी चेक करता है और इसलिए यह किसी भी बदलाव को ओवरराइट कर देता है।

यदि आपने कमेटी को रिमोट रिपॉजिटरी में धकेल दिया है, तो रीसेट इतनी अच्छी तरह से काम नहीं करता है। आप स्थानीय रूप से रीसेट कर सकते हैं, लेकिन जब आप रिमोट को पुश करने का प्रयास करेंगे, तो गिट यह देखेगा कि आपका स्थानीय हेड रिमोट शाखा में हेड के पीछे है और धक्का देने से इनकार करेगा। आप जोर जबरदस्ती करने में सक्षम हो सकते हैं, लेकिन वास्तव में ऐसा करना पसंद नहीं है।

वैकल्पिक रूप से, आप कर सकते हैं भी छिपा सकते अपने परिवर्तनों को आप उन्हें रखने के लिए, चाहते हैं, तो बाहर की जाँच पहले प्रतिबद्ध, परिवर्तन अन-छिपाया, चरण उन्हें, बनाने के लिए एक नया प्रतिबद्ध, और फिर उस धक्का।


ऑपरेशन के विस्तृत विवरण के लिए +1। IMO यह स्वीकृत उत्तर होना चाहिए!
ISAE

2

कहते हैं कि आप एन कमिट्स में परिवर्तन करना चाहते हैं,

जहां कमेट हैश इस प्रकार हैं:

  • h1
  • h2 ...
  • HN
  • HN + 1

फिर निम्न कमांड चलाएँ:
git reset hn

अब HEAD hn + 1 पर होगा। H1 से hn में परिवर्तन अस्थिर होगा।

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