जवाबों:
इन तीन आदेशों का पूरी तरह से अलग उद्देश्य है। वे भी दूर के समान नहीं हैं।
git revertयह आदेश एक नई प्रतिबद्ध बनाता है जो पिछले प्रतिबद्ध से परिवर्तनों को पूर्ववत करता है। यह कमांड प्रोजेक्ट में नया इतिहास जोड़ता है (यह मौजूदा इतिहास को संशोधित नहीं करता है)।
git checkoutयह कमांड रिपॉजिटरी से सामग्री को चेक-आउट करता है और आपके काम के पेड़ में डालता है। इसका अन्य प्रभाव भी हो सकता है, यह इस बात पर निर्भर करता है कि कमांड को कैसे लागू किया गया था। उदाहरण के लिए, यह भी बदल सकता है कि आप वर्तमान में किस शाखा में काम कर रहे हैं। यह कमांड इतिहास में कोई बदलाव नहीं करता है।
git resetयह कमांड थोड़ी अधिक जटिल है। यह वास्तव में अलग-अलग चीजों के एक जोड़े पर निर्भर करता है कि यह कैसे लागू किया जाता है। यह सूचकांक को संशोधित करता है (तथाकथित "स्टेजिंग क्षेत्र")। या यह बदल जाता है जो वर्तमान में एक शाखा प्रमुख होता है। यह आदेश मौजूदा इतिहास को बदल सकता है (यह उस संदर्भ को बदलकर एक शाखा संदर्भ)।
यदि परियोजना के इतिहास में कहीं पर एक प्रतिबद्धता बनाई गई है, और आप बाद में निर्णय लेते हैं कि यह वचन गलत है और ऐसा नहीं किया जाना चाहिए, तो git revertयह कार्य के लिए उपकरण है। यह खराब प्रतिबद्ध द्वारा शुरू किए गए परिवर्तनों को इतिहास में "पूर्ववत" रिकॉर्ड करते हुए पूर्ववत करेगा।
यदि आपने अपने काम के पेड़ में एक फ़ाइल को संशोधित किया है, लेकिन परिवर्तन नहीं किया है, तो आप git checkoutफ़ाइल की ताज़ा-से-रिपॉजिटरी कॉपी की जांच करने के लिए उपयोग कर सकते हैं ।
यदि आपने कोई कमिट किया है, लेकिन इसे किसी और के साथ साझा नहीं किया है और आप तय करते हैं कि आप इसे नहीं चाहते हैं, तो आप git resetइतिहास को फिर से लिखने के लिए उपयोग कर सकते हैं ताकि ऐसा लगे कि आपने कभी भी ऐसा नहीं किया है।
ये संभव उपयोग परिदृश्यों में से कुछ हैं। अन्य आदेश हैं जो कुछ स्थितियों में उपयोगी हो सकते हैं, और उपरोक्त तीन आदेशों के अन्य उपयोग भी हैं।
git resetऔर git checkoutठीक उसी बात कर सकते हैं। यह कहना कि वे "दूर से भी समान नहीं हैं" केवल अतिशयोक्ति नहीं है: यह भी दूर से सच नहीं है। ये दो आदेश इतने सारे अलग-अलग काम कर सकते हैं, जिनमें से कुछ पूरी तरह से ओवरलैप हैं। उदाहरण: git reset --hardऔर git checkout -- .ठीक यही काम करेंगे। और तार्किक रूप से बोलना चाहिए , git reset --hard <path>और git checkout <path>सटीक भी करना चाहिए - git हालांकि आपको ऐसा करने से रोकता है। इन दोनों आदेशों को भ्रमित करना बहुत आसान है।
git reset --hard <path>कर सकते हैं आप git checkout <path>ठीक कर सकते हैं क्योंकि दोनों कमांड पूरी तरह से कुछ अलग करते हैं। git resetबताता है कि HEAD को एक अलग कमिट में ले जाना है। git checkoutदूसरी ओर Git को HEAD के साथ कुछ भी करने के लिए नहीं कहता है। यह HEAD को अकेला छोड़ देता है और केवल एक फ़ाइल की जांच करता है। हां, आप उन्हें इस तरह से तैयार कर सकते हैं कि उनके समान प्रभाव हों। लेकिन वास्तव में वे जो करते हैं वह बिल्कुल अलग है।
मान लीजिए कि आपने कमिट किया था:
C
B
A
git revert B, एक ऐसा कमिटमेंट बनाएगा जिसमें अनडू बदलता है B।
git revert A, एक ऐसा कमिटमेंट बनाएगा जिसमें अनडू बदलता है A, लेकिन इसमें बदलावों को नहीं छूएगाB
ध्यान दें कि यदि परिवर्तन में परिवर्तन Bपर निर्भर हैं A, तो Aसंभव नहीं है।
git reset --soft A, प्रतिबद्ध इतिहास और भंडार को बदल देगा; स्टेजिंग और वर्किंग डायरेक्टरी अभी भी राज्य की स्थिति में है C।
git reset --mixed A, प्रतिबद्ध इतिहास, भंडार और मंचन को बदल देगा; कार्यशील निर्देशिका अभी भी राज्य में होगी C।
git reset --hard A, प्रतिबद्ध इतिहास, भंडार, मंचन और कार्यशील निर्देशिका को बदल देगा; आप Aपूरी तरह से वापस आ जाएंगे ।
git revertएक पूर्व प्रतिबद्ध करने के लिए प्रयोग किया जाता है। Git में, आप पहले वाले कमिट को बदल या मिटा नहीं सकते हैं। (वास्तव में आप कर सकते हैं, लेकिन यह समस्याएं पैदा कर सकता है।) इसलिए पहले की गई प्रतिबद्धता को संपादित करने के बजाय, एक नई प्रतिबद्ध का परिचय देता है जो पहले वाले को उलट देता है।git reset आपकी कार्यशील निर्देशिका में परिवर्तनों को पूर्ववत करने के लिए उपयोग किया जाता है जिसे अभी तक कॉम नहीं किया गया है।git checkoutका उपयोग आपके वर्तमान कार्यशील पेड़ के लिए कुछ अन्य प्रतिबद्ध से फ़ाइल कॉपी करने के लिए किया जाता है। यह स्वचालित रूप से फ़ाइल नहीं करता है।git reset --softकेवल HEAD को git reset --hardरीसेट करता है, HEAD और आपके वर्किंग डायरेक्टरी को रीसेट करता है।
git checkout आपके काम करने के पेड़ को संशोधित करता है,git reset यह सूचित करता है कि आप किस शाखा के संदर्भ में हैंgit revert एक पूर्ववत बदलाव जोड़ता है।git reset केवल उस शाखा को इंगित नहीं करता है जो एक शाखा को इंगित करती है , इसका उपयोग सूचकांक से फ़ाइलों को अनस्टेज करने के लिए भी किया जाता है, और काम की प्रतिलिपि को git reset --mixed(डिफ़ॉल्ट) के साथ संशोधित कर सकते हैं ।
रीसेट - कमेटी-स्तर पर, एक शाखा की नोक को एक अलग कमेट में स्थानांतरित करने का एक तरीका है। इसका उपयोग करंट ब्रांच से कमिट्स को हटाने के लिए किया जा सकता है।
रिवर्ट - रिवरटिंग एक नई कमिट बनाकर कमिट करता है। यह परिवर्तनों को पूर्ववत करने का एक सुरक्षित तरीका है, क्योंकि इसमें प्रतिबद्ध इतिहास को फिर से लिखने का कोई मौका नहीं है। इसे गिट रीसेट के साथ विरोध करें, जो मौजूदा प्रतिबद्ध इतिहास को बदल देता है। इस कारण से, सार्वजनिक शाखा में परिवर्तनों को पूर्ववत करने के लिए git रिवर्ट का उपयोग किया जाना चाहिए, और git रीसेट को किसी निजी शाखा में परिवर्तन पूर्ववत करने के लिए आरक्षित किया जाना चाहिए।
आप इस लिंक पर एक नजर डाल सकते हैं- रीसेट, चेकआउट और रिवर्ट
यदि आपने पेड़ को तोड़ा है, लेकिन कोड नहीं बनाया है, तो आप उपयोग कर सकते हैं git reset, और यदि आप केवल एक फ़ाइल को पुनर्स्थापित करना चाहते हैं, तो आप उपयोग कर सकते हैं git checkout।
यदि आपने पेड़ को तोड़ा और कोड बनाया, तो आप उपयोग कर सकते हैं git revert HEAD।
http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html