Git reset --mixed, --soft, और --hard के बीच क्या अंतर है?


740

मैं एक कमिट को विभाजित करने के लिए देख रहा हूं और निश्चित नहीं है कि कौन सा रीसेट विकल्प उपयोग करना है।

मैं पेज इन प्लेन इंग्लिश देख रहा था , "git reset" क्या करता है? , लेकिन मुझे एहसास हुआ कि मैं वास्तव में समझ नहीं पा रहा हूँ कि git index या स्टेजिंग क्षेत्र क्या है और इस प्रकार स्पष्टीकरण से कोई मदद नहीं मिली।

इसके अलावा, उपयोग के मामले --mixedऔर --softउस उत्तर में मेरे लिए समान दिखते हैं (जब आप ठीक करना चाहते हैं और पुनः प्राप्त करना चाहते हैं)। क्या कोई इसे और भी नीचे तोड़ सकता है? मुझे एहसास है --mixedकि शायद साथ जाने का विकल्प है, लेकिन मैं जानना चाहता हूं कि क्यों । अंत में, किस बारे में --hard?

क्या कोई मुझे एक वर्कफ़्लो उदाहरण दे सकता है कि 3 विकल्पों का चयन कैसे होगा?


1
मैं उस दूसरे प्रश्न पर अपने उत्तर को संपादित करने की कोशिश करूँगा और इसे थोड़ा और स्पष्ट करूँगा।
Cascabel

@mkarasek जवाब बहुत अच्छा है, लेकिन इस सवाल पर भी एक नज़र डालने में दिलचस्पी हो सकती है।
Brandizzi

3
आत्म करने के लिए नोट: सामान्य में , soft: stage everything, mixed: unstage everything, hard: ignore everythingप्रतिबद्ध अप करने के लिए मैं से रीसेट करने कर रहा हूँ।
user1164937


David Zychस्पष्ट विवरण के साथ एक और अच्छा लेख - davidzych.com/difference-between-git-reset-soft-mixed-and-hard
src3369

जवाबों:


1488

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

git resetपरिवर्तन, न्यूनतम पर, जहां वर्तमान शाखा ( HEAD) इंगित कर रही है। के बीच का अंतर --mixedऔर --softहै या नहीं, अपने सूचकांक भी संशोधित किया गया है है। इसलिए, यदि हम masterकमिट की इस श्रृंखला के साथ शाखा पर हैं :

- A - B - C (master)

HEADअंक Cऔर सूचकांक मेल खाते हैं C

जब हम चलाते हैं git reset --soft B, master(और इस प्रकार HEAD) अब इंगित करता है B, लेकिन सूचकांक में अभी भी परिवर्तन है C; git statusउन्हें मंचन के रूप में दिखाएगा। इसलिए यदि हम git commitइस बिंदु पर चलते हैं , तो हम उसी बदलाव के साथ एक नई प्रतिबद्धता प्राप्त करेंगे C


ठीक है, इसलिए यहां से फिर से शुरू करें:

- A - B - C (master)

अब करते हैं git reset --mixed B। (नोट: --mixedडिफ़ॉल्ट विकल्प है)। एक बार फिर, masterऔर HEADबी को इंगित करें, लेकिन इस बार सूचकांक को मैच के लिए भी संशोधित किया गया है B। यदि हम git commitइस बिंदु पर चलते हैं , तो इंडेक्स मैचों के बाद कुछ भी नहीं होगा HEAD। हमारे पास अभी भी वर्किंग डायरेक्टरी में बदलाव हैं, लेकिन चूंकि वे इंडेक्स में नहीं हैं, इसलिए git statusउन्हें अप्रतिबंधित दिखाया गया है। उन्हें करने के लिए, आप git addऔर फिर हमेशा की तरह प्रतिबद्ध होंगे ।


और अंत में, --hardएक ही रूप में है --mixed(यह अपने में परिवर्तन HEADऔर इंडेक्स), सिवाय इसके कि --hardयह भी अपने काम निर्देशिका संशोधित करता है। यदि हम पर हैं Cऔर चलाते हैं git reset --hard B, तो आपके द्वारा जोड़े गए परिवर्तनों के Cसाथ-साथ आपके द्वारा हटाए गए परिवर्तनों को भी हटा दिया जाएगा, और आपकी कार्यशील प्रतिलिपि की फ़ाइलें मिलान कर लेंगी B। चूंकि आप स्थायी रूप से इस तरह से बदलाव खो सकते हैं, इसलिए आपको हमेशा git statusयह सुनिश्चित करने के लिए एक हार्ड रीसेट करने से पहले दौड़ना चाहिए कि आपकी वर्किंग डायरेक्टरी साफ है या आप अपने अनकम्यूटेड बदलावों को खोने के साथ ठीक हैं।


और अंत में, एक दृश्य: यहां छवि विवरण दर्ज करें


44
दूसरे शब्दों में, --soft अंतिम प्रतिबद्ध को खारिज कर रहा है, -मिक्स अंतिम प्रतिबद्ध और जोड़ को त्याग रहा है, - भार अंतिम प्रतिबद्ध को छोड़ रहा है, और आपके द्वारा कोड पर किए गए किसी भी परिवर्तन को जोड़ रहा है जो कि git checkout HEAD
James Wang के

11
@eventualEntropy आप किसी भी प्रतिबद्ध परिवर्तन को फिर से शुरू कर सकते हैं ; अनचाहे बदलाव जो reset --hardहमेशा के लिए हटा दिए जाते हैं।
मकारसेक

2
@ रबर्ट न तो; --mixedआपके इंडेक्स को बदलता है, लेकिन आपकी वर्किंग डायरेक्टरी को नहीं।
mkarasek

3
उन लोगों के लिए मददगार हो सकता है, जो रंग के साथ टर्मिनल पर गिट का उपयोग करते हैं: 1.'िट रीसेट -सॉफ्ट ए 'और आप बी और सी के सामान को हरे रंग में देखेंगे (मंचन) 2.'जीट रीसेट - एमिक्सड ए' और आप करेंगे बी और सी के सामान को लाल (अस्थिर) में देखें। 3. रीसेट रीसेट - ए 'और आप अब बी और सी के परिवर्तन कहीं भी नहीं देखेंगे (ऐसा होगा जैसे वे कभी मौजूद नहीं थे)
टिम् खी

2
@ user1933930 1 और 3 आपको साथ छोड़ देगा - A - B - C′, जहां C (में C के समान परिवर्तन होते हैं (विभिन्न टाइमस्टैम्प और संभवतः प्रतिबद्ध संदेश)। 2 और 4 आपको साथ छोड़ देंगे - A - D, जहाँ D में B और C. के संयुक्त परिवर्तन होते हैं
maseasek

213

सबसे सरल शब्दों में:

  • --soft: अनचाहे परिवर्तन, परिवर्तन छोड़े गए हैं ( सूचकांक )।
  • --mixed (डिफ़ॉल्ट) : अस्वस्थता + अस्थिर परिवर्तन, परिवर्तन कार्यशील पेड़ में छोड़ दिए जाते हैं ।
  • --hard: अनस्टिमेट + अनस्टेज + परिवर्तन हटाएं , कुछ भी नहीं बचा।

8
सबसे अच्छा उत्तर क्योंकि उत्तर तकनीकी शब्दों का उपयोग करता है एक पूर्ण उत्तर प्रदान करने के लिए जो सबसे संक्षिप्त भी है
ट्रेवर बोयड स्मिथ

1
जब मैंने एक फ़ाइल (अप्रकाशित) की है और मेरे पास एक नई बनाई गई अनट्रैक फ़ाइल है, तो रीसेट रीसेट - क्या कुछ नहीं करता है? केवल जब मैं अनट्रैक फ़ाइल को चरणबद्ध करता हूं, तो वह इसे मेरी कार्यशील निर्देशिका से हटा देती है।
माइकल

1
@ निखिल क्या आप बता सकते हैं कि यह जवाब गलत कहां है?
नेड बाचेल्डर

1
@NedBatchelder बिंदु में से कोई भी सही नहीं है: जब तक इन आदेशों का उपयोग नहीं किया जाता है, तब तक असहजता कभी नहीं होती है।
निखिल

1
@ निखिल शायद आपका मतलब यह है कि मूल वचन अभी भी मौजूद है, जो सच है। लेकिन शाखा को बदल दिया गया है ताकि कमेटी शाखा का हिस्सा न रहे। क्या हम उस पर सहमत हैं?
नेड बैचेल्ड

69

कृपया ध्यान रखें, यह एक सरल स्पष्टीकरण है जो इस जटिल कार्यक्षमता को समझने के लिए पहले कदम के रूप में है।

दृश्य शिक्षार्थियों के लिए मददगार हो सकते हैं जो कल्पना करना चाहते हैं कि इन कमांडों में से प्रत्येक के बाद उनकी परियोजना की स्थिति क्या है:


जो लोग रंग के साथ टर्मिनल का उपयोग करते हैं उनके लिए (git config --global color.ui auto):

git reset --soft A और आप बी और सी के सामान को हरे रंग में देखेंगे (मंचन और प्रतिबद्ध करने के लिए तैयार)

git reset --mixed A(या git reset A) और आप बी और सी के सामान को लाल रंग में देखेंगे (मंचित और तैयार होने का मंचन किया गया है (हरा) और फिर प्रतिबद्ध)

git reset --hard A और आप अब कहीं भी B और C के परिवर्तन नहीं देखेंगे (ऐसा होगा मानो वे कभी अस्तित्व में नहीं हैं)


या 'टॉवर' या 'सोर्सट्री' जैसे GUI प्रोग्राम का उपयोग करने वालों के लिए

git reset --soft A और आप 'चरणबद्ध फाइल' क्षेत्र में B और C का सामान देखने के लिए तैयार होंगे

git reset --mixed A(या git reset A) और आप 'unstaged files' एरिया में B और C के सामान को स्टेज पर ले जाने के लिए तैयार होंगे और फिर प्रतिबद्ध किया जाएगा

git reset --hard A और आप अब कहीं भी B और C के परिवर्तन नहीं देखेंगे (ऐसा होगा मानो वे कभी अस्तित्व में नहीं हैं)


1
यह भ्रामक है, सबसे अच्छा: आपका जवाब पढ़ता है जैसे कि git resetकेवल git statusआउटपुट का रूप बदलता है ।
जुब।

3
मैं आपकी बात देखता हूं, लेकिन असहमत हूं क्योंकि एक दृश्य शिक्षार्थी के रूप में, 3 आदेशों का उपयोग करने के बाद मेरी परियोजना 'कैसी दिखती है' ने आखिरकार मुझे यह समझने में मदद की कि वे क्या कर रहे थे!
टिम्मक

मैंने इसे 'डमीज के लिए एक प्रकार का विचार' के रूप में देखा, जिससे लोगों को आसानी से पता चल सके कि वास्तव में क्या हो रहा है। क्या आप सोच सकते हैं कि इसे कैसे बेहतर बनाया जा सकता है ताकि भ्रामक न हो
timhc22

8
नहीं, हमें इस उत्तर को बदलने की आवश्यकता नहीं है। यह एक आसान "धोखा शीट" प्रदान करता है। इसके बारे में सोचो: नरम = हरा, मिश्रित = लाल, कठोर = कुछ नहीं (मतलब चला गया)! कितना आसान याद है! उन newbies के लिए जो यह भी नहीं समझते हैं कि उन रंगों का वास्तव में क्या मतलब है, वे गिट के बारे में बहुत कम जानते हैं, और वे वैसे भी सड़क पर कठिन सबक लेने जा रहे हैं, और यह @unegma की गलती नहीं है! BTW, मैं सिर्फ पिछले downvote का जवाब देने के लिए इस उत्तर को बढ़ाता हूं। अच्छी नौकरी, @ गुग्मा!
रायलू

5
यह आंतरिक पूरक को बेहतर ढंग से समझने के लिए एक महान पूरक सारांश के रूप में कार्य करता है जैसा कि मैंने उन्हें कहीं और पढ़ा। धन्यवाद!
स्पैस

24

सभी अन्य उत्तर महान हैं, लेकिन मैं इसे सबसे अच्छा नीचे तीन श्रेणियों में फ़ाइलों को तोड़ कर उन्हें समझने के लिए मिल: unstaged, staged, commit:

  • --hard समझने में आसान होना चाहिए, यह सब कुछ पुनर्स्थापित करता है
  • --mixed (डिफ़ॉल्ट) :
    1. unstagedफ़ाइलें: बदल नहीं है
    2. staged फ़ाइलें: स्थानांतरित करने के लिए unstaged
    3. commit फ़ाइलें: स्थानांतरित करने के लिए unstaged
  • --soft:
    1. unstagedफ़ाइलें: बदल नहीं है
    2. stagedफ़ाइलें: परिवर्तन नहीं है
    3. commit फ़ाइलें: स्थानांतरित करने के लिए staged

संक्षेप में:

  • --softविकल्प सब कुछ ( unstagedफ़ाइलों को छोड़कर ) में स्थानांतरित करेगाstaging area
  • --mixed विकल्प सब कुछ में स्थानांतरित हो जाएगा unstaged area

22

यहाँ कछुआ उपयोगकर्ताओं के लिए एक बुनियादी स्पष्टीकरण दिया गया है:

git reset --softऔर --mixedअपनी फ़ाइलों को अछूता छोड़ दें।

git reset --hardवास्तव में आपके द्वारा रीसेट किए गए कमिट से मिलान करने के लिए अपनी फ़ाइलों को बदलें

TortoiseGit में, अनुक्रमणिका की अवधारणा GUI द्वारा बहुत छिपी हुई है। जब आप किसी फ़ाइल को संशोधित करते हैं, तो आपको git addस्टेजिंग एरिया / इंडेक्स में परिवर्तन जोड़ने के लिए भागना नहीं पड़ता है । जब केवल मौजूदा फ़ाइलों में संशोधन के साथ काम कर रहे हैं जो फ़ाइल नाम नहीं बदल रहे हैं , git reset --softऔर --mixedवही हैं! यदि आपने नई फ़ाइलें या नामांकित फ़ाइलें जोड़ी हैं तो आपको केवल एक अंतर दिखाई देगा। इस स्थिति में, यदि आप git reset --mixed चलाते हैं, तो आपको अपनी फ़ाइल को नॉट वर्स्ड फ़ाइल सूची से फिर से जोड़ना होगा ।


यह उत्तर बहुत स्पष्ट है नरम और मिश्रित के बीच का अंतर। और यह बताते हुए भी खारिज कर दिया गया है। यह निम्नलिखित उत्तर उस पर अधिक स्पष्ट है। stackoverflow.com/questions/2530060/…
बार्लॉप

2
Github डेस्कटॉप का एक उपयोगकर्ता जो भी समान व्यवहार किया है, इस सवाल का जवाब मुझे कारण है कि मैं के बारे में उलझन में रखने के कुछ स्पष्टता देता है --mixedऔर --soft
चेन ली योंग

20

इन मामलों में मुझे एक दृश्य पसंद है जो उम्मीद कर सकता है कि यह समझा जाए:

git reset --[hard/mixed/soft] :

यहां छवि विवरण दर्ज करें

इसलिए प्रत्येक प्रभाव अलग-अलग स्कोप

  1. हार्ड => वर्कडिर + इंडेक्स + एचईएडी
  2. मिश्रित => सूचकांक + HEAD
  3. सॉफ्ट => केवल हेड (इंडेक्स और वर्किंग डीआईआर अपरिवर्तित)।

15

तीन तरह का अफसोस

बहुत सारे मौजूदा उत्तर वास्तविक प्रश्न का उत्तर नहीं देते हैं। वे इस बारे में हैं कि कमांड क्या करते हैं, इस बारे में नहीं कि आप (उपयोगकर्ता) क्या चाहते हैं - उपयोग का मामला । लेकिन ओपी ने इस बारे में पूछा!

यह वर्णन करने के लिए अधिक उपयोगी हो सकता है कि यह इस बात के संदर्भ में ठीक है कि जिस समय आप एक कमांड देते हैं, उस समय आपको पछतावा होता है git reset। मान लें कि हमारे पास यह है:

A - B - C - D <- HEAD

यहाँ कुछ संभव पछतावा है और उनके बारे में क्या करना है:

1. मुझे अफसोस है कि बी, सी और डी एक प्रतिबद्ध नहीं हैं।

git reset --soft A। मैं अब तुरंत कमिट कर सकता हूं और ए , एक के बाद से सभी बदलाव ।

2. मुझे अफसोस है कि बी, सी और डी दस कमिट नहीं हैं ।

git reset --mixed A। कमिट चले गए हैं और इंडेक्स ए पर वापस आ गया है, लेकिन कार्य क्षेत्र अभी भी वैसा ही दिखता है जैसा कि डी के बाद किया गया था। इसलिए अब मैं एक पूरे अलग-अलग ग्रुप में जोड़ सकता हूं।

3. मुझे खेद है कि इस शाखा पर बी, सी, और डी हुआ ; काश, मैं ए के बाद ब्रांच कर चुका होता और वे उस दूसरी ब्रांच पर होते।

एक नई शाखा बनाएं otherbranch, और फिर git reset --hard A। वर्तमान शाखा अब ए से समाप्त होती है, जिसमें से otherbranchस्टेमिंग होता है।

(निश्चित रूप से आप हार्ड रीसेट का उपयोग कर सकते हैं क्योंकि आप B, C और D की इच्छा कभी नहीं करते थे।)


5

आपको उन दोनों के बीच मतभेदों को याद रखने के लिए मजबूर नहीं होना पड़ेगा। सोचें कि आपने वास्तव में कैसा कमिटमेंट किया है।

1. कुछ बदलाव करें।

२.गत जोड़।

3.gc -m "मैंने कुछ किया"

सॉफ्ट, मिक्स्ड और हार्ड आपको 3 से 1 तक किए गए ऑपरेशन्स को छोड़ने में सक्षम बनाता है।

नरम "दिखावा" कभी नहीं देखा कि आपने "जीसी-एम" किया है।

मिश्रित "दिखावा" कभी नहीं देखा कि आपने "गिट ऐड" किया है।

हार्ड "दिखावा" कभी नहीं देखा कि आपने फ़ाइल परिवर्तन किए हैं।


4

इन तीनों विकल्पों में जाने से पहले 3 चीजों को समझना चाहिए।

1) इतिहास / हेड

2) स्टेज / इंडेक्स

3) कार्यशील निर्देशिका

रीसेट --soft: इतिहास बदल गया है, हेड बदल गया है, कार्य निर्देशिका नहीं बदली गई है।

रीसेट --mixed: इतिहास बदल गया, HEAD बदल गया, बिना डेटा के वर्किंग डायरेक्टरी बदल गई।

रीसेट -हार्ड: इतिहास बदल गया है, हेड बदल गया है, खोए हुए डेटा के साथ वर्किंग डायरेक्टरी को बदल दिया गया है।

Git --soft के साथ जाना हमेशा सुरक्षित होता है। एक को जटिल आवश्यकता में अन्य विकल्प का उपयोग करना चाहिए।


3

के बारे में गलत धारणा के साथ यहां कई उत्तर हैं git reset --soft। जबकि एक विशिष्ट स्थिति है जिसमें git reset --softकेवल HEAD(अलग सिर राज्य से शुरू) बदल जाएगा , आम तौर पर (और इच्छित उपयोग के लिए), यह उस शाखा संदर्भ को स्थानांतरित करता है जिसे आपने वर्तमान में चेक आउट किया है। यदि आप एक शाखा की जाँच नहीं करते हैं, तो निश्चित रूप से ऐसा नहीं कर सकते (इसलिए विशिष्ट स्थिति जहाँ git reset --softकेवल परिवर्तन होगा HEAD)।

मुझे यह सोचने का सबसे अच्छा तरीका लगता है git reset। आप बस नहीं जा रहे हैं HEAD( सब कुछ करता है ), आप शाखा रेफरी को भी स्थानांतरित कर रहे हैं , जैसे master। यही होता है जब आप चलाने के लिए इसी तरह की है git commit(के साथ-साथ वर्तमान शाखा चाल HEAD), बजाय बनाने (और में जाने) एक के अलावा नई प्रतिबद्ध, आप एक पर ले जाने के पहले करते हैं।

यह एक नई प्रतिबद्धता के अलावा किसी अन्य चीज के लिए resetएक शाखा को बदलने, नहीं बदलने का बिंदु है HEAD आप इसे प्रलेखन उदाहरण में देख सकते हैं:

एक कमेट को पूर्ववत करें, इसे एक विषय शाखा बनाएं

          $ git branch topic/wip     (1)
          $ git reset --hard HEAD~3  (2)
          $ git checkout topic/wip   (3)
  1. आपने कुछ कमिट किए हैं, लेकिन एहसास है कि वे "मास्टर" शाखा में होने के लिए समय से पहले थे। आप उन्हें विषय शाखा में चमकाना जारी रखना चाहते हैं, इसलिए वर्तमान HEAD से "विषय / wip" शाखा बनाएं।
  2. उन तीन आवागमन से छुटकारा पाने के लिए मास्टर शाखा को पुरस्कृत करें।
  3. "विषय / वाइप" शाखा पर जाएं और काम करते रहें।

आदेशों की इस श्रृंखला का क्या मतलब है? आप यहां एक शाखा को स्थानांतरित करना चाहते हैं master, इसलिए जब आप masterबाहर की जाँच कर चुके होते हैं, तो आप चलाते हैं git reset

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

अपनी शाखा बदलें

git reset --soft <ref>: निर्दिष्ट संदर्भ में, वर्तमान में जाँच की गई शाखा के लिए शाखा सूचक को रीसेट करता है <ref>। आपकी कार्यशील निर्देशिका और अनुक्रमणिका में फ़ाइलें परिवर्तित नहीं हैं। इस चरण से कमिटमेंट आपको वापस वहीं ले जाएगा जहां आप git resetकमांड से पहले थे ।

अपना सूचकांक भी बदलें

git reset --mixed <ref>

या समकक्ष

git reset <ref>:

क्या --softकरता है और निर्दिष्ट संदर्भ में कमिट को मैच के लिए इंडेक्स भी रीसेट करता है। जबकि git reset --soft HEADकुछ भी नहीं है (क्योंकि यह कहता है कि चेक आउट शाखा को चेक आउट शाखा में स्थानांतरित करें) git reset --mixed HEAD, या समकक्ष git reset HEAD, एक सामान्य और उपयोगी कमांड है क्योंकि यह सूचकांक को आपकी अंतिम प्रतिबद्ध की स्थिति में रीसेट करता है।

अपनी कार्यशील निर्देशिका भी बदलें

git reset --hard <ref>: क्या --mixedकरता है और आपकी कार्यशील निर्देशिका को भी अधिलेखित करता है । यह आदेश शाखा रेफरी के सभी रूपों कोgit checkout <ref> छोड़कर, (और यह महत्वपूर्ण बिंदु है reset) के समान हैgit resetHEAD को इंगित कर रहा है।

"इस तरह के और इस तरह के आदेश के बारे में एक नोट HEAD चलता है":

यह कहना उपयोगी नहीं है कि एक कमांड चलती है HEAD। कोई भी आदेश जो आपके प्रतिबद्ध इतिहास में है, को बदलता है HEAD। यह वह जगह HEAD है , जहाँ भी आप हैं, एक सूचक है। HEADतुम हो , और जब भी तुम ऐसा करोगे


2
"चलती शाखा रेफरी": अच्छी बात है। मुझे stackoverflow.com/a/5203843/6309 को अपडेट करना था ।
वॉन मार्क

1

3 विकल्पों का उपयोग किस संदर्भ में एक संक्षिप्त उत्तर है:

करने के लिए कोड में वर्तमान परिवर्तन रखना लेकिन पुनर्लेखन के लिए इतिहास के लिए प्रतिबद्ध:

  • soft: आप एक ही बार में सब कुछ कर सकते हैं और एक नए विवरण के साथ एक नई कमिट बना सकते हैं (यदि आप torotise git या किसी भी अन्य GUIs का उपयोग करते हैं, तो यह उपयोग करने के लिए एक है, क्योंकि आप अभी भी उन फ़ाइलों को टिक कर सकते हैं जिन्हें आप कमिट में चाहते हैं और कई बना सकते हैं विभिन्न फ़ाइलों के साथ इस तरह से किया जाता है। सॉर्सेट्री में सभी फ़ाइलों के लिए प्रतिबद्ध किया जाएगा।)
  • mixed: कमिट करने से पहले आपको व्यक्तिगत फ़ाइलों को फिर से इंडेक्स में जोड़ना होगा (Sourcetree में सभी बदली गई फाइलें अनस्ट्रेस्ड होंगी)

वास्तव में कोड में अपने बदलावों को खोने के लिए :

  • hard: आप केवल इतिहास को फिर से नहीं लिखते हैं, बल्कि आपके द्वारा रीसेट किए गए बिंदु तक आपके सभी परिवर्तन खो देते हैं

मैं इस मामले में नरम और मिश्रित नहीं हूं। अगर आपको कमिट करना है, तो क्या वापस किया गया था? क्या आप वापस लौट रहे हैं, या बदलावों की सिफारिश कर रहे हैं (इसलिए मूल स्थिति में वापस आ रहे हैं?)
जॉन लिटिल

परिवर्तनों की सिफारिश करना। कोई रिवर्स कमिट नहीं होगा।
निकिक

1

गिट रीसेट कमांड के विभिन्न विकल्पों के बीच बुनियादी अंतर नीचे दिए गए हैं।

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

1

--soft: बताता है कि एक और कमिट के लिए HEAD को रीसेट करना है, इसलिए इंडेक्स और वर्किंग डायरेक्टरी को किसी भी तरह से बदला नहीं जाएगा। सभी फाइलें मूल HEAD और कमिट के बीच बदल दी जाएंगी।

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

--hard: यह सब कुछ रीसेट करता है - यह HEAD को एक अन्य कमेटी में रीसेट करता है, इसे मिलान करने के लिए इंडेक्स को रीसेट करता है, और साथ ही साथ मिलान करने के लिए वर्किंग डायरेक्टरी को रीसेट करता है।

के बीच मुख्य अंतर है --mixedऔर --softक्या आपके सूचकांक को भी संशोधित किया गया है या नहीं। इसके बारे में यहां और देखें


0

mkarasek का उत्तर महान है, सरल शब्दों में हम कह सकते हैं ...

  • git reset --soft: HEADइच्छित उद्देश्य के लिए सेट करें, लेकिन अंतिम बदलावों से अपने परिवर्तनों को व्यवस्थित रखें
  • git reset --mixed: यह वैसा ही है, git reset --softलेकिन एकमात्र अंतर यह है कि पिछले कमिट्स से आपके बदलावों को चरणबद्ध किया जा सकता है
  • git reset --hard: अपने HEADद्वारा निर्धारित प्रतिबद्ध पर अपने सेट करें और पिछले प्रतिबद्ध से अपने सभी परिवर्तनों को रीसेट करें जिसमें संयुक्त राष्ट्र प्रतिबद्ध परिवर्तन भी शामिल है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.