git revert कैसे काम करता है
git revert को हम Git के undo कमांड के रूप में सोच सकते हैं। लेकिन git revert commits को हटाता नहीं है और न ही ब्रांच की पिछली स्थिति पर कूदता है। यह एक नया commit बनाता है जो किसी विशेष commit से आए बदलावों को पलट देता है।

हैश <commit_hash> वाले commit को revert करने का सिंटैक्स:
git revert <commit_hash>
हम git log कमांड से commits और उनके हैश identifiers की सूची देख सकते हैं। git log का आउटपुट नए से पुराने commits के क्रम में लिस्ट करता है, इस तरह:

उदाहरण के लिए, subtract फ़ंक्शन को लागू करने वाले commit को revert करने के लिए हम यह कमांड चलाएंगे:
git revert 7ba24a3e62d4d37182428ccfaa070baa222b1151
git revert का उपयोग करके हम किसी विशेष commit के बदलावों को undo कर सकते हैं, बिना commit history को प्रभावित किए।
ध्यान दें कि git revert कोई जादू नहीं है; commit history के आधार पर conflicts आ सकते हैं जिन्हें मैन्युअली सुलझाना पड़ेगा।
मैन्युअल बदलावों की तुलना में git revert के लाभ
अगर कभी हमें conflicts मैन्युअली सुलझाने पड़ सकते हैं, तो git revert उपयोगी क्यों है? क्या मैन्युअली बदलाव वापस करना आसान नहीं होगा? आइए इसके लाभ देखें:
- इतिहास सुरक्षित:
git revertएक नया commit बनाता है जो निर्दिष्ट commit के बदलावों को पलटता है, जबकि पूरी commit history को सुरक्षित रखता है। इससे बदलाव और reversals का पारदर्शी रिकॉर्ड मिलता है। - एटॉमिक रिवर्सल: यह सुनिश्चित करता है कि reversals एटॉमिक और सुसंगत हों। मैन्युअली डिलीट कर के commit करने पर मानवीय त्रुटि का जोखिम रहता है।
- Conflict जागरूकता: अगर मूल commit पर निर्भर इंटीग्रेशन या बदलाव हैं, तो conflicts के जरिए हमें आगाह किया जाता है। यह असुविधाजनक लग सकता है, पर अनचाहे दुष्प्रभावों से बचाता है।
- मेटाडेटा:
git revertसे बना नया commit मेटाडेटा और एक commit मैसेज शामिल करता है जो बताता है क्या revert किया गया, जिससे भविष्य में समझना आसान होता है। बिनाgit revertके यह संदर्भ खो सकता है।
विभिन्न परिस्थितियों में Merge को Revert करना
इस सेक्शन में हम देखेंगे कि merge को कैसे undo करें। उदाहरण के तौर पर, मान लेते हैं कि हम feature नामक ब्रांच को main में merge कर रहे हैं और कमांड main ब्रांच से चला रहे हैं:
git merge feature
यहां जो सीखेंगे, उसे आप किसी भी दो ब्रांच पर, उनके नाम उचित रूप से बदलकर, लागू कर सकते हैं।
ऐसा merge revert करना जिसका कोई commit न बना हो
git merge हमेशा नया commit नहीं बनाता। केवल तब commit बनता है जब main ब्रांच feature ब्रांच से अलग (diverge) हो गई हो। क्योंकि git revert को काम करने के लिए commit चाहिए, इस स्थिति में हम इसे इस्तेमाल नहीं कर सकते।
main और feature ब्रांच तब diverge होती हैं जब main पर ऐसे नए commits बने हों जो feature के ancestors न हों। यानी feature बनने के बाद main पर नए commits बनाए गए।
यदि ब्रांचें diverge नहीं हुई हैं, तो main ब्रांच पर git merge feature चलाने पर Git fast-forward merge करेगा। इसका मतलब है कि वह main ब्रांच के HEAD को feature ब्रांच के HEAD पर ले जाएगा।

हम इसे git merge के परिणाम को देखकर पहचान सकते हैं:

ऐसे merge को undo करने के लिए, हमें बस main ब्रांच के HEAD को उसकी पिछली स्थिति पर वापस ले जाना है। इसके लिए हम:
git reflogसे पिछलाHEADपहचानेंgit reset --hard <previous_head>का उपयोग करकेHEADको पिछले वाले पर रीसेट करें, जहाँ<previous_head>को पिछलेHEADसे बदलें।
git reflog का आउटपुट कुछ इस तरह दिखेगा:

हम उस लाइन को देखकर पिछला HEAD पहचान सकते हैं जिसमें लिखा हो “checkout: moving from feature to main” (यह feature और main लिखता है क्योंकि ये हमारी ब्रांचों के नाम हैं)।
इस मामले में, पिछला head fe59838 है। main ब्रांच का HEAD वापस वहाँ ले जाने और merge को undo करने के लिए, हम यह कमांड चलाते हैं:
git reset --hard fe59838

ऐसा merge revert करना जिसका एक commit बना हो
यदि main और feature ब्रांच diverge हो गई हैं, तो दो ब्रांचों को merge करते समय एक नया commit बनता है, जिसे merge commit कहते हैं।

merge commit एक ब्रांच के बदलाव दूसरी ब्रांच पर लागू करता है। इस मामले में, feature के बदलाव main पर लागू होते हैं।
main ब्रांच पर हुए बदलावों को पलटने के लिए, हम merge commit पर git revert का उपयोग करते हैं। इससे एक नया commit बनेगा जो merge के साथ main में आए बदलावों को undo कर देगा, और प्रभावी रूप से main की स्थिति merge से पहले जैसी हो जाएगी।
पहले, हमें merge commit का हैश पहचानना होगा। यह हम git log कमांड से कर सकते हैं:

क्योंकि merge commit के दो parents होते हैं, git revert का सिंटैक्स थोड़ा अलग होता है। हमें -m 1 विकल्प का उपयोग करना होता है ताकि हम बताएं कि हम main ब्रांच के सापेक्ष बदलावों को revert करना चाहते हैं:
git revert -m 1 b8dab2c8611e324ed0d273133987415350e6d10d

Commit को Revert करते समय Conflict Resolution
कभी-कभी, किसी commit को revert करते समय conflicts आ सकते हैं, खासकर यदि वह commit बाद के कोड परिवर्तनों से टकराता हो। ऐसे मामलों में:
- Git revert रोकेगा: हमें conflicts को मैन्युअली सुलझाना होगा। Git conflicting फ़ाइलों को मार्क करेगा और दखल की ज़रूरत होगी।
- Conflicts सुलझाएँ: हर conflicting फ़ाइल खोलें, Git द्वारा चिह्नित conflicts को सुलझाएँ, और बदलाव सहेजें।
- सुलझी फ़ाइलें stage करें:
git add <file-path> - Revert जारी रखें:
git revert --continue
निष्कर्ष
git revert का उपयोग करके merge commits को undo करना सुनिश्चित करता है कि हर बदलाव और सुधार commit history में दर्ज रहे।
साथ ही, किन परिस्थितियों में git reset बनाम git revert लागू करना है, यह समझना हमें बेहतर निर्णय लेने में मदद करता है—खासकर सहयोगी workflows या केवल-लोकल बदलावों के संदर्भ में।
इसके बारे में और पढ़ने के लिए नीचे दिए गए FAQs सेक्शन को देखें। यदि आप Git के बारे में और सीखना चाहते हैं, तो मैं ये संसाधन सुझाता हूँ:
FAQs
क्या मैं पहले से push किए गए merge को git revert से वापस ले सकता/सकती हूँ?
हाँ, merges पर git revert का यह मुख्य उपयोग है। यदि बदलाव लोकल हैं तो merge को undo करने के लिए git reset आसान तरीका है।
दूसरों को बदलाव दिखाने के लिए, हमें उन्हें remote repository पर push करना होगा। इसलिए, पहले से push किए गए merge को undo करने के लिए हम यह करते हैं:
git revert -m 1 <merge_commit_hash>
git push origin <branch_name>
यहाँ <merge_commit_hash> को merge commit के हैश से और <brach_name> को उस ब्रांच के नाम से बदलें जहाँ merge किया गया था।
क्या git revert इस्तेमाल करने के बाद merge commit डिलीट हो जाएगा?
नहीं। merge commit history में बना रहता है, लेकिन उसका बदलाव नया commit पलट देता है। git revert से merge undo करने का मकसद ही commit history को सुरक्षित रखना है।
merge को undo करने के लिए git revert के अलावा और क्या तरीके हैं?
merge को undo करने का एक विकल्प git reset है। यह तरीका ब्रांच को merge commit से पहले की स्थिति पर रीसेट कर देता है। यह अधिक हस्तक्षेपकारी है और समस्या पैदा कर सकता है यदि अन्य सहयोगियों ने उस history पर अपना काम आधारित कर लिया हो जिसे हम रीसेट करने वाले हैं। इसलिए, इसे तभी सुझाया जाता है जब हमें यक़ीन हो कि इससे दूसरों पर असर नहीं पड़ेगा।
git reset --hard <commit_hash>
git push --force
यहाँ <commit_hash> को उस commit के हैश से बदलें जहाँ आप वापस जाना चाहते हैं।
merge को undo करने के लिए मुझे git reset कब इस्तेमाल करना चाहिए?
मैं सुझाव दूँगा कि git reset से merge को तभी undo करें जब merge सिर्फ लोकल स्तर पर हुआ हो और अभी तक push न किया गया हो।

समस्या पैदा करने वाले कोड को मर्ज करने से हम किसी एप्लिकेशन से समझौता कर सकते हैं—चाहे मुख्य ब्रांच में अनजाने में अधूरा काम शामिल हो गया हो या कोई गंभीर बग ऑटोमेटेड टेस्ट से निकलकर छूट गया हो।
इस लेख में, मैं आपको
git revertका उपयोग करके सुरक्षित रूप से merge को वापस लेने की प्रक्रिया समझाऊंगा, ताकि commit history अक्षुण्ण रहे और प्रोजेक्ट की अखंडता बनी रहे।