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

शुरुआती के लिए Git Reset और Revert ट्यूटोरियल

जानें कि Git reset और revert का उपयोग करके अपने प्रोजेक्ट इतिहास को कैसे प्रबंधित करें। Soft, mixed, और hard resets के विस्तृत उदाहरणों के साथ अभ्यास करें। दोनों कमांड्स के बीच अंतर सीखें।
· 8 मि॰ पढ़ें

AI के साथ खोजें

Git की शुरुआत सॉफ्टवेयर डेवलपर्स के लिए एक टूल के रूप में हुई थी, लेकिन अब यह किसी भी व्यक्ति के लिए मानक बन चुका है जो कोड के साथ काम करता है। आज, डेटा साइंटिस्ट, डेटा इंजीनियर, और मशीन लर्निंग इंजीनियर भी इन सर्वोत्तम प्रथाओं को अपना रहे हैं।

इस ट्यूटोरियल में, मैं git reset और git revert के बीच के मुख्य अंतर कवर करता/करती हूँ—ये दोनों Git कमांड बदलावों को वापस लेने के लिए हैं। मैं हर मोड के व्यावहारिक उदाहरणों से गुजरता/गुजरती हूँ, प्रोजेक्ट को इनिशियलाइज़ करने से लेकर विशेष कमिट्स को रिवर्ट करने तक।

संक्षेप में

  • git reset ब्रांच पॉइंटर को पीछे ले जाता है और इतिहास से कमिट्स हटा देता है। इसे पुश करने से पहले लोकल क्लीनअप के लिए इस्तेमाल करें।

  • git reset --soft बदलावों को staged रखता है, --mixed (डिफ़ॉल्ट) उन्हें unstaged करता है, और --hard उन्हें पूरी तरह त्याग देता है।

  • git revert एक नया कमिट बनाता है जो किसी पिछले कमिट को उलट देता है। इसे साझा ब्रांच पर पहले से पुश किए गए बदलावों के लिए इस्तेमाल करें।

  • साझा ब्रांचों पर कभी भी git reset का उपयोग न करें। यदि कुछ पहले ही पुश हो चुका है, तो उसकी जगह git revert का उपयोग करें।

  • यदि आपने गलती से git reset --hard चला दिया है, तो खोए हुए कमिट्स को पाने के लिए git reflog देखें।

Git क्या है?

Git एक मुक्त-स्रोत वर्ज़न कंट्रोल टूल है जिसे 2005 में Linus Torvalds ने बनाया था। इसका मुख्य उपयोग प्रोजेक्ट फ़ाइलों में हुए बदलावों को कुशलता से ट्रैक करना है ताकि प्रोजेक्ट सदस्य सभी बदलावों का रिकॉर्ड रख सकें और बिना मूल्यवान जानकारी खोए बदलावों को मर्ज कर सकें। हमारा

इसके अलावा,Introduction to GitHub Concepts कोर्स GitHub की प्रमुख विशेषताएँ, इंटरफ़ेस नेविगेशन, और रोज़मर्रा के सहयोगी कार्यों को सफलतापूर्वक करने के तरीके कवर करता है।

Git revert और Git reset, प्रोजेक्ट कोड और इतिहास में हुए बदलावों को वापस लेने के लिए इस्तेमाल होने वाले दो कमांड हैं, लेकिन अलग-अलग तरीकों से। प्रक्रिया में कूदने से पहले, चलिए एक Git प्रोजेक्ट बनाते हैं।

एक Git प्रोजेक्ट बनाएं

नीचे एक git प्रोजेक्ट बनाने और कुछ फ़ाइलों के साथ उसे इनिशियलाइज़ करने के निर्देश दिए गए हैं:

mkdir git_revert_reset
cd git_revert_reset
git init .
  • mkdir git_revert_reset एक git_revert_reset नाम का फ़ोल्डर बनाता है। 

  • cd git_revert_reset उस फ़ोल्डर में जाता है। 

  • git init . फ़ोल्डर को एक git रिपॉज़िटरी के रूप में इनिशियलाइज़ करता है।

इसे एक डेटा साइंस प्रोजेक्ट मानते हुए, हम डेटा एक्विज़िशन, डेटा प्रीप्रोसेसिंग और मॉडल ट्रेनिंग के लिए नीचे दिए गए touch कमांड से फ़ाइलें बना सकते हैं:

touch data_acquisition.py data_preprocessing.py model_training.py

यह प्रोजेक्ट फ़ोल्डर की अंतिम सामग्री है।

git_revert_reset
      |---------- data_acquisition.py
      |---------- data_preprocessing.py
      |---------- model_training.py

Git Reset 

Git Reset से पहले और बाद का आरेख

Git Reset आरेख (स्रोत)

git reset कमांड का उपयोग आपकी वर्किंग डायरेक्टरी में हुए बदलावों को वापस लेने और किसी विशेष कमिट पर लौटने के लिए किया जाता है, जबकि उसके बाद किए गए सभी कमिट्स को त्याग दिया जाता है। 

उदाहरण के लिए, मान लीजिए आपने दस कमिट किए हैं। पहले कमिट पर git reset का उपयोग करने से बाकी नौ कमिट हट जाएंगे और आप पहले कमिट की स्थिति में लौट आएँगे।

git reset का उपयोग करने से पहले, यह सोचना महत्वपूर्ण है कि आप किस प्रकार के बदलाव करने की योजना बना रहे हैं; अन्यथा, आप भलाई से अधिक अव्यवस्था पैदा कर सकते हैं। 

आप git reset के साथ कई विकल्पों का उपयोग कर सकते हैं, लेकिन ये मुख्य हैं। हर एक खास स्थिति के अनुसार उपयोग होता है: git reset --soft, git reset --mixed, और git reset --hard

git reset --soft

--soft का उद्देश्य HEAD (जहाँ आपके लोकल मशीन पर आखिरी कमिट होता है) संदर्भ को किसी विशेष कमिट पर ले जाना है। उदाहरण के लिए, यदि हमें एहसास होता है कि हम कमिट में कोई फ़ाइल जोड़ना भूल गए, तो हम --soft का उपयोग करके पीछे जा सकते हैं, इस प्रारूप में:

  • git reset --soft HEAD~n किसी विशेष संदर्भ (n) वाले कमिट तक पीछे जाने के लिए। git reset --soft HEAD~1 पिछले कमिट तक लौटाता है।

  • git reset --soft <commit ID> <commit ID> वाले हेड तक पीछे ले जाता है।

आइए कुछ उदाहरण देखें।

git add data_acquisition.py data_preprocessing.py

git commit -m "added data acquisition and preprocessing scripts"

पिछले कमांड का परिणाम यह है। 

[master (root-commit) faf864e] added data acquisition and preprocessing scripts
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 data_acquisition.py
create mode 100644 data_preprocessing.py

हम कमिट की स्थिति इस प्रकार जाँच सकते हैं:

git status

On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
model_training.py

nothing added to commit but untracked files present (use "git add" to track)

लेकिन, हम model_training.py स्क्रिप्ट को कमिट में जोड़ना भूल गए।

चूँकि आखिरी कमिट HEAD पर स्थित है, हम निम्नलिखित तीन स्टेटमेंट्स चलाकर इसे ठीक कर सकते हैं। 

  • git reset --soft HEAD~1 का उपयोग करके आखिरी कमिट को वापस लें, जबकि बदलाव staged रहें।

  • git add से भूली हुई फ़ाइल जोड़ें। 

  • git commit से अंतिम कमिट के साथ बदलाव सहेजें।

git reset --soft HEAD~1

git add model_training.py

git commit -m "added all the python scripts"

निम्नलिखित परिणाम दर्शाता है कि सभी पिछले चरणों के बाद git reset से मास्टर पर लौट आया: 

[master (root-commit) faf864e] added all the python scripts
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 data_acquisition.py
create mode 100644 data_preprocessing.py
create mode 100644 model_training.py

Soft resets की विस्तृत वॉकथ्रू के लिए हमारा Git Reset Soft: Complete Guide देखें। यदि आपको सिर्फ पिछली कमिट मैसेज ठीक करनी है या भूली हुई फ़ाइलें जोड़नी हैं, तो git commit --amend अक्सर reset से तेज़ विकल्प है।

git reset --mixed

यह git reset के लिए डिफ़ॉल्ट आर्ग्युमेंट है। इस कमांड के दो प्रभाव होते हैं: (1) सभी बदलावों को uncommit करना और (2) उन्हें unstage करना। कल्पना करें कि हमने गलती से model_training.py फ़ाइल जोड़ दी और हम उसे हटाना चाहते हैं क्योंकि मॉडल ट्रेनिंग अभी पूरी नहीं हुई है। आगे इस तरह बढ़ें: 

  • कमिट में जिन फ़ाइलों को जोड़ा गया था उन्हें git reset HEAD से unstage करें
  • केवल वही फ़ाइलें जोड़ें जिनकी कमिट के लिए जरूरत है
git reset HEAD

git status

On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
model_training.py
data_acquisition.py
data_preprocessing.py

nothing added to commit but untracked files present (use "git add" to track)

अब हम केवल आखिरी दो फ़ाइलें जोड़कर कमिट कर सकते हैं।

git add data_acquisition.py data_preprocessing.py

git commit -m "Removed the model_training.py from the commit"

git reset --hard

यह विकल्प संभावित रूप से खतरनाक हो सकता है। इसलिए, सावधानी से उपयोग करें! 

मूल रूप से, किसी विशेष कमिट पर hard reset का उपयोग करने पर, यह HEAD को उस कमिट पर मजबूती से लौटा देता है और उसके बाद की हर चीज़ को हटा देता है।

Hard reset चलाने से पहले, फ़ोल्डर की सामग्री पर नज़र डालते हैं।

ls
data_acquisition.py data_preprocessing.py model_training.py

git reset --hard
HEAD is now at 97159bc added data acquisition and preprocessing scripts

अब फ़ोल्डर की सामग्री देखें:

ls
data_acquisition.py data_preprocessing.py

हम देखते हैं कि untracked फ़ाइल model_training.py हटा दी गई है। फिर से, reset स्टेटमेंट के साथ आप क्या कर रहे हैं, यह समझ लेना ज़रूरी है क्योंकि परिणाम गंभीर हो सकते हैं!

यदि आपने गलती से hard reset चला दिया है, तो git reflog आपकी सुरक्षा कवच है। Git लगभग 30 दिनों तक सभी रेफरेंस परिवर्तनों का लॉग रखता है, इसलिए आप अक्सर git reflog चलाकर और फिर git reset --hard HEAD@{n} चलाकर reset से पहले की स्थिति पर लौट सकते हैं। ध्यान दें कि uncommitted या unstaged बदलावों को इस तरह रिकवर नहीं किया जा सकता।

Git Revert

Revert का आरेख - पहले और बाद में

Revert से पहले और बाद में (स्रोत)

Git revert git reset जैसा ही है, लेकिन तरीका थोड़ा अलग है। अपने रास्ते के सारे कमिट्स हटाने के बजाय, revert केवल एक कमिट को उलट देता है, आपको उस कमिट से पहले वाली staged फ़ाइलों पर ले जाकर।

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

यह जानना महत्वपूर्ण है कि revert का कोई असर तभी होगा जब कमिट हैश या संदर्भ निर्दिष्ट किया जाए। 

चलिए कुछ सामान्य git revert विकल्पों का पता लगाते हैं।

git revert --no-edit <commit ID>

--no-edit विकल्प उपयोगकर्ता को उस कमिट के संदेश को बदले बिना रिवर्ट करने देता है जिसे आप रिवर्ट करना चाहते हैं, और इससे git revert द्वारा फ़ाइल master ब्रांच पर लौट आती है।

इस स्थिति को दर्शाने के लिए, दो नई फ़ाइलें बनाते हैं जिन्हें जोड़ना है। 

touch model_monitoring.py data_monitoring.py

इन फ़ाइलों को बनाने के बाद, हमें उन्हें संशोधित संस्करण की staging area में जोड़ना होगा।

git add model_monitoring.py

आगे बढ़ने से पहले, निम्न कमांड चलाकर स्टेटस देखते हैं।

git status
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file:   data_monitoring.py
new file:   model_monitoring.py


हम देख सकते हैं कि दोनों फ़ाइलें जोड़ दी गई हैं, अब हम बदलावों को कमिट कर सकते हैं।

git commit -m "Added the monitoring script files"
[master (root-commit) eae84e7] Added the monitoring script files
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 data_monitoring.py
create mode 100644 model_monitoring.py


फिर, निम्न कमांड से कमिट हैश जेनरेट किया जा सकता है। यह उस विशेष कमिट पर कोई कार्रवाई करते समय फायदेमंद होता है। 

git reflog
eae84e7 (HEAD -> master) HEAD@{0}: commit (initial): Added the monitoring script files

अब मान लेते हैं कि पिछला कमिट जानबूझकर नहीं हुआ था, और हम उसे हटाना चाहते हैं।

git revert --no-edit eae84e7

[master c61ef6b] Revert "Added the monitoring script files"
Date: Sat Nov 12 20:14:17 2022 -0600
2 files changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 data_monitoring.py
delete mode 100644 model_monitoring.py

कमिट्स का लॉग देखते हैं:

git log

commit c61ef6b4e86f41f47c8c77de3b5fca3945a7c075 (HEAD -> master)
Author: Zoumana Keita <[email protected]>
Date:   Sat Nov 12 20:14:17 2022 -0600

  Revert "Added the monitoring script files"
 
  This reverts commit eae84e7669af733ee6c1b854f2fcd9acfea9d4a3.

commit eae84e7669af733ee6c1b854f2fcd9acfea9d4a3
Author: Zoumana Keita <[email protected]>
Date:   Sat Nov 12 20:05:57 2022 -0600

  Added the monitoring script files

लॉग से हम देख सकते हैं कि मूल कमिट eae84e7669af733ee6c1b854f2fcd9acfea9d4a3 को उलटने के लिए c61ef6b4e86f41f47c8c77de3b5fca3945a7c075 आईडी के साथ एक नया कमिट बनाया गया है। 

इस उदाहरण में, चूँकि हमारे पास एक ही कमिट है, हम git revert HEAD का उपयोग कर सकते थे, जिसका वही प्रभाव होता। और उदाहरणों के लिए हमारा पिछले कमिट को रिवर्ट करने का गाइड देखें।

git revert <commit hash>

यह केवल उस कमिट हैश से जुड़े बदलावों को हटाएगा और किसी अन्य कमिट पर असर नहीं डालेगा।

पहले जेनरेट की गई आईडी को देखते हुए, आपको क्या लगता है कि किस git revert का प्रभाव होगा? 

यदि आपका उत्तर c61ef6b4e86f41f47c8c77de3b5fca3945a7c075 है, तो आप सही हैं। eae84e7669af733ee6c1b854f2fcd9acfea9d4a3 पर विचार करने से कोई असर नहीं होगा, क्योंकि उसे एक नए कमिट ने बदल दिया है। 

आइए देखें, रिवर्ट करने की कोशिश पर क्या होता है।

git revert c61ef6b4e86f41f47c8c77de3b5fca3945a7c075

[master aaead40] Revert "Revert "Added the monitoring script files""

 2 files changed, 0 insertions(+), 0 deletions(-)

 create mode 100644 data_monitoring.py

 create mode 100644 model_monitoring.py

जैसा कि आप देख सकते हैं, शुरू में बनाई और कमिट की गई दोनों फ़ाइलें वापस आ गई हैं!

git revert --no-commit <commit ID>

--no-commit या -n विकल्प का उद्देश्य git को revert के बाद स्वतः कमिट बनने से रोकना है। यह तब लाभदायक है जब आप कमिट करने से पहले revert स्टेटमेंट द्वारा किए गए बदलावों की समीक्षा करना चाहते हैं।

आइए निम्न उदाहरण पर विचार करें: 

git revert --no-commit c61ef6b4e86f41f47c8c77de3b5fca3945a7c075

यह c61ef6b4e86f41f47c8c77de3b5fca3945a7c075 आईडी वाले कमिट द्वारा किए गए बदलावों को रिवर्ट कर देगा, लेकिन revert को रिकॉर्ड करने के लिए स्वतः नया कमिट नहीं बनाएगा। इसके बजाय, यह उलट बदलावों को stage कर देगा ताकि आप उनकी समीक्षा कर सकें और आवश्यकता अनुसार मैन्युअली कमिट कर सकें।

Git Revert बनाम Reset

git reset और git revert दोनों बदलावों को वापस लेते हैं, लेकिन उनका काम करने का तरीका अलग है और उनके उपयोग के मौके भी।

मानदंडgit resetgit revert
यह कैसे काम करता हैब्रांच पॉइंटर को पीछे ले जाता है, इतिहास से कमिट्स हटा देता हैपिछले कमिट के बदलावों को उलटने वाला नया कमिट बनाता है
कमिट इतिहासइतिहास को दोबारा लिखता है (कमिट्स हटते हैं)पूरा इतिहास सुरक्षित रखता है (एक नया revert कमिट जोड़ता है)
साझा ब्रांचों के लिए सुरक्षित?नहीं (यदि सहयोगियों ने हटाए गए कमिट्स पुल किए हैं तो कॉन्फ्लिक्ट होंगे)हाँ (इतिहास सभी सहयोगियों के लिए सुसंगत रहता है)
स्कोपएक साथ कई कमिट्स को वापस कर सकता हैएक समय में एक कमिट को उलटता है (बैच के लिए --no-commit उपयोग करें)
सर्वोत्तम उपयोग मामलापुश करने से पहले लोकल या निजी ब्रांचों की सफाईरिमोट पर पहले से पुश किए गए बदलावों को वापस लेना
जोखिम स्तर--hard के साथ ऊँचा (uncommitted कार्य स्थायी रूप से हट जाता है)कम (डेटा कभी नहीं खोता)

सामान्य नियम के रूप में: अप्रेषित लोकल इतिहास को साफ करने के लिए git reset का उपयोग करें, और वह सब सुरक्षित रूप से वापस लेने के लिए git revert का उपयोग करें जिसे अन्य लोग पुल कर सकते हैं। Merge कमिट्स को रिवर्ट करने की विशेष जानकारी के लिए हमारा Git Revert Merge Commit गाइड देखें।

निष्कर्ष

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

अपनी Git स्किल्स को आगे बढ़ाने के लिए, ये संबंधित DataCamp ट्यूटोरियल देखें:

Git Reset और Revert से जुड़े अक्सर पूछे जाने वाले प्रश्न

git reset और git revert में क्या अंतर है?

git reset लोकल रिपॉज़िटरी में कमिट्स को वापस लेने के लिए ब्रांच पॉइंटर को किसी पिछले कमिट पर ले जाता है, जिससे उसके बाद किए गए कमिट्स प्रभावी रूप से हट जाते हैं। git revert इसके विपरीत, किसी विशेष कमिट द्वारा किए गए बदलावों को उलटने के लिए एक नया कमिट बनाकर रिपॉज़िटरी में किए गए बदलावों को वापस लेता है।

क्या आपको git reset --hard का उपयोग करना चाहिए?

git reset --hard का उपयोग करते समय सावधान रहें क्योंकि यह किसी भी बदलाव को पूरी तरह नष्ट कर सकता है और उन्हें लोकल डायरेक्टरी से हटा सकता है। इसका उपयोग करने से पहले, जो आप कर रहे हैं उसके बारे में 100% सुनिश्चित हों।

मुझे git reset कब उपयोग करना चाहिए?

git reset तब उपयोगी है जब आप ऐसे कमिट्स को वापस लेना चाहते हैं जिन्हें रिमोट रिपॉज़िटरी पर पुश नहीं किया गया है। इसे उन कमिट्स को हटाने के लिए उपयोग किया जा सकता है जिनमें गलतियाँ हैं या जो अब आवश्यक नहीं हैं।

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

मुझे git revert कब उपयोग करना चाहिए?

git revert तब उपयोगी है जब आप उन कमिट्स को वापस लेना चाहते हैं जिन्हें पहले ही रिमोट रिपॉज़िटरी पर पुश किया जा चुका है। यह एक सुरक्षित विकल्प है क्योंकि यह किसी कमिट को नष्ट नहीं करता और रिपॉज़िटरी में किए गए बदलावों का स्पष्ट रिकॉर्ड छोड़ता है।

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

git reset क्या है?

git reset का उपयोग आपकी कमिट हिस्ट्री या वर्किंग डायरेक्टरी में हुए बदलावों को वापस लेने के लिए किया जाता है। यह आपको अपने HEAD को किसी विशेष कमिट पर रीसेट करने की अनुमति देता है, और वैकल्पिक रूप से इंडेक्स (staging area) और वर्किंग डायरेक्टरी को संशोधित करने की भी। 

git reset में --soft, --mixed, और --hard में क्या अंतर है?

--soft: HEAD को निर्दिष्ट कमिट पर ले जाता है, लेकिन बदलावों को कमिट के लिए staged रखता है। --mixed (डिफ़ॉल्ट): HEAD को निर्दिष्ट कमिट पर ले जाता है और बदलावों को unstaged करता है (वर्किंग डायरेक्टरी को जस का तस रखता है)। --hard: HEAD को निर्दिष्ट कमिट पर ले जाता है और इंडेक्स तथा वर्किंग डायरेक्टरी के सभी बदलावों को त्याग देता है।

विषय