'Git reset --hard HEAD ~ 1' और 'git reset --soft HEAD ~ 1' में क्या अंतर है?


87

मैंने अपनी प्रतिबद्धता को पूर्ववत करने की कोशिश की। क्या इसका उपयोग करना खतरनाक है git reset --hard HEAD~1?

विभिन्न विकल्पों के बीच अंतर क्या है git reset?


जवाबों:


184

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 resetSHA-1 कुंजी के साथ "हटा" दिया गया था , उदाहरण के लिए जैसे कि कमांड के साथ git reflog


1
मैं असहमत हूं कि ये 3 ऐसे हैं जिनका हमें आमतौर पर उपयोग करना चाहिए। वे 3 हैं जो पहले उपलब्ध थे इसलिए लोग इन 3 के बारे में अधिक बात करते हैं, लेकिन --hardलगभग कभी भी सही काम नहीं करते हैं, जैसा --keepकि अधिक सुरक्षित है और जहां --hardकाम करता है उनमें से अधिकांश पर लागू होता है । अपनी उंगलियों का उपयोग करने के लिए प्रशिक्षण --keepआपको बचा सकता है, एक दिन ...
मैथ्यू मोय

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

थोड़ा और विवरण जोड़ने के लिए, git रीसेट के बाद --soft HEAD ~ 1, git कमिट --reuse-message = HEAD @ {1} का उपयोग करके संरक्षित पुराने इंडेक्स के साथ आखिरी कमेंट का पुनः उपयोग करने के लिए जैसा कि यहां दिखाया गया है stackoverflow.com/a/ 25930432/2883282
englealuze

3
@ मैथ्यू मेमोय, तीन साल लेट लेकिन मैंने एक सेक्शन जोड़ा keep। ;)
साशा वुल्फ

मैं अंतिम प्रतिबद्ध कैसे कर सकता हूं? कृपया मदद करे। अगर मैं git रीसेट का उपयोग करता हूं --soft HEAD ~ 1 मुझे प्राप्त होता है: घातक: अस्पष्ट तर्क 'HEAD ~ 1': अज्ञात संशोधन या पथ काम करने वाले पेड़ में नहीं। संशोधनों से पथों को अलग करने के लिए '-' का प्रयोग करें, जैसे: 'git <command> [<revision> ...] - [[<file> ...]'
elvis

8

Git रीसेट के 5 मुख्य मोड हैं: सॉफ्ट, मिक्स्ड, मर्ज, हार्ड, कीप । उनके बीच का अंतर हेड, स्टेज (इंडेक्स), वर्किंग डायरेक्टरी को बदलना या न बदलना है ।

Git रीसेट - हेड, इंडेक्स और वर्किंग डायरेक्टरी को बदल देगा।
Git रीसेट - soft केवल हेड को बदलेगा। अनुक्रमणिका, कार्यशील निर्देशिका में कोई परिवर्तन नहीं।

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

- Thehard के साथ, आप पूरी तरह से अपनी परियोजना में एक साफ स्लेट प्राप्त करते हैं। मानो आखिरी कमिटमेंट से कोई बदलाव नहीं हुआ है। यदि आप सुनिश्चित हैं कि यह वही है जो आप चाहते हैं तो आगे बढ़ें। लेकिन एक बार जब आप ऐसा कर लेते हैं, तो आप अपनी अंतिम प्रतिबद्धता पूरी तरह से खो देंगे। (नोट: अभी भी खोए हुए कमिट को पुनर्प्राप्त करने के तरीके हैं)।


5

यह एक उपयोगी लेख है जो रीसेट कमांड के स्पष्टीकरण को रेखांकन से दिखाता है।

https://git-scm.com/docs/git-reset

Reset --hard काफी खतरनाक हो सकता है क्योंकि यह बिना जाँच के आपके काम की कॉपी को ओवरराइट कर देता है, इसलिए यदि आपने फ़ाइल को बिल्कुल भी कमिट नहीं किया है, तो वह चला गया है।

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


आधिकारिक दस्तावेज के लिंक के लिए +1। मैं यह भी उल्लेख git reset --helpकरूंगा कि पाँच मोड में काफी अच्छी तरह से (मेरी राय में) ओपी द्वारा पूछे गए कम से कम दो को कौन बताता है।
थैंक्स फोर।फिश

1
लिंक टूट गया है। संभवतः यह वर्तमान संस्करण है: git-scm.com/docs/git-reset
Kiki Jewell

1

इस प्रयोग के बीच मुख्य अंतर है --hard रीसेट Git और Git रीसेट --soft:

--soft

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

--hard

सूचकांक और काम करने वाले पेड़ को रीसेट करता है। कार्यशील ट्री में ट्रैक की गई फ़ाइलों में कोई भी परिवर्तन तब तक छोड़ दिया जाता है।


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