Git Revert का उपयोग कैसे करें


107

कैसे git revertउपयोग किया जाता है?

यह एक डुप्लिकेट प्रश्न की तरह लग सकता है लेकिन जब लोग इसे पूछते हैं, तो प्रतिक्रिया अक्सर होती है, रीट केgit reset अनुसार उपयोग करने के लिए एक SHA हैश द्वारा Git में किया जाता है?

फिर जब कोई पूछता है कि git resetलोगों को उत्तर का उपयोग करने के लिए कैसे कहा जाए तो आपको Git केgit revert अनुसार उपयोग करना चाहिए - रोलबैक कैसे करें

इससे पहले कि आप इसे जानें, ओपी के गधे को बचाने के लिए 8 अलग-अलग लोग अपने स्वयं के अनूठे तरीकों के साथ दिखाई दिए, जो सभी आपके सिर के ऊपर हैं।

तो संक्षिप्त करने का प्रयास करें और एक डमी गाइड को लिखें git revert

एक परिदृश्य: आपने दो बार मास्टर और इसके बुरे के लिए प्रतिबद्ध किया है। आपने धक्का दिया और अन्य लोगों ने आपके बुरे बदलाव किए।

आप इसे पूर्ववत करना चाहते हैं। यह ऐसा कुछ नहीं है जिसे आप स्वयं कोड में पूर्ववत कर सकते हैं, कह सकते हैं कि कुछ जादूगर या पैकेज मैनेजर ने पूरे स्थान पर कई टन सामान बदल दिया - आप बस इसे वापस लाना चाहते हैं।

यह स्रोत नियंत्रण क्या है। मुझे यकीन है कि यह आसान है।

ठीक है, आप उपयोग करने जा रहे हैं git revertलेकिन कैसे?

और दौड़ने के बाद git revertआपको कुछ और करना है? क्या आपको किए गए परिवर्तनों को वापस करना है या रेपो को सीधे प्रतिबद्ध करना है या क्या ??

जाहिर है आपको फिर से पुश करने की जरूरत होगी और संभवत: अपनी गेंदों को टीम तक पहुंचाने की घोषणा करेंगे।

जवाबों:


119

git रिवर्ट एक नई प्रतिबद्धता बनाता है

git revert बस एक नई प्रतिबद्ध बनाता है जो मौजूदा प्रतिबद्ध के विपरीत है।

यह फ़ाइलों को उसी स्थिति में छोड़ देता है जैसे कि वह प्रतिबद्धता जो कभी वापस की गई हो, कभी अस्तित्व में नहीं होती है। उदाहरण के लिए, निम्नलिखित सरल उदाहरण पर विचार करें:

$ cd /tmp/example
$ git init
Initialized empty Git repository in /tmp/example/.git/
$ echo "Initial text" > README.md
$ git add README.md
$ git commit -m "initial commit"
[master (root-commit) 3f7522e] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ echo "bad update" > README.md 
$ git commit -am "bad update"
[master a1b9870] bad update
 1 file changed, 1 insertion(+), 1 deletion(-)

इस उदाहरण में कमिटमेंट हिस्ट्री में दो कमिट हैं और आखिरी एक गलती है। गिट रिवर्ट का उपयोग करना:

$ git revert HEAD
[master 1db4eeb] Revert "bad update"
 1 file changed, 1 insertion(+), 1 deletion(-)

लॉग में 3 कमिट होंगे:

$ git log --oneline
1db4eeb Revert "bad update"
a1b9870 bad update
3f7522e initial commit

तो जो हुआ उसका सुसंगत इतिहास है, फिर भी फाइलें ऐसी हैं मानो खराब अद्यतन कभी नहीं हुआ हो:

cat README.md 
Initial text

इस बात से कोई फर्क नहीं पड़ता कि इतिहास में प्रतिबद्ध होने की स्थिति क्या है (ऊपर के उदाहरण में, अंतिम प्रतिबद्ध वापस लौटा दिया गया है - किसी भी प्रतिबद्ध को वापस किया जा सकता है)।

सवाल बंद करना

क्या आपको बाद में कुछ और करना है?

git revertहै सिर्फ एक और प्रतिबद्ध, करने के लिए दूरस्थ इतना तो जैसे धक्का कि अन्य उपयोगकर्ताओं खींच सकते हैं / लाने / परिवर्तन विलय और बस हो गया।

क्या आपको किए गए परिवर्तनों को वापस करना है या रेपो को सीधे वापस करना है?

git revert है एक प्रतिबद्ध - वहाँ वापस लाने में एक भी प्रतिबद्ध है कि आप क्या करना चाहते थे है यह सोचते हैं कोई अतिरिक्त कदम हैं।

जाहिर है कि आपको फिर से जोर लगाना होगा और शायद टीम की घोषणा करनी होगी।

वास्तव में - यदि रिमोट अस्थिर अवस्था में है - तो बाकी टीम को सूचित करना कि उन्हें ठीक करने के लिए खींचने की जरूरत है (पुनरावृत्ति करने की प्रतिबद्धता) सही काम होगा :)।


पुष्टि के माध्यम से, यहाँ पहले बयान और किसी को भी एक ही बात के बारे में सोचकर कि मैं यह कैसे काम करता है के बारे में सोच रहा था, आप एक वापस कर सकते हैं, जहाँ आप वापस लौट रहे हैं के बाद से कई नए हिट हैं। तो वास्तव में वापस लौटना, उल्टे किए गए वचन के विपरीत है। आप निश्चित रूप से, संघर्ष कर सकते हैं ... लेकिन यह एक अलग कहानी है।
GG2

मुझे हमेशा इसके साथ git revert -n <commitToRevet>git revert --no-commit <commitToRevet>
कमिटमेंट

2
बस यह कहना चाहता था कि स्टैकओवरफ्लो पर वर्षों के बाद, मुझे लगता है कि यह उन सबसे अच्छे उत्तरों में से एक हो सकता है जो मैंने कभी भी देखा है। महान उदाहरण और स्पष्टीकरण। धन्यवाद।
14:33 पर user3344977

मैं अधिक जानकारी प्राप्त करने की उम्मीद में यहाँ आया, कुछ इस तरह की TLDR की एक कच्ची। Githubusercontent.com/git/git/master/Documentation/howto/…
wingua

1
@wviana यदि आपको मिली जानकारी अपर्याप्त है, तो कृपया उत्तर लिखें। ध्यान दें कि स्टैक ओवरफ्लो आधिकारिक प्रलेखन के लिए कोई विकल्प नहीं है (जो कि आप इस लिंक से लिंक करते हुए दिखाई देते हैं, और इस प्रश्न की तुलना में बहुत व्यापक गुंजाइश को कवर करते हैं)।
AD7six

35

Git रिवर्ट का उपयोग करें जैसे:

git revert <insert bad commit hash here>

git revert उन परिवर्तनों के साथ एक नई प्रतिबद्धता बनाता है जो वापस लुढ़क जाते हैं। git resetएक नई प्रतिबद्धता बनाने के बजाय आपके इतिहास को मिटा देता है।

के बाद के कदम किसी भी अन्य प्रतिबद्ध के समान हैं।


"एक कमिट को रिवर्ट करें" और "रिवर्ट टू ए कम" के बीच का अंतर इतना सूक्ष्म है कि मैं वर्षों तक इस कमांड से जूझता रहा। आपके स्पष्टीकरण ने इसे मेरे लिए तुरंत हल कर दिया। धन्यवाद!
क्लविस्का

24

एक ही बातचीत में बहुत सारे कारण resetऔर कारण revertसामने आते हैं क्योंकि विभिन्न संस्करण नियंत्रण प्रणालियां उन्हें अलग-अलग चीजों का मतलब देने के लिए उपयोग करती हैं।

विशेष रूप से, जो लोग SVN या P4 के लिए उपयोग किए जाते हैं, जो फ़ाइल में अनपेक्षित परिवर्तनों को दूर करना चाहते हैं, अक्सर revertयह बताया जाने से पहले पहुंच जाएगा कि वे वास्तव में चाहते हैं reset

इसी तरह, revertअन्य VCSes में rollbackसमान को अक्सर कहा जाता है या कुछ इसी तरह का - लेकिन "रोलबैक" का अर्थ यह भी हो सकता है "मैं पिछले कुछ कमिट्स को पूरी तरह से छोड़ना चाहता हूं", जो कि उपयुक्त है resetलेकिन नहीं revert। इसलिए, बहुत भ्रम की स्थिति है जहां लोग जानते हैं कि वे क्या करना चाहते हैं, लेकिन यह स्पष्ट नहीं है कि उन्हें इसके लिए किस कमांड का उपयोग करना चाहिए।

उल्टा के बारे में अपने वास्तविक सवालों के लिए के रूप में ...

ठीक है, आप git रिवर्ट का उपयोग करने जा रहे हैं लेकिन कैसे?

git revert first-bad-commit..last-bad-commit

और गिट रिवर्ट चलने के बाद आपको कुछ और करना होगा? क्या आपको किए गए परिवर्तनों को वापस करना है या रेपो को सीधे वापस करना है या क्या ??

डिफ़ॉल्ट रूप से, git revertआपको एक प्रतिबद्ध संदेश के लिए संकेत देता है और फिर परिणाम देता है। इसे ओवरराइड किया जा सकता है। मैं उद्धृत करता हूं आदमी पृष्ठ को करता :

--edit

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

--no-प्रतिबद्ध

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

यह तब उपयोगी होता है जब एक पंक्ति में आपके सूचकांक पर एक से अधिक प्रभाव डालता है।

विशेष रूप से, डिफ़ॉल्ट रूप से यह प्रत्येक कमिट के लिए एक नई कमिट बनाता है जिसे आप पुनः प्राप्त कर रहे हैं। आप उन revert --no-commitसभी परिवर्तनों को वापस करने के लिए उन परिवर्तनों को बनाने के लिए उपयोग कर सकते हैं जो व्यक्तिगत परिवर्तन के रूप में किए गए हैं, फिर अपने अवकाश पर प्रतिबद्ध हैं।


git revert first-bad-commit..last-bad-commit: मुझे लगता है कि यह होना चाहिए git revert parent-of-first-bad-commit..last-bad-commit
user1071847

9

सवाल काफी पुराना है लेकिन फिर भी लोगों को भ्रमित कर रहा है (मेरे जैसे)

एक शुरुआत के रूप में, कुछ परीक्षण और त्रुटि के बाद (परीक्षण से अधिक त्रुटियां) मुझे एक महत्वपूर्ण बिंदु मिला है:

  • git revertआवश्यकता है कि आप इसे अपने इतिहास में रखते हुए हटाना चाहते हैं

  • git resetउस कमिट की आवश्यकता होती है जिसे आप रखना चाहते हैं , और इसके बाद इतिहास से कुछ भी निकाल देंगे।

यही है, अगर आप उपयोग करते हैं revert पहली प्रतिबद्ध आईडी के साथ अपने आप को एक खाली निर्देशिका और इतिहास में एक अतिरिक्त प्रतिबद्ध पाएंगे, जबकि रीसेट के साथ आपकी निर्देशिका होगी .. प्रारंभिक प्रतिबद्ध पर वापस वापस आ जाएगी और आपका इतिहास ऐसा हो जाएगा जैसे अंतिम वचन कभी नहीं हुआ।

इस तरह एक लॉग के साथ और भी स्पष्ट होने के लिए:

# git log --oneline

cb76ee4 wrong
01b56c6 test
2e407ce first commit

डिफ़ॉल्ट रूप से उपयोग करने git revert cb76ee4से आपकी फ़ाइलें 01b56c6 पर वापस आ जाएँगी और आपके इतिहास में एक और प्रतिबद्धता जोड़ देंगी:

8d4406b Revert "wrong"
cb76ee4 wrong
01b56c6 test
2e407ce first commit

git reset 01b56c6 इसके बजाय अपनी फ़ाइलों को 01b56c6 पर वापस लाएगा और आपके इतिहास से उसके बाद किसी अन्य कमिट को साफ करेगा:

01b56c6 test
2e407ce first commit

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


मैंने उसी का अवलोकन किया है। यह वास्तव में भ्रामक है लेकिन इतना जानना महत्वपूर्ण है। अभी हाल ही में मुझे एक सहकर्मी की मदद करनी पड़ी और इस बारे में भूल गया। यह थोड़ा शर्मनाक था।
ExOfDe

1

मैंने कुछ 'हिट्स कमिट आईडी' चलाकर कमिट किया

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

तब मुझे रिवर्ट करने के लिए कहा गया (जैसे आप 'कमिट कमिट' चलाते समय)। मेरा डिफ़ॉल्ट टर्मिनल कार्यक्रम विम है इसलिए मैं भागा:

:wq 

अंत में मैंने परिवर्तन को रिपॉजिटरी के साथ धक्का दिया:

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