सादे अंग्रेजी में, "गिट रीसेट" क्या करता है?


674

मैंने दिलचस्प पोस्ट देखी हैं जो सूक्ष्मता के बारे में बता रही हैं git reset

दुर्भाग्य से, जितना अधिक मैं इसके बारे में पढ़ता हूं, उतना ही यह प्रतीत होता है कि मैं इसे पूरी तरह से नहीं समझता हूं। मैं एक SVN बैकग्राउंड से आता हूं और Git एक नया प्रतिमान है। मुझे आसानी से मर्क्यूरियल मिल गया, लेकिन गिट ज्यादा तकनीकी है।

मुझे लगता git resetहै कि यह करीब है hg revert, लेकिन ऐसा लगता है कि मतभेद हैं।

तो वास्तव में क्या करता git resetहै? कृपया इसके बारे में विस्तृत विवरण शामिल करें:

  • विकल्प --hard, --softऔर --merge;
  • इस HEADतरह के रूप में HEAD^और के साथ आप का उपयोग अजीब संकेतन HEAD~1;
  • ठोस उपयोग के मामले और काम प्रवाह;
  • कार्यशील प्रति HEADऔर आपके वैश्विक तनाव के स्तर पर परिणाम ।

17
मुझे लगता है कि आम दृश्य कमांड का उपयोग करते समय जो होता है उसमें एक विज़ुअल गिट संदर्भ अच्छी जानकारी देता है।

जवाबों:


992

सामान्य तौर पर, git resetफ़ंक्शन को वर्तमान शाखा को लेना है और इसे कहीं और इंगित करने के लिए रीसेट करना है, और संभवतः सूचकांक और काम के पेड़ को साथ लाना है। अधिक संक्षिप्त रूप से, यदि आपकी मास्टर शाखा (वर्तमान में जाँच की जा चुकी है) इस प्रकार है:

- A - B - C (HEAD, master)

और आपको पता चलता है कि आप मास्टर को B को इंगित करना चाहते हैं, C को नहीं, आप git reset Bइसे वहां स्थानांतरित करने के लिए उपयोग करेंगे :

- A - B (HEAD, master)      # - C is still here, but there's no branch pointing to it anymore

पाचन: यह एक चेकआउट से अलग है। यदि आप दौड़ेंगे git checkout B, तो आपको यह मिलेगा:

- A - B (HEAD) - C (master)

आप एक अलग राज्य में समाप्त हो गए हैं। HEAD, काम के पेड़, सूचकांक सभी मैच B, लेकिन मास्टर शाखा को पीछे छोड़ दिया गया था C। यदि आप Dइस बिंदु पर एक नई प्रतिबद्धता बनाते हैं , तो आपको यह मिल जाएगा, जो कि शायद आप नहीं चाहते हैं:

- A - B - C (master)
       \
        D (HEAD)

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

बक्सों का इस्तेमाल करें

मैं git resetअगले अनुभाग में विभिन्न विकल्पों के अपने विवरण के भीतर मुख्य उपयोग के कई मामलों को कवर करता हूं । यह वास्तव में चीजों की एक विस्तृत विविधता के लिए इस्तेमाल किया जा सकता है; सामान्य धागा यह है कि सभी में किसी दिए गए वचन को इंगित / मिलान करने के लिए शाखा, सूचकांक और / या कार्य ट्री को रीसेट करना शामिल है।

ध्यान रखने योग्य बातें

  • --hardआप वास्तव में काम खो सकते हैं। यह आपके काम के पेड़ को संशोधित करता है।

  • git reset [options] commitआप के कारण कर सकते हैं (की तरह) कमिट्स खो देते हैं। ऊपर के खिलौने के उदाहरण में, हमने कमिट किया C। यह अभी भी रेपो में है, और आप इसे देख सकते हैं git reflog show HEADया इसे देख सकते हैं git reflog show master, लेकिन यह वास्तव में किसी भी शाखा से सुलभ नहीं है।

  • Git 30 दिनों के बाद स्थायी रूप से ऐसे कमिट्स को हटा देता है, लेकिन तब तक आप C को फिर से ( git checkout C; git branch <new branch name>) पर इंगित करके पुनर्प्राप्त कर सकते हैं ।

तर्क

मैन पेज को पैराफ्रेस करते हुए, सबसे आम उपयोग फॉर्म का है git reset [<commit>] [paths...], जो दिए गए कमिट से उनके राज्य के लिए दिए गए रास्तों को रीसेट करेगा। यदि पथ प्रदान नहीं किए गए हैं, तो संपूर्ण पेड़ रीसेट हो जाता है, और यदि वचनबद्धता प्रदान नहीं की जाती है, तो इसे HEAD (वर्तमान प्रतिबद्ध) किया जाता है। यह git कमांड्स में एक सामान्य पैटर्न है (उदाहरण के लिए चेकआउट, अंतर, लॉग, हालांकि सटीक शब्दार्थ भिन्न होता है), इसलिए यह बहुत आश्चर्यजनक नहीं होना चाहिए।

उदाहरण के लिए, git reset other-branch path/to/fooअन्य राज्य-शाखा में पथ / / से अपने राज्य के लिए सब कुछ रीसेट करता है git reset -- ., HEAD में अपने राज्य में वर्तमान निर्देशिका को रीसेट करता है, और HEAD में अपने राज्य को git resetसब कुछ रीसेट करता है।

मुख्य कार्य पेड़ और सूचकांक विकल्प

रीसेट के दौरान आपके काम के पेड़ और सूचकांक के साथ क्या होता है, इसे नियंत्रित करने के लिए चार मुख्य विकल्प हैं।

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

  • --hardआपके द्वारा रीसेट किए गए कमिट से सब कुछ मेल खाता है। यह समझना सबसे आसान है, शायद। आपके सभी स्थानीय परिवर्तन स्पष्ट हो जाते हैं। एक प्राथमिक उपयोग आपके काम को दूर कर रहा है, लेकिन स्विच नहीं कर रहा है: git reset --hardइसका मतलब है git reset --hard HEADकि शाखा को न बदलें, लेकिन सभी स्थानीय परिवर्तनों से छुटकारा पाएं। दूसरा बस एक स्थान से दूसरे स्थान पर एक शाखा को स्थानांतरित कर रहा है, और अनुक्रमणिका / कार्य ट्री को सिंक में रख रहा है। यह वह है जो वास्तव में आपको काम खो सकता है, क्योंकि यह आपके काम के पेड़ को संशोधित करता है। बहुत सुनिश्चित करें कि आप किसी भी कार्य को चलाने से पहले स्थानीय काम को दूर फेंकना चाहते हैं reset --hard

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

  • --softअनुक्रमणिका या कार्य ट्री को स्पर्श नहीं करता है । आपकी सभी फाइलें --mixedउसी तरह बरकरार हैं , लेकिन सभी परिवर्तन changes to be committedजीआईटी की स्थिति के साथ दिखाई देते हैं (यानी कमिट करने की तैयारी में जाँच की गई)। इसका उपयोग तब करें जब आपको एहसास हो कि आपने कुछ बुरे काम किए हैं, लेकिन काम के सभी अच्छे - आपको बस इतना करना है कि इसे अलग तरीके से फिर से समझें। सूचकांक अछूता है, इसलिए यदि आप चाहते हैं तो आप तुरंत प्रतिबद्ध कर सकते हैं - परिणामी प्रतिबद्ध में वही सब सामग्री होगी जहां आप रीसेट करने से पहले थे।

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

    अधिक ठोस होने के लिए, मान लीजिए कि आपने ए और बी फ़ाइलों को संशोधित किया है, और आप एक शाखा में विलय करने का प्रयास करते हैं, जो सी और डी को संशोधित करती है। मर्ज किसी कारण से विफल हो जाता है, और आप इसे निरस्त करने का निर्णय लेते हैं। आप उपयोग करें git reset --merge। यह सी और डी को वापस लाता है कि वे कैसे थे HEAD, लेकिन अपने संशोधनों को ए और बी को अकेले छोड़ देते हैं, क्योंकि वे प्रयास के विलय का हिस्सा नहीं थे।

अधिक जानना चाहते हैं?

मुझे लगता man git resetहै कि यह वास्तव में इसके लिए काफी अच्छा है - शायद आपको उस तरीके की थोड़ी समझ की आवश्यकता है, क्योंकि उनके लिए वास्तव में सिंक करने के लिए गिट काम करता है। विशेष रूप से, यदि आप उन्हें ध्यान से पढ़ने के लिए समय लेते हैं, तो वे सारणियाँ सभी विभिन्न विकल्पों और मामलों के लिए अनुक्रमणिका और कार्य ट्री में फ़ाइलों की स्थिति का विवरण देती हैं। (लेकिन हाँ, वे बहुत घने हैं - वे बहुत ही संक्षिप्त रूप में उपरोक्त जानकारी का एक बहुत कुछ बता रहे हैं।)

अजीब संकेतन

"अजीब संकेतन" ( HEAD^और HEAD~1) जो आप उल्लेख करते हैं, वह कमिट निर्दिष्ट करने के लिए एक आशुलिपि है, जैसे हैश नाम का उपयोग किए बिना 3ebe3f6। यह पूरी तरह से उदाहरण और संबंधित वाक्यविन्यास के साथ git-rev-parse के लिए आदमी पृष्ठ के "निर्दिष्ट संशोधनों" अनुभाग में प्रलेखित है । कैरेट और टिल्ड वास्तव में अलग-अलग चीजों का मतलब है :

  • HEAD~के लिए छोटा है HEAD~1और इसका मतलब है कि पहला माता-पिता। HEAD~2का मतलब है कमिटमेंट का पहला पैरेंट का पहला पैरेंट। HEAD~n"हेड से पहले एन कमिट्स" या "हेड की एनटी पीढ़ी पूर्वज" के रूप में सोचें ।
  • HEAD^(या HEAD^1) का अर्थ कमिट का पहला अभिभावक भी है। HEAD^2का मतलब है कि कमिट का दूसरा माता-पिता। याद रखें, एक सामान्य मर्ज कमिट में दो माता-पिता होते हैं - पहला माता-पिता मर्ज-कमिट होता है, और दूसरा माता-पिता वह मर्ज होता है जो मर्ज किया गया था। सामान्य तौर पर, विलय में वास्तव में कई माता-पिता (ऑक्टोपस विलय) हो सकते हैं।
  • ^और ~ऑपरेटरों एक साथ बांधा जा सकता है, के रूप में HEAD~3^2, की तीसरी पीढ़ी के पूर्वज के दूसरे माता पिता HEAD, HEAD^^2के पहले माता-पिता की दूसरी माता पिता HEAD, या यहाँ तक HEAD^^^है, जो के बराबर है HEAD~3

देखभाल और टिल्डे


"आप इसे वहां स्थानांतरित करने के लिए गिट रीसेट का उपयोग करेंगे।" आप ऐसा करने के लिए git चेकआउट का उपयोग क्यों नहीं करते?
ई-सिटिस

5
@ ई-सतीस: git चेकआउट HEAD को स्थानांतरित करेगा, लेकिन उस शाखा को छोड़ दें जहां यह था। यह तब है जब आप शाखा को स्थानांतरित करना चाहते हैं।
कैस्केबेल

तो अगर मैं अच्छी तरह से समझता हूं, तो रीसेट बी क्या करेगा: - ए - बी - सी - बी (मास्टर) जबकि चेकआउट बी करेगा - ए - बी (मास्टर)?
ई-सतीस

32
डॉक्स अच्छे हैं, भले ही उन्हें पढ़ने में हमेशा के लिए लग जाता है और वे बहुत घने हैं और यह पुष्टि करने के लिए हमेशा के लिए लेता है कि वे कहते हैं कि यह काम करता है जैसे आप पहले से जानते हैं कि यह कैसे काम करता है। लगता है कि डॉक्स मेरे लिए अच्छे नहीं हैं ...
किर्बी

4
Stackoverflow.com/questions/3528245/whats-the-difference-between-git-reset-mixed-soft-and-hard: एक बहुत सरल और समझने योग्य स्पष्टीकरण इस अतः जवाब द्वारा दिया जाता है
नितिन बंसल

80

याद रखें कि gitआपके पास:

  • HEADसूचक है, जो तुम क्या आप पर काम कर रहे प्रतिबद्ध बताता है
  • काम कर पेड़ है, जो आपके सिस्टम पर फ़ाइलों के राज्य का प्रतिनिधित्व
  • मचान क्षेत्र (भी बुलाया सूचकांक ) है, जो "चरणों" इतना बदल जाता है कि वे बाद में एक साथ प्रतिबद्ध किया जा सकता है

कृपया इसके बारे में विस्तृत विवरण शामिल करें:

--hard, --softऔर --merge;

खतरनाक-नेस के बढ़ते क्रम में:

  • --softचाल HEADलेकिन मंचन क्षेत्र या काम करने वाले पेड़ को नहीं छूता है।
  • --mixedHEADमंचन क्षेत्र को स्थानांतरित करता है और अद्यतन करता है, लेकिन कार्यशील पेड़ नहीं।
  • --mergeचाल HEAD, मंचन क्षेत्र को रीसेट करता है, और अपने कामकाजी पेड़ में सभी परिवर्तनों को नए कार्यशील पेड़ में स्थानांतरित करने की कोशिश करता है।
  • --hardचाल HEAD और अपने मंचन क्षेत्र को समायोजित करता है और नए काम करने के लिए पेड़ HEAD, सब कुछ फेंक देता है।

ठोस उपयोग के मामले और वर्कफ़्लोज़;

  • --softजब आप "अपनी जगह खोए बिना" एक और कमिट और पैच अप करना चाहते हैं, तब उपयोग करें । यह बहुत दुर्लभ है कि आपको इसकी आवश्यकता है।

-

# git reset --soft example
touch foo                            // Add a file, make some changes.
git add foo                          // 
git commit -m "bad commit message"   // Commit... D'oh, that was a mistake!
git reset --soft HEAD^               // Go back one commit and fix things.
git commit -m "good commit"          // There, now it's right.

-

  • उपयोग करें --mixed(जो कि डिफ़ॉल्ट है) जब आप यह देखना चाहते हैं कि चीजें किसी अन्य प्रतिबद्ध पर क्या दिखती हैं, लेकिन आप पहले से मौजूद किसी भी बदलाव को नहीं खोना चाहते हैं।

  • --mergeजब आप किसी नए स्थान पर जाना चाहते हैं, तो उपयोग करें लेकिन उन परिवर्तनों को शामिल करें जो आपके पास पहले से ही हैं।

  • --hardसब कुछ मिटा देने के लिए उपयोग करें और नए कमिट में एक नया स्लेट शुरू करें।


2
इसके लिए इच्छित उपयोग का मामला नहीं है reset --merge। यह तीन-तरफ़ा मर्ज नहीं करता है। डॉक्स में वर्णित के अनुसार यह वास्तव में केवल विवादित विलय से बाहर निकलने के लिए है। आप checkout --mergeवह काम करना चाहते हैं जिसके बारे में आप बात कर रहे हैं। यदि आप शाखा को आगे बढ़ाना चाहते हैं, तो मुझे लगता है कि एकमात्र तरीका कुछ चेकआउट / रीसेट के साथ पालन करना है।
कास्केबेल

@Jefromi »हाँ, मैंने यह बहुत अच्छी तरह से वाक्यांश नहीं किया है। एक नए स्थान पर "मेरा मतलब है" एक नया स्थान है जहां आपके पास विवादित मर्ज नहीं है "।
जॉन फेमिनाला

1
ओह समझा। मुझे लगता है कि यहाँ महत्वपूर्ण बात यह है कि जब तक आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं, तब तक आप शायद कभी reset --mergeभी (डिफ़ॉल्ट) के अलावा किसी भी लक्ष्य के साथ उपयोग नहीं करना चाहते हैं HEAD, क्योंकि एक विवादित मर्ज को खत्म करने के अलावा, यह दूर फेंकने के लिए है। ऐसी जानकारी जिसे आप अन्यथा सहेज सकते हैं।
कैस्केबेल

2
मुझे यह उत्तर सबसे सरल और सबसे ज्यादा मददगार लगा
Jazzepi

कृपया इन आदेशों के बारे में जानकारी जोड़ें: git resetऔर git reset -- .
फ्लिम्प

35

ब्लॉग प्रो Git में डीमैस्टीफाई किया गया पोस्ट रीसेट और पर बहुत नो-ब्रेनर स्पष्टीकरण देता है ।git resetgit checkout

उस पोस्ट के शीर्ष पर सभी सहायक चर्चा के बाद, लेखक नियमों को निम्न सरल तीन चरणों में कम करता है:

वह मूल रूप से यह है। resetआदेश, एक विशेष क्रम में इन तीन पेड़ अधिलेखित कर देता है रोक जब आप इसे करने के लिए बताओ।

  1. जो भी शाखा इंगित करे उसे स्थानांतरित करें (रुकें यदि --soft)
  2. फिर, सूचकांक को इस तरह देखो (जब तक यहाँ बंद करो --hard)
  3. फिर, कार्य निर्देशिका को वैसा ही बना दें

विकल्प --mergeऔर --keepविकल्प भी हैं, लेकिन मैं अभी के लिए चीजों को सरल रखना चाहता हूं - जो कि एक अन्य लेख के लिए होगा।


25

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

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

लेकिन अचानक हमें पता चला कि हमारे पास एक अतिरिक्त फाइल है, जिसे हमने इंडेक्स में जोड़ा है, git रिपॉजिटरी में पुश करने की आवश्यकता नहीं है। इसका मतलब है कि हम उस फाइल को इंडेक्स में नहीं चाहते हैं। अब सवाल यह है कि git index से उस फाइल को कैसे हटाया जाए, क्योंकि हमने git ऐड का इस्तेमाल इंडेक्स में डालने के लिए किया था और git rm का उपयोग करना तर्कसंगत होगा ? गलत! git rm केवल फाइल को डिलीट करेगा और डिलीट को इंडेक्स में जोड़ेगा। तो अब क्या करना है:

उपयोग:-

गिट रीसेट

यह आपकी अनुक्रमणिका को साफ़ करता है, आपकी कार्यशील निर्देशिका को अछूता छोड़ देता है। (बस सब कुछ अस्थिर)।

यह इसके साथ विकल्पों की संख्या के साथ इस्तेमाल किया जा सकता है। Git रीसेट के साथ उपयोग करने के तीन मुख्य विकल्प हैं : --हार्ड, --soft और --mixed । जब आप रीसेट करते हैं तो ये HEAD पॉइंटर के अलावा रीसेट को प्रभावित करते हैं।

सबसे पहले, --hard फिर सेट करता है सब कुछ। आपकी वर्तमान निर्देशिका बिल्कुल वैसी ही होगी जैसी आप उस शाखा का अनुसरण करते हुए पूरी करते हैं। वर्किंग डायरेक्टरी और इंडेक्स को उस कमिट में बदल दिया जाता है। यह वह संस्करण है जिसका मैं अक्सर उपयोग करता हूं। git reset --hard svn revert जैसा कुछ है ।

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

अंत में, - प्रत्यय इंडेक्स को रीसेट करता है, लेकिन काम करने वाले पेड़ को नहीं। इसलिए बदलाव अभी भी बाकी हैं, लेकिन "अस्थिर" हैं और इसके लिए git add'ed या git कमिट -a होना आवश्यक है । हम कभी-कभी इसका उपयोग करते हैं यदि हम जितने कमिट -ए के साथ करते हैं, उससे अधिक प्रतिबद्ध हैं, तो हम जीआईटी रीसेट के साथ कमिट को वापस कर सकते हैं --mixed, उन चीजों को जोड़ सकते हैं जिन्हें हम कमिट करना चाहते हैं और बस उन्हें कमिट करते हैं।

Git रिवर्ट और git रिसेट के बीच अंतर : -


सरल शब्दों में, Git रीसेट के लिए एक आदेश है "ठीक-uncommited गलतियों" और Git पूर्ववत करने के लिए एक कमांड है "ठीक-प्रतिबद्ध गलती"

इसका अर्थ है कि यदि हमने कुछ बदलाव में कुछ त्रुटि की है और उसी को git repo में धकेल दिया है, तो git revert इसका समाधान है। और अगर हम पुश / कमिट करने से पहले एक ही त्रुटि की पहचान कर लेते हैं, तो हम समस्या को ठीक करने के लिए git रीसेट का उपयोग कर सकते हैं ।

मुझे उम्मीद है कि यह आपको अपने भ्रम से छुटकारा पाने में मदद करेगा।


2
यह ओपी द्वारा पूछा गया एक अच्छा सादा अंग्रेजी उत्तर है।
13

1
हालांकि मुझे लगता है कि आपके जवाब में याद किया जा सकता है। git reset HEADडिफ़ॉल्ट रूप से क्या है ? --hard, --softया --mixed? महान जवाब btw।
जिआनीस क्रिस्तोफिस

1
शानदार उत्तर, लेकिन मैं यह स्पष्ट कर git reset --hardदूंगा कि आप कुछ डेटा खो देंगे। और एक ऐसा बिंदु है जो गलत हो सकता है (हालांकि मैं 100% निश्चित नहीं हूं ... अभी भी सीख रहा हूं!): --mixedआप के बारे में बात करते हुए कहते हैं कि "हम इसका उपयोग कभी-कभी करते हैं यदि हम जितने प्रतिबद्ध हैं, हम उससे अधिक प्रतिबद्ध हैं।" क्या आपका मतलब था: "अगर हम हमारे साथ मतलब से ज्यादा का मंचन करते हैं git stage ."? यदि आप वास्तव में इसे प्रतिबद्ध करते हैं, तो मुझे लगता है कि यह बहुत देर हो चुकी है (जैसा कि आप अंत में कहते हैं, गिट रीसेट "फिक्स-अनकम्फर्ड गलतियों" के लिए एक कमांड है)
फैबियो का कहना है कि

6

टी एल; डॉ

git resetअंतिम चरण के लिए स्टेजिंग को रीसेट करता है। --hardअपने वर्किंग डायरेक्टरी में फाइलों को आखिरी कमिट पर रीसेट करने के लिए भी उपयोग करें ।

लंबा संस्करण

लेकिन यह स्पष्ट रूप से सरलीकृत है इसलिए कई बल्कि उत्तर देते हैं। इसने मेरे लिए और अधिक git resetबदलावों के संदर्भ में पढ़ना शुरू कर दिया । जैसे यह देखें:

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

से https://www.atlassian.com/git/tutorials/undoing-changes/git-reset

और इस

प्रतिबद्ध-स्तर पर, एक शाखा की नोक को एक अलग प्रतिबद्ध में स्थानांतरित करने का एक तरीका है। इसका उपयोग करंट ब्रांच से कमिट्स को हटाने के लिए किया जा सकता है।

से https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting/commit-level-operations


2

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

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


जो लोग रंग के साथ टर्मिनल का उपयोग करते हैं उनके लिए (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

चेकआउट एक विशिष्ट प्रतिबद्ध पर सिर को इंगित करता है।

रीसेट एक विशिष्ट प्रतिबद्ध पर एक शाखा इंगित करता है। (एक शाखा एक कमिट के लिए एक संकेतक है।)

संयोग से, यदि आपका सिर एक कमिट की ओर इशारा नहीं करता है जो एक शाखा द्वारा इंगित किया गया है, तो आपके पास एक अलग सिर है। (गलत निकला ... टिप्पणियां देखें ...)


1
नहीं nitpick करने के लिए है, लेकिन (हाँ, वास्तव में यह है nitpicking लेकिन चलो पूरा करने के लिए इसे जोड़ने के) अपने 3 वाक्य तकनीकी रूप से गलत है। मान लीजिए कि आपका HEAD शाखा B की ओर इशारा कर रहा है जो कि abc123 करने के लिए इशारा कर रहा है। यदि आप अब abc123 को चेकआउट करते हैं, तो आपकी HEAD और शाखा B दोनों abc123 को इंगित कर रहे हैं और आपका HEAD अलग है। इस बिंदु पर प्रतिबद्ध होने से शाखा B की स्थिति अपडेट नहीं होगी । आप कह सकते हैं "यदि आपका सिर एक शाखा की ओर इशारा नहीं करता है तो आपके पास एक अलग सिर है"
रोमेनवलेरी

@RomainValeri उस परिस्थिति में क्या करेंगे?
इयान वारबर्टन 16

1
कमिट करना उन कमिटों का निर्माण करेगा, जिन्हें किसी भी शाखा द्वारा संदर्भित नहीं किया गया है, और शाखा बी आपके द्वारा कई बार किए जाने के बाद भी उसी प्रतिबद्ध एबीसी123 को इंगित करता रहेगा। तात्पर्य यह है कि ये कमिट कचरा संग्रहण के लिए उम्मीदवार बन जाएंगे जब एचआईएडी इस 'वाइल्ड' श्रृंखला की अंतिम प्रतिबद्धताओं की ओर इशारा करता है।
रोमेनवेलरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.