Git Revert, Checkout और Reset में क्या अंतर है?


273

मैं कैसे एक पहली स्थिति पर रोलबैक फ़ाइलें और परियोजनाओं को बहाल करने या, और बीच का अंतर समझ में नहीं आता जानने के लिए कोशिश कर रहा हूँ git revert, checkoutऔर reset। प्रतीत होता है कि एक ही उद्देश्य के लिए 3 अलग-अलग कमांड क्यों हैं, और किसी को दूसरे पर कब चुनना चाहिए?

जवाबों:


461

इन तीन आदेशों का पूरी तरह से अलग उद्देश्य है। वे भी दूर के समान नहीं हैं।

git revert

यह आदेश एक नई प्रतिबद्ध बनाता है जो पिछले प्रतिबद्ध से परिवर्तनों को पूर्ववत करता है। यह कमांड प्रोजेक्ट में नया इतिहास जोड़ता है (यह मौजूदा इतिहास को संशोधित नहीं करता है)।

git checkout

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

git reset

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

इन आदेशों का उपयोग करना

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

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

यदि आपने कोई कमिट किया है, लेकिन इसे किसी और के साथ साझा नहीं किया है और आप तय करते हैं कि आप इसे नहीं चाहते हैं, तो आप git resetइतिहास को फिर से लिखने के लिए उपयोग कर सकते हैं ताकि ऐसा लगे कि आपने कभी भी ऐसा नहीं किया है।

ये संभव उपयोग परिदृश्यों में से कुछ हैं। अन्य आदेश हैं जो कुछ स्थितियों में उपयोगी हो सकते हैं, और उपरोक्त तीन आदेशों के अन्य उपयोग भी हैं।


13
इसलिए तीनों आदेशों का उपयोग कुछ काम करने के लिए किया जा सकता है, जिसका अर्थ है कि वे "पूरी तरह से अलग" नहीं हैं। एक ही अवधारणा, विभिन्न संदर्भ।
ब्रूनो सैंटोस

16
@BrunoSantos: कैंडलस्टिक्स, लीड पाइप, खंजर और रस्सी सभी का उपयोग लोगों की हत्या करने के लिए किया जा सकता है, लेकिन इसका मतलब यह नहीं है कि उन चीजों में से कोई भी विशेष रूप से समान है।
डेन मोल्डिंग

12
@Dan Mounlding - वास्तव में, लेकिन कई मामलों में कर रहे हैं git resetऔर git checkoutठीक उसी बात कर सकते हैं। यह कहना कि वे "दूर से भी समान नहीं हैं" केवल अतिशयोक्ति नहीं है: यह भी दूर से सच नहीं है। ये दो आदेश इतने सारे अलग-अलग काम कर सकते हैं, जिनमें से कुछ पूरी तरह से ओवरलैप हैं। उदाहरण: git reset --hardऔर git checkout -- .ठीक यही काम करेंगे। और तार्किक रूप से बोलना चाहिए , git reset --hard <path>और git checkout <path>सटीक भी करना चाहिए - git हालांकि आपको ऐसा करने से रोकता है। इन दोनों आदेशों को भ्रमित करना बहुत आसान है।
DanGordon

5
@DanGordon मुझे एहसास है कि हम यहाँ सिर्फ एक अंतर होगा। फिर भी, मुझे लगता है कि मुझे कुछ स्पष्टीकरण देना चाहिए। आप ऐसा नहीं git reset --hard <path>कर सकते हैं आप git checkout <path>ठीक कर सकते हैं क्योंकि दोनों कमांड पूरी तरह से कुछ अलग करते हैं। git resetबताता है कि HEAD को एक अलग कमिट में ले जाना है। git checkoutदूसरी ओर Git को HEAD के साथ कुछ भी करने के लिए नहीं कहता है। यह HEAD को अकेला छोड़ देता है और केवल एक फ़ाइल की जांच करता है। हां, आप उन्हें इस तरह से तैयार कर सकते हैं कि उनके समान प्रभाव हों। लेकिन वास्तव में वे जो करते हैं वह बिल्कुल अलग है।
डेन मोल्डिंग

46

मान लीजिए कि आपने कमिट किया था:

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पूरी तरह से वापस आ जाएंगे ।


1
इतना सहज जवाब .. कैसे चेकआउट के बारे में
एमजे स्टूडियो

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

7
मेरा मानना ​​है कि आप "गिट रीसेट" के बारे में गलत हैं। "git reset" आपके HEAD को पिछले कमिट्स में से एक में रीसेट करता है, यह आपकी वर्किंग डायरेक्टरी को रीसेट नहीं करता है। वर्किंग डायरेक्टरी "git checkout [फाइलनेम]" द्वारा "रीसेट" है
luigi7up

11
git reset --softकेवल HEAD को git reset --hardरीसेट करता है, HEAD और आपके वर्किंग डायरेक्टरी को रीसेट करता है।
एह्रीक

git reset --mixed (डिफ़ॉल्ट): अनटमिट + अनस्टेज बदलाव
NattyC

21
  • git checkout आपके काम करने के पेड़ को संशोधित करता है,
  • git reset यह सूचित करता है कि आप किस शाखा के संदर्भ में हैं
  • git revert एक पूर्ववत बदलाव जोड़ता है।

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

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

6

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

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

आप इस लिंक पर एक नजर डाल सकते हैं- रीसेट, चेकआउट और रिवर्ट


5

यदि आपने पेड़ को तोड़ा है, लेकिन कोड नहीं बनाया है, तो आप उपयोग कर सकते हैं git reset, और यदि आप केवल एक फ़ाइल को पुनर्स्थापित करना चाहते हैं, तो आप उपयोग कर सकते हैं git checkout

यदि आपने पेड़ को तोड़ा और कोड बनाया, तो आप उपयोग कर सकते हैं git revert HEAD

http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html

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