मैंने अपनी प्रतिबद्धता को पूर्ववत करने की कोशिश की। क्या इसका उपयोग करना खतरनाक है git reset --hard HEAD~1
?
विभिन्न विकल्पों के बीच अंतर क्या है git reset
?
जवाबों:
git reset
पांच "मोड" को जानता है: नरम, मिश्रित, कठोर, मर्ज और रखना। मैं पहले तीन से शुरू करूंगा, क्योंकि ये वे तरीके हैं जिनसे आप आमतौर पर मुठभेड़ करेंगे। उसके बाद आपको एक अच्छा सा बोनस मिलेगा, इसलिए आप बने रहें।
उपयोग करते समय git reset --soft HEAD~1
आप वर्तमान शाखा से अंतिम प्रतिबद्ध हटा देंगे, लेकिन फ़ाइल परिवर्तन आपके काम के पेड़ में रहेंगे । इसके अलावा परिवर्तन आपके सूचकांक पर बने रहेंगे, इसलिए एक का पालन git commit
करने के साथ ही ठीक उसी परिवर्तन के साथ एक कमिट बना देगा जैसा कि पहले आपने "हटा" दिया था।
यह डिफ़ॉल्ट मोड है और नरम के समान है। जब git reset HEAD~1
आप के साथ एक "हटाने" अभी भी अपने काम के पेड़ में परिवर्तन रखेंगे, लेकिन सूचकांक पर नहीं; इसलिए यदि आप कमिट को "रिड्यूस" करना चाहते हैं, तो आपको आने से git add
पहले बदलाव ( ) जोड़ना होगा ।
जब git reset --hard HEAD~1
आप उपयोग करते हैं तो अंतिम प्रतिबद्ध में किए गए परिवर्तनों के अलावा सभी अनमैक्ड परिवर्तन खो देंगे । परिवर्तन आपके काम करने वाले पेड़ में नहीं रहेंगे इसलिए एक git status
कमांड करने से आपको पता चलेगा कि आपके पास अपने भंडार में कोई बदलाव नहीं है।
इस एक के साथ सावधानी से चलना। यदि आप अनजाने में हुए परिवर्तनों को हटा देते हैं, जिन्हें कभी ट्रैक नहीं किया गया था git
(बोलें: प्रतिबद्ध या कम से कम सूचकांक में जोड़ा गया), तो आपके पास उन्हें उपयोग करने का कोई तरीका नहीं है git
।
git reset --keep HEAD~1
एक दिलचस्प और उपयोगी है। यह केवल उन फाइलों को रीसेट करता है, जो करंट HEAD
और दिए गए कमिट के बीच भिन्न हैं। यदि इन फ़ाइलों में से किसी में भी परिवर्तन हुआ है, तो यह रीसेट को रोक देता है। यह मूल रूप से सुरक्षित संस्करण के रूप में कार्य करता है hard
।
यह मोड विशेष रूप से उपयोगी है जब आपके पास परिवर्तनों का एक गुच्छा होता है और इन परिवर्तनों को खोए बिना एक अलग शाखा में स्विच करना चाहते हैं - उदाहरण के लिए जब आपने गलत शाखा पर काम करना शुरू किया था।
आप इसके बारे में git रीसेट डॉक्यूमेंटेशन में अधिक पढ़ सकते हैं ।
नोट करते
समयgit reset
किसी कमिट को हटाने के लिए कमिट करना वास्तव में खो जाता है, तो इसका कोई सन्दर्भ नहीं होता है और न ही यह किसी बच्चे का है। आप अभी भी एक कमिट को पुनर्प्राप्त कर सकते हैं, जिसे git reset
SHA-1 कुंजी के साथ "हटा" दिया गया था , उदाहरण के लिए जैसे कि कमांड के साथ git reflog
।
--hard
लगभग कभी भी सही काम नहीं करते हैं, जैसा --keep
कि अधिक सुरक्षित है और जहां --hard
काम करता है उनमें से अधिकांश पर लागू होता है । अपनी उंगलियों का उपयोग करने के लिए प्रशिक्षण --keep
आपको बचा सकता है, एक दिन ...
keep
। ;)
Git रीसेट के 5 मुख्य मोड हैं: सॉफ्ट, मिक्स्ड, मर्ज, हार्ड, कीप । उनके बीच का अंतर हेड, स्टेज (इंडेक्स), वर्किंग डायरेक्टरी को बदलना या न बदलना है ।
Git रीसेट - हेड, इंडेक्स और वर्किंग डायरेक्टरी को बदल देगा।
Git रीसेट - soft केवल हेड को बदलेगा। अनुक्रमणिका, कार्यशील निर्देशिका में कोई परिवर्तन नहीं।
तो दूसरे शब्दों में, यदि आप अपनी प्रतिबद्धता को पूर्ववत करना चाहते हैं, तो - सॉफ्ट काफी अच्छा होना चाहिए। लेकिन इसके बाद भी आपके इंडेक्स और वर्किंग डायरेक्टरी में खराब कमिट से बदलाव होते रहते हैं। आप फ़ाइलों को संशोधित कर सकते हैं, उन्हें ठीक कर सकते हैं, उन्हें सूचकांक में जोड़ सकते हैं और फिर से प्रतिबद्ध कर सकते हैं।
- Thehard के साथ, आप पूरी तरह से अपनी परियोजना में एक साफ स्लेट प्राप्त करते हैं। मानो आखिरी कमिटमेंट से कोई बदलाव नहीं हुआ है। यदि आप सुनिश्चित हैं कि यह वही है जो आप चाहते हैं तो आगे बढ़ें। लेकिन एक बार जब आप ऐसा कर लेते हैं, तो आप अपनी अंतिम प्रतिबद्धता पूरी तरह से खो देंगे। (नोट: अभी भी खोए हुए कमिट को पुनर्प्राप्त करने के तरीके हैं)।
यह एक उपयोगी लेख है जो रीसेट कमांड के स्पष्टीकरण को रेखांकन से दिखाता है।
https://git-scm.com/docs/git-reset
Reset --hard काफी खतरनाक हो सकता है क्योंकि यह बिना जाँच के आपके काम की कॉपी को ओवरराइट कर देता है, इसलिए यदि आपने फ़ाइल को बिल्कुल भी कमिट नहीं किया है, तो वह चला गया है।
सोर्स ट्री के लिए, मेरे द्वारा पूर्ववत किए गए तरीके के बारे में कोई जानकारी नहीं है। यह वैसे भी कवर के तहत सबसे अधिक संभावना रीसेट का उपयोग करेगा
git reset --help
करूंगा कि पाँच मोड में काफी अच्छी तरह से (मेरी राय में) ओपी द्वारा पूछे गए कम से कम दो को कौन बताता है।
इस प्रयोग के बीच मुख्य अंतर है --hard रीसेट Git और Git रीसेट --soft:
--soft
इंडेक्स फाइल या वर्किंग ट्री को बिल्कुल भी नहीं छूता (लेकिन सभी मोड्स की तरह ही सिर को भी सेट करता है)। यह आपकी सभी परिवर्तित फ़ाइलों को "परिवर्तन किए जाने के लिए प्रतिबद्ध" छोड़ देता है, क्योंकि git स्टेटस इसे डाल देगा।
--hard
सूचकांक और काम करने वाले पेड़ को रीसेट करता है। कार्यशील ट्री में ट्रैक की गई फ़ाइलों में कोई भी परिवर्तन तब तक छोड़ दिया जाता है।