सार्वजनिक रिपो में एक पुराने Git के लिए रोलबैक


802

मैं git में किसी विशिष्ट कमिट के लिए वापस कैसे जा सकता हूं ?

सबसे अच्छा जवाब कोई मुझे दे सकता है git revertजब तक कि मैं वांछित प्रतिबद्धता तक नहीं पहुंच गया।

तो हम कहते हैं कि मैं एक कमिट पर वापस जाना चाहता हूं जो 20 साल पुराना है, मुझे इसे 20 बार चलाना होगा।

क्या इसे करने का कोई आसान रास्ता है?

मैं रीसेट का उपयोग नहीं कर सकता क्योंकि यह भंडार सार्वजनिक है।


1
git रिवर्ट <प्रतिबद्ध> काम नहीं करता है?
मिकू

8
जैसा कि मेरे प्रश्न में कहा गया है, यह वास्तव में मेरी मदद नहीं करता है अगर मैं कुछ वापस आने से पहले कुछ करना चाहता हूं।
डेविड

7
इस सवाल का यहाँ बहुत अच्छी तरह से उत्तर दिया गया है stackoverflow.com/questions/4114095/…
user7610

4
यह स्पष्ट नहीं है कि "रोलिंग बैक" से आपका क्या मतलब है। क्या इसका मतलब है कि आप अपनी कार्यशील प्रति को अस्थायी रूप से एक विशेष संशोधन में बदलना चाहते हैं? या आप अपने भंडार के इतिहास को स्थायी रूप से एक निश्चित संशोधन के लिए वापस करना चाहते हैं?

1
आपको एक उत्तर को स्वीकार करना चाहिए, और संभवत: आपके द्वारा पसंद किए गए किसी अन्य उत्तर को वोट करें।
नबील कदीमी

जवाबों:


1193

इसे इस्तेमाल करे:

git checkout [revision] .

[revision]प्रतिबद्ध हैश कहाँ है (उदाहरण के लिए:) 12345678901234567890123456789012345678ab

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

आप इसे पूर्ववत कर सकते हैं

git reset --hard 

यह कार्यशील निर्देशिका और मंचन क्षेत्र से सभी संशोधनों को हटा देगा।


7
@AlexReisner आप जिस निर्देशिका में हैं उस बिंदु के अंत में वह अवधि, जो जरूरी नहीं कि पूरी git परियोजना हो, सही है? यदि आप पूरे प्रोजेक्ट में परिवर्तन लागू करना चाहते हैं, तो क्या आप इसके बजाय ': /' का उपयोग 'git add: /' में करेंगे, यदि आप वर्तमान में git प्रोजेक्ट रूट में नहीं थे?
MSpreij

10
ध्यान दें: यदि आपने तब से अपनी परियोजना में नई फाइलें जोड़ी हैं, तो यह उन्हें नष्ट नहीं करेगा। इसलिए जब आप निर्माण करने जाते हैं (आपके प्लेटफॉर्म पर निर्भर करता है), तब भी आपको त्रुटियां हो सकती हैं। नई फ़ाइलों को हटाएँ और आप जाने के लिए अच्छे हैं।
TheWestIsThe ...

6
@MSpreij आपको git प्रोजेक्ट रूट में इस कमांड को निष्पादित करना चाहिए। यदि आप किसी भी उप निर्देशिका में हैं, तो यह कमांड केवल वर्तमान निर्देशिका में फ़ाइलों को बदलता है।
वाष्पशीलवार

3
यह बहुत अच्छा है जब आप किसी प्रोजेक्ट को किसी अन्य निर्देशिका में क्लोन कर सकते हैं और गिट चेकआउट [संशोधन] का उपयोग कर सकते हैं। एक विशिष्ट संशोधन पर वापस जाने के लिए और फिर उसी परियोजना के साथ अन्य निर्देशिका में तुलना करें। बहुत समय बचता है।
डोनाटो

4
लानत है, मैं भूल गया "।" मेरी रिपॉजिटरी से मुझे क्या नुकसान है?
उल्लू

196

किसी विशिष्ट कमिट पर रोलबैक करने के लिए:

git reset --hard commit_sha

रोलबैक करने के लिए 10 वापस आते हैं:

git reset --hard HEAD~10

यदि आप इतिहास को फिर से लिखना नहीं चाहते हैं तो आप निम्नलिखित पोस्ट में "git revert" का उपयोग कर सकते हैं

पूर्ववर्ती कमिट में Git रिपॉजिटरी को वापस कैसे करें?


4
इस दृष्टिकोण और "गिट चेकआउट [संशोधन] के बीच केवल अंतर।" यह है कि उत्तरार्द्ध संशोधन को संरक्षित करता है।
शांक

53
यह उत्तर गलत है क्योंकि ओपी विशेष रूप से कहता है "मैं रीसेट का उपयोग नहीं कर सकता क्योंकि यह रेपो सार्वजनिक है"
यारिन

4
यदि रेपो सार्वजनिक है, तो मुझे लगता है कि सार्वजनिक पुश पर कमिटमेंट को बल पुश (git पुश -f) का उपयोग किए बिना रोलबैक करने का कोई तरीका नहीं है क्योंकि यह उन लोगों को प्रभावित करेगा जो रोलबैक से पहले परिवर्तनों में खींच चुके हैं। इसलिए, रीसेट का उपयोग सार्वजनिक रेपो के स्थानीय सैंडबॉक्स में भी किया जा सकता है।
नागा किरण

4
यह बहुत अच्छा है कि यह एक अलग सिर से बचा जाता है! मुझे इसकी ही खोज थी।
साइबर-भिक्षु

1
मेरे मामले में यह काम किया है, फिर 'git पुल' का उपयोग तेजी से आगे पीछे करने के लिए करें जब तक आप परीक्षण regressions, आदि।
पीटर क्विंग

86

खैर, मुझे लगता है कि सवाल यह है कि 'रोल बैक' से आपका क्या मतलब है? यदि आप ऐसा नहीं कर सकते हैं resetक्योंकि यह सार्वजनिक है और आप प्रतिबद्ध इतिहास को अक्षुण्ण रखना चाहते हैं, तो क्या आपका मतलब है कि आप केवल एक विशिष्ट प्रतिबद्धताओं को दर्शाने के लिए अपनी कार्यशील प्रति चाहते हैं? उपयोग करें git checkoutऔर प्रतिबद्ध हैश।

संपादित करें: जैसा कि टिप्पणियों में कहा गया था, git checkoutएक शाखा को निर्दिष्ट किए बिना उपयोग करने से आप "बिना शाखा" राज्य में चले जाएंगे। git checkout <commit> -b <branchname>किसी शाखा में चेकआउट करने के लिए, या git checkout <commit> .वर्तमान शाखा में चेकआउट करने के लिए उपयोग करें ।


क्या यह आपको अजीब 'वर्तमान में किसी भी शाखा में नहीं' स्थिति में डाल देता है? रोलबैक को पूरा करने के लिए आप कैसे बदलाव करते हैं?
एलेक्स रीस्नर

ठीक है, मैं सिर्फ इसके उपयोग का सुझाव दे रहा हूं git checkout- वह किसी भी शाखा (वर्तमान या नए) में जांचने के लिए स्वतंत्र है कि वह क्या चाहता है। मैं अपना उत्तर अपडेट करूंगा ताकि यह अस्पष्ट न हो।
बेन

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

3
यदि आप एक कार्यशील निर्देशिका में हैं और आप मास्टर में रह रहे हैं, तो आपको git resetउन फ़ाइलों को हटाने की आवश्यकता है, जो आप कहते हैं कि आप करना नहीं चाहते हैं। इसे एक अलग शाखा में करने का प्रयास करें:, git checkout <commit> -b <branchname>आपके पास उस शाखा में स्थिर फाइलें नहीं होंगी ।
बेन

2
उपयोग करने checkoutमें समस्या यह है कि यह उन फ़ाइलों को नहीं हटाएगा, जिन्हें पिछली प्रतिबद्ध में जोड़ा गया था।

42

मूल पोस्टर में कहा गया है:

सबसे अच्छा जवाब कोई मुझे दे सकता है git revertजब तक कि मैं वांछित प्रतिबद्धता तक नहीं पहुंच गया।

तो हम कहते हैं कि मैं एक कमिट पर वापस जाना चाहता हूं जो 20 साल पुराना है, मुझे इसे 20 बार चलाना होगा।

क्या इसे करने का कोई आसान रास्ता है?

मैं रीसेट का उपयोग नहीं कर सकता क्योंकि यह रेपो सार्वजनिक है।

git revertएक्स का उपयोग करना आवश्यक नहीं है । git revertएक तर्क के रूप में एक प्रतिबद्ध सीमा को स्वीकार कर सकते हैं, इसलिए आपको केवल एक बार कमिट्स को वापस करने के लिए इसका उपयोग करने की आवश्यकता है। उदाहरण के लिए, यदि आप पिछले 20 कमिट्स को वापस करना चाहते हैं:

git revert --no-edit HEAD~20..

प्रतिबद्ध सीमा HEAD~20..कम है HEAD~20..HEAD, और इसका मतलब है " हेड के 20 वें माता-पिता से शुरू करें, और एचएएडी तक आने के बाद सभी कमिट्स को वापस कर दें"।

पिछले 20 कमिट्स को यह कहते हुए वापस कर दिया जाएगा कि उनमें से कोई भी मर्ज कमिट नहीं है। यदि मर्ज कमिट हैं, तो आप उन सभी को एक आदेश में वापस नहीं ला सकते हैं, आपको उन्हें अलग-अलग के साथ वापस करना होगा

git revert -m 1 <merge-commit>

यह भी ध्यान दें कि मैंने git revertgit संस्करण 1.9.0 का उपयोग करके एक श्रेणी का उपयोग करके परीक्षण किया है । यदि आप git के पुराने संस्करण का उपयोग कर रहे हैं, तो किसी श्रेणी के साथ git revertकाम कर सकते हैं या नहीं कर सकते हैं।

इस मामले में, git revertअधिक पसंद किया जाता है git checkout

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

प्रलेखन


नोट : यह नए बदलावों के साथ एक नई प्रतिबद्धता बनाता है । ओपी के सवाल के लिए बिल्कुल सही। लेकिन सुनिश्चित करें कि आप क्या चाहते हैं। (ऊपर दिए गए git-revert doc में उदाहरण बहुत बढ़िया हैं।) यदि आप इसके बजाय पूर्व के कमिट (यानी क्या चुनने के लिए प्रतिबद्ध होने से पहले) की जांच करना चाहते हैं, तो अन्य उत्तरों में उल्लिखित चेकआउट विकल्प का उपयोग करें, दूसरों की टिप्पणियों को ध्यान में रखते हुए। हटाई गई फ़ाइलों के बारे में।
शेरलहोमन

@SherylHohman पिछली कमिट पर वापस जाने से नई कमिट नहीं बनती। मैं कल्पना नहीं कर सकता कि आप यहाँ क्या मतलब है।

27

चरण 1: कमिट की सूची प्राप्त करें:

git log

आपको इस उदाहरण में सूची मिलेगी:

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <author@gmail.com>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <author@gmail.com>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <author@gmail.com>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

चरण 2: आवश्यक हैश की प्रतिलिपि बनाएँ और चेकआउट के लिए पेस्ट करें:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

बस इतना ही।


11
git read-tree -um @ $commit_to_revert_to

करूंगा। यह "git चेकआउट" है, लेकिन HEAD को अपडेट किए बिना।

आप उसी प्रभाव को प्राप्त कर सकते हैं

git checkout $commit_to_revert_to
git reset --soft @{1}

यदि आप स्ट्रिंगिंग सुविधा कमांड को एक साथ पसंद करते हैं।

ये आपको अपने वर्कट्री और इंडेक्स के साथ वांछित स्थिति में छोड़ देते हैं, आप बस git commitखत्म कर सकते हैं ।


यह एकमात्र सीधा दृष्टिकोण है जो एक आकर्षण की तरह काम करता है! मैंने सिर से जांच की, इस कमांड को चलाया, और इसने उन फ़ाइलों को सफलतापूर्वक हटा दिया जिन्हें हमने पेश किया था और सभी परिवर्तनों को वापस कर दिया था। अति उत्कृष्ट।
कामरानिकस

6

HEAD अलग मोड चाहते हैं?

यदि आप एक्सट्रीमेड हेड (जिसका अर्थ है कि आप कुछ भी गड़बड़ नहीं कर सकते हैं) के साथ एक निश्चित कमिट के लिए एक्स टाइम रोल करना चाहते हैं, तो सभी तरीकों से, निम्नलिखित का उपयोग करें:

(एक्स को बदलें कि आप वापस जाने की कितनी इच्छा रखते हैं)

git checkout HEAD~X

IE एक प्रतिबद्ध वापस जाने के लिए:

git checkout HEAD~1

1
मैं उस भाग को हटा दूंगा ... जिस पर विश्वास करना मुश्किल है ... यह व्यक्तिगत लगता है, और किसी ने इसका उल्लेख ऊपर टिप्पणी में भी किया है, और @ken में भी अपने उत्तर में।
meJustAndrew

@meJustAndrew यह एसओ पर बहुत सारे जवाब है जो सिर्फ लोगों को भ्रमित करता है, यह काफी कष्टप्रद है।
कार्ल मॉरिसन

क्या एक सरल और सीधे आगे जवाब।
अम्माद

2

मान लीजिए कि आप किसी प्रोजेक्ट पर और एक-एक दिन बाद काम करते हैं। आपने देखा कि एक विशेषता अभी भी आपको त्रुटियां दे रही है। लेकिन आपको नहीं पता कि आपने क्या परिवर्तन किया है जो त्रुटि का कारण बना। तो आपको पिछले काम करने वाले मछली को मछली मारना होगा। किसी विशिष्ट कमिट पर वापस लौटने के लिए:

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

ठीक है, तो यह आपके लिए काम करता है। और कोई त्रुटि नहीं। आपने इस मुद्दे पर चुटकी ली। अब आप नवीनतम प्रतिबद्ध पर वापस जा सकते हैं:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

और त्रुटि के कारण एक विशिष्ट फ़ाइल को चेकआउट करें (मेरे मामले में मैं उदाहरण के लिए Gemfile.lock का उपयोग करता हूं):

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

और बाद में त्रुटियों का एहसास किए बिना आपके द्वारा बनाई गई त्रुटियों को संभालने का यह एक तरीका है।


2

आप GitHub / BitBucket / Gitlab के कमिट अनुभाग में प्रत्येक कमेटी से संबंधित प्रतिबद्ध आईडी पा सकते हैं। यह बहुत ही सरल है, मान लें कि आपकी कमिट आईडी 5889575 है, यदि आप अपने कोड में इस भाग में वापस जाना चाहते हैं तो आपको टाइप करने की आवश्यकता है

git checkout 5889575 .

यह आपके कोड में उस समय तक ले जाएगा।


1

मुझे यकीन नहीं है कि क्या बदल गया है, लेकिन मैं विकल्प के बिना एक विशिष्ट प्रतिबद्धताओं की जांच करने में असमर्थ हूं --detach। मेरे लिए काम करने वाली पूरी कमान थी: git checkout --detach [commit hash]

अलग राज्य से वापस जाने के लिए मुझे अपनी स्थानीय शाखा की जाँच करनी थी: git checkout master


जाँच करना masterशेष डिटैच की समस्या को हल करता है, जबकि काम किया है git reset --hardया git checkout -- .किया है लेकिन अलग किया गया है
डार्ककैग्नस

0

यहाँ ऐसा करने के लिए एक उदाहरण है

    cd /yourprojects/project-acme 


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