Git का ट्रैकिंग तंत्र
git reset पर जाने से पहले, हमें git की अंतर्निहित संरचना को समझने की आवश्यकता है। Git नोड्स और पॉइंटर्स के साथ ट्री-जैसी संरचनाओं के माध्यम से फ़ाइलों को प्रबंधित और ट्रैक करता है।
आपके स्थानीय git रिपॉजिटरी पर मूल रूप से इन तीन "ट्रीज़" हैं:
- वर्किंग डायरेक्टरी: या वर्किंग ट्री, और यह आपके स्थानीय डायरेक्टरी को संदर्भित करता है और
git statusआपको आपकी वर्किंग डायरेक्टरी की स्थिति देगा। - HEAD: सिर्फ आपकी वर्तमान ब्रांच का अंतिम कमिट स्नैपशॉट है। यदि आप
git checkoutके साथ ब्रांच स्विच करते हैं तो HEAD ब्रांच पर अंतिम कमिट में बदल जाएगा। - इंडेक्स: या स्टेजिंग एरिया। तो जब आप कमिट करने के लिए
git addफ़ाइलें करते हैं तो यह उन्हें इस इंडेक्स में जोड़ता है।
Git वर्कफ़्लो
निम्नलिखित उदाहरण एक फ़ाइल में परिवर्तन करने और फिर git add का उपयोग करके इसे इंडेक्स (स्टेजिंग) में जोड़ने को दर्शाता है, फिर यह देखने के लिए git status चेक करता है कि कमिट किए जाने वाले परिवर्तन क्या हैं।
अब जब हम git commit करते हैं तो यह एक अधिक स्थायी स्नैपशॉट के रूप में सेव होता है और मास्टर और HEAD को उस पॉइंटर पर अपडेट करता है। इसलिए यदि हम git commit के बाद git status करते हैं, तो हम देखेंगे कि सभी तीन ट्रीज़ एक ही स्थिति में हैं (कमिट करने के लिए कुछ भी नहीं होगा)।
तो git reset का उद्देश्य क्या है?
आप सोच रहे होंगे कि git reset तक पहुंचने के लिए यह सब प्रस्तावना क्यों। खैर, git reset इन ट्रीज़ को विभिन्न तरीकों से मैनिपुलेट करता है। इसलिए git reset आपके द्वारा किए जाने वाले कार्य के आधार पर विभिन्न विकल्पों को स्वीकार करेगा।
Git Reset मोड्स
मान लीजिए हमने कुछ परिवर्तन और फ़ाइलें कमिट कीं, फिर महसूस किया कि हमने उन्हें गलत ब्रांच पर कमिट किया है या हमारा कमिट बगी है इसलिए हम रिवाइंड करना चाहते हैं। यहां git reset मोड्स को जानना उपयोगी है।
मोड के साथ सभी git reset HEAD पॉइंटर को अपडेट करेंगे। इसका निम्नलिखित सिंटैक्स है:
git reset <mode> <commit-optional>
मुख्य मोड्स हैं:
--soft: HEAD पॉइंटर रीसेट करता है और इंडेक्स और वर्किंग डायरेक्टरी को अछूता छोड़ देता है। तो आपका HEAD रीसेट हो जाएगा और अन्य ट्रीज़ अभी भी नवीनतम परिवर्तन दिखाएंगे।--mixed: डिफ़ॉल्ट विकल्प। HEAD और इंडेक्स को रीसेट करता है। यह मूल रूप से आपके सभी परिवर्तनों को अन-स्टेज करता है और आपकोgit addकरने से पहले छोड़ देता है। नोट: यदि आप बिना किसी विकल्प के git reset करते हैं, तो इसेgit reset --mixedके रूप में व्याख्या किया जाएगा।--hard: इससे सावधान रहें। HEAD, इंडेक्स को रीसेट करने के अलावा, यह आपके वर्किंग डायरेक्टरी को भी रीसेट करता है। तो आप लिखे गए कोड को खो सकते हैं! वर्तमान HEAD पॉइंटर (अंतिम कमिट) के बाद किसी भी परिवर्तन को त्याग दिया जाता है।
--merge और --keep जैसे अन्य मोड्स को आधिकारिक दस्तावेज़ में पढ़ा जा सकता है।
उपयोगी Git Reset ट्रिक्स
कमिट को रिवाइंड करना
याद रखें कि यदि हम मोड को छोड़ देते हैं (बिना किसी विकल्प के git reset) तो इसे --mixed के रूप में व्याख्या किया जाएगा।
अब यदि हम सिर्फ git reset HEAD टाइप करते हैं तो कुछ नहीं होगा, लेकिन यदि हम git reset HEAD~1 करते हैं तो हमारा HEAD अब अपने पिछले कमिट की ओर इशारा करेगा।
निम्नलिखित उदाहरण पिछले से जारी है। मान लीजिए हम अपने सैंपल फ़ाइल में नया टेक्स्ट जोड़ते हैं। फिर हम git add और कमिट करते हैं। फिर git reset HEAD~1 करने के बाद, हमारे सभी परिवर्तन अन-स्टेज हो जाते हैं और पिछले कमिट पर होते हैं।
यह एक उपयोगी और तेज़ तरीका है जब हम एक कमिट को पूर्ववत करना चाहते हैं!
एक विशिष्ट फ़ाइल को अन-स्टेज करना
मान लीजिए आपने git add के साथ एक फ़ाइल को इंडेक्स में जोड़ा। हम उस फ़ाइल को केवल इस करके हटा सकते हैं:
git reset HEAD <file-name>
परिदृश्य: मैंने अपना सारा कोड बिगाड़ दिया! क्या मैं वापस जा सकता हूं जब यह काम कर रहा था?
यदि आप सभी स्थानीय परिवर्तनों को फेंकना चाहते हैं और अपने पिछले कमिट पर वापस जाना चाहते हैं तो आपका अंतिम उपाय git reset --hard है।
अक्सर यदि आप अपना कोड तोड़ते हैं तो यह आपका एकमात्र विकल्प हो सकता है। यदि आप कमिट हैश जानते हैं तो आप git reset --hard <commit> कर सकते हैं। लेकिन ध्यान दें कि यह विशिष्ट कमिट के बाद किसी भी अन्य कमिट को भी प्रभावित करेगा (यदि कोई हो)!
परिदृश्य: यह कमिट एक नई ब्रांच में होना चाहिए था!
यह अक्सर होता है, खासकर जब आप प्रोडक्शन में काम करना शुरू कर रहे होते हैं। अगर आपके साथ ऐसा होता है, तो घबराएं नहीं!
हमें जो करने की आवश्यकता है वह मूल रूप से उस नई ब्रांच को बनाना है जिसमें उस ब्रांच की स्थिति हो जिसे हमें रिवाइंड करने की आवश्यकता है। फिर हम प्रभावित ब्रांच को रीसेट करेंगे, और फिर हम नई ब्रांच पर चेकआउट करेंगे और वहां कमिट करेंगे:
git branch new-branch git reset HEAD~1 --hard git checkout new-branch
लाइफसेवर सही!
एक अंतिम शब्द
git reset --hard करते समय सावधान रहें और विशेष रूप से प्रोडक्शन कोड में और जब आप अन्य डेवलपर्स के साथ काम कर रहे हों तो विशिष्ट कमिट पर रिवाइंड करते समय। अक्सर git revert इन परिवर्तनों को करने का सुरक्षित तरीका है। लेकिन यह दूसरी बार के लिए एक वार्तालाप है। तब तक!