मुख्य सामग्री पर जाएँ

Git Merge Commit को Revert करें: उदाहरणों के साथ मार्गदर्शिका

`git revert` का उपयोग करके Git merge को सुरक्षित रूप से वापस लेना सीखें, commit history को सुरक्षित रखते हुए और संभावित conflicts को सुलझाते हुए।
· 7 मि॰ पढ़ें

AI के साथ खोजें

समस्या पैदा करने वाले कोड को मर्ज करने से हम किसी एप्लिकेशन से समझौता कर सकते हैं—चाहे मुख्य ब्रांच में अनजाने में अधूरा काम शामिल हो गया हो या कोई गंभीर बग ऑटोमेटेड टेस्ट से निकलकर छूट गया हो।

इस लेख में, मैं आपको git revert का उपयोग करके सुरक्षित रूप से merge को वापस लेने की प्रक्रिया समझाऊंगा, ताकि commit history अक्षुण्ण रहे और प्रोजेक्ट की अखंडता बनी रहे।

git revert कैसे काम करता है

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

git revert कैसे काम करता है, उसका चित्रण

हैश <commit_hash> वाले commit को revert करने का सिंटैक्स:

git revert <commit_hash>

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

git log के साथ commit hash पहचानना

उदाहरण के लिए, 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 चाहिए, इस स्थिति में हम इसे इस्तेमाल नहीं कर सकते।विभिन्न (divergent) Git ब्रांच क्या होती हैं, उसका स्पष्टीकरण

main और feature ब्रांच तब diverge होती हैं जब main पर ऐसे नए commits बने हों जो feature के ancestors न हों। यानी feature बनने के बाद main पर नए commits बनाए गए।

यदि ब्रांचें diverge नहीं हुई हैं, तो main ब्रांच पर git merge feature चलाने पर Git fast-forward merge करेगा। इसका मतलब है कि वह main ब्रांच के HEAD को feature ब्रांच के HEAD पर ले जाएगा।

जब हम <code data-mce-selected=

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

Fast-forward द्वारा merge होने की पहचान कैसे करें

ऐसे merge को undo करने के लिए, हमें बस main ब्रांच के HEAD को उसकी पिछली स्थिति पर वापस ले जाना है। इसके लिए हम:

  1. git reflog से पिछला HEAD पहचानें
  2. git reset --hard <previous_head> का उपयोग करके HEAD को पिछले वाले पर रीसेट करें, जहाँ <previous_head> को पिछले HEAD से बदलें।

git reflog का आउटपुट कुछ इस तरह दिखेगा:

पुराने HEAD रेफ़रेंस को ढूँढना

हम उस लाइन को देखकर पिछला HEAD पहचान सकते हैं जिसमें लिखा हो “checkout: moving from feature to main” (यह feature और main लिखता है क्योंकि ये हमारी ब्रांचों के नाम हैं)।

इस मामले में, पिछला head fe59838 है। main ब्रांच का HEAD वापस वहाँ ले जाने और merge को undo करने के लिए, हम यह कमांड चलाते हैं:

git reset --hard fe59838

HEAD को पीछे ले जाने पर क्या होता है, उसका चित्रण

ऐसा merge revert करना जिसका एक commit बना हो

यदि main और feature ब्रांच diverge हो गई हैं, तो दो ब्रांचों को merge करते समय एक नया commit बनता है, जिसे 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 hash की पहचान

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

git revert -m 1 b8dab2c8611e324ed0d273133987415350e6d10d

git merge commit को revert करने पर क्या होता है, उसका चित्रण

Commit को Revert करते समय Conflict Resolution

कभी-कभी, किसी commit को revert करते समय conflicts आ सकते हैं, खासकर यदि वह commit बाद के कोड परिवर्तनों से टकराता हो। ऐसे मामलों में:

  1. Git revert रोकेगा: हमें conflicts को मैन्युअली सुलझाना होगा। Git conflicting फ़ाइलों को मार्क करेगा और दखल की ज़रूरत होगी।
  2. Conflicts सुलझाएँ: हर conflicting फ़ाइल खोलें, Git द्वारा चिह्नित conflicts को सुलझाएँ, और बदलाव सहेजें।
  3. सुलझी फ़ाइलें stage करें: git add <file-path>
  4. 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 न किया गया हो।

François Aubry

लेखक

François Aubry

Full-stack इंजीनियर एवं संस्थापक, CheapGPT पर। पढ़ाना हमेशा से मेरा जुनून रहा है। विद्यार्थी जीवन से ही मैं उत्साहपूर्वक ट्यूशन देने और अन्य विद्यार्थियों की सहायता करने के अवसर तलाशता रहा हूँ। इसी जुनून ने मुझे पीएचडी करने के लिए प्रेरित किया, जहाँ मैंने अपने शैक्षणिक प्रयासों के साथ शिक्षण सहायक के रूप में भी काम किया। उन वर्षों में पारंपरिक कक्षा-परिवेश में काम करना, संबंध बनाना और सीखने को आसान बनाना मुझे अत्यंत संतोष देता था। लेकिन ऑनलाइन लर्निंग प्लेटफ़ॉर्म के आगमन के साथ, मैंने डिजिटल शिक्षा की रूपांतरकारी क्षमता को पहचाना। वास्तव में, हमारी ही विश्वविद्यालय में ऐसे एक प्लेटफ़ॉर्म के विकास में मैं सक्रिय रूप से शामिल था। मैं पारंपरिक शिक्षण सिद्धांतों को नवोन्मेषी डिजिटल पद्धतियों के साथ जोड़ने के लिए गहराई से प्रतिबद्ध हूँ। मेरा उद्देश्य ऐसे पाठ्यक्रम बनाना है जो न केवल रोचक और सूचनाप्रद हों, बल्कि इस डिजिटल युग के शिक्षार्थियों के लिए सुगम भी हों।

विषय