2012-04-17 20 views
23

मेरे पास एक वेब सर्वर है जो एक गिट रिपोजिटरी प्रोजेक्ट परोसता है। जब मैं कोड में कुछ बदलाव करता हूं तो मैं सर्वर से एक गिट खींचता हूं। कभी-कभी नया कोड बस दुर्घटनाग्रस्त हो जाता है, मैं नवीनतम खींचने के लिए रोलबैक करने में सक्षम होना चाहता हूं, पहले एक ही। मैं इसे एक स्क्रिप्ट के साथ करना चाहता हूं, बिना खोज के नवीनतम शाका क्या है। मैं उसे कैसे कर सकता हूँ?गिट रोलबैक 1 पुल

संपादित करें: बस स्पष्ट करने के लिए, मैं सिर्फ एक बटन करना चाहता हूं, जैसे कि "ओह! यह नवीनतम खींच मैंने अभी गलती की थी, मेरी इच्छा है कि मैंने ऐसा नहीं किया"। मैं इस स्थिति में शा या टैग या कुछ और देखना नहीं चाहता हूं, यह एक 'पूर्ववत' फ़ंक्शन की तरह है। फिर मैं कोड पर काम करना जारी रखने में सक्षम होना चाहता हूं और सर्वर पर अगली खींच नवीनतम परिवर्तन लाने की जरूरत है।

उत्तर

52

git reset --hard HEAD^1 आपको खींचने से एक प्रतिबद्धता वापस ले जाएगा। यदि आप इसे वापस राज्य में चाहते हैं तो इसे खींचने से पहले, git reset --hard [email protected]{1} का उपयोग करें। @{1} ट्रैक जहां सिर पिछले ऑपरेशन से पहले था, जो इसे आपके स्थानीय रेपो में बदल गया था, इसलिए यदि आपके खींचने से पहले कई को धक्का दिया गया तो यह कई काम करता है। पूरी सूची दिखाने के लिए git reflog भी देखें।

+1

बहुत रोचक, और फिर मैं सामान्य ऑपरेशन पर कैसे वापस आऊंगा? मेरा मतलब है कि अगर खराब कोड पर कुछ सुधार करते हैं, तो क्या मैं बस सर्वर पर जा सकता हूं और नवीनतम परिवर्तनों को पाने के लिए फिर से एक गिट खींच सकता हूं? – Bastian

+3

हां, यह आपके जैसे राज्य में कभी नहीं खींचा जाएगा, इसलिए आप जो भी सामान्य रूप से करेंगे, वह किया जा सकता है। –

2

git reset HEAD^ आपको पिछली प्रतिबद्धता पर ले जाना चाहिए। अधिक जानकारी के लिए here देखें।

+0

यह वास्तव में 'Git --hard HEAD ^' रीसेट कर रहा है, जब तक आप अपने कार्यशील निर्देशिका को छूने के लिए नहीं करना चाहती निष्पादित। –

+0

इस सवाल के मुताबिक रेपो को किसी समस्या के कारण रोलबैक की आवश्यकता होती है, इसलिए काम करने वाली निर्देशिका खाली होनी चाहिए। –

0

ऐसा करने का एक और तरीका टैग का उपयोग करना शामिल होगा। विचार यह है कि आप पुल से पहले कुछ संस्करण संख्या के साथ अपने सिर को टैग कर सकते हैं, पुल करें, फिर यदि आपको हेड वापस रोल करने की आवश्यकता है तो आप git reset {tag name} कर सकते हैं इस तरह यदि पुल में कई काम करता है तो आप उस स्थान पर वापस जा सकते हैं जहां आप थे विलय से पहले।

2

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

git fetch --all   # fetch new commits from remote 
git checkout -b testing # create and switch to branch 'testing' 
git merge origin/master # merge new commits from remote branch master 
          # (in branch 'testing') 

... तो परीक्षण सामान ... अगर सफलता:

git checkout master  # switch back to master 
git merge testing 

और विफलता पर:

git checkout master 
git branch -D testing  # remove testing branch 

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

+0

यहां अच्छा बिंदु, यह वह नहीं है जो मैं सोच रहा था लेकिन बहुत अच्छी तरह से काम कर सकता था। मैं कोशिश करूँगा और सबसे सरल विधि के साथ जाऊंगा। – Bastian

1

@ करल Bielefeldt द्वारा स्वीकृत उत्तर वास्तव में मेरे लिए काम नहीं किया था। मैं जीआईटी संस्करण 2.10.0 का उपयोग कर रहा हूं। विन्डोज़ .यह पुराने संस्करणों के लिए काम किया जा सकता है। मुझे "अज्ञात स्विच 'ई' त्रुटि मिल रही है। अंत में, मैंने कुछ बदलाव किए और यह काम किया।

  1. उपयोग git reflog सूची देखने के लिए के रूप में कार्ल उल्लेख किया:

    नीचे पिछले पुल से पहले राज्य को वापस करना कदम हैं।

  2. उस सूची से प्रतिबद्ध संस्करण चुनें जिसे आप वापस ले जाना चाहते हैं।
  3. git reset --hard <commit version>
संबंधित मुद्दे