2010-09-03 13 views
185

git log के साथ, मुझे अब तक की गई प्रतिबद्धताओं की एक सूची मिलती है।गिट के साथ प्रतिबद्ध आईडी के आधार पर एक विशिष्ट प्रतिबद्धता पर वापस लौटना?

commit f5c5cac0033439c17ebf905d4391dc0705dbd5f1 
Author: prosseek 
Date: Fri Sep 3 14:36:59 2010 -0500 

    Added and modified the files. 

commit c14809fafb08b9e96ff2879999ba8c807d10fb07 
Author: prosseek 
Date: Tue Aug 31 08:59:32 2010 -0500 

    Just simple test for core.editor. 

... etc ... 
  • मैं कैसे इसे वापस एक विशिष्ट करने के लिए वापस कर सकते हैं के लिए प्रतिबद्ध? उदाहरण के लिए, यदि मैं commit c14809fafb08b9e96ff2879999ba8c807d10fb07 पर वापस जाना चाहता हूं तो मुझे क्या करना चाहिए?

  • क्या गिट के साथ एक विशिष्ट प्रतिबद्धता पर वापस जाने का कोई अन्य/बेहतर तरीका है? उदाहरण के लिए, क्या मैं लेबल के साथ इसे वापस लाने के लिए प्रत्येक प्रतिबद्धता का कुछ लेबल डाल सकता हूं?

+0

हालांकि इस सवाल का एक यह अब से अधिक उम्र के वास्तव में है एक डुप्लिकेट के रूप में चिह्नित, कि एक बेहतर जवाब है। http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-its-much-newer-and-ha/147651#147651 –

+2

यह है f - k'd up git (bwawok के उत्तर से) का एक आदर्श उदाहरण है: * "... यदि आप इसे किसी अन्य व्यक्ति को धक्का देना चाहते हैं जिसके पास नया इतिहास है, तो यह असफल हो जाएगा" *। यह अच्छा क्या है यदि आप इसे रिमोट रिपोजिटरी में वापस नहीं देख सकते ??? मैं बिल्कुल आश्चर्यचकित हूं कि गिट ने कितनी मुश्किल परिचालन की है। – jww

+1

@jww मैं सचमुच एक घंटे के लिए पढ़ रहा हूं कि पिछली प्रतिबद्धता पर वापस कैसे जाना है और मुझे अभी भी जवाब नहीं पता है। आप बिल्कुल सही हैं, गिट चीजों को इससे अधिक जटिल बना देता है। – robben

उत्तर

304

आपको लगता है कि राज्य के लिए अपने रेपो वापस रोल करना चाहते हैं? या आप बस अपने स्थानीय रेपो को ऐसा दिखाना चाहते हैं?

अगर आप

git reset --hard c14809fa 

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

यदि आप ऐसा

git reset --soft c14809fa 

यह अपने स्थानीय फ़ाइलों की तरह वे तो थे करने के लिए बदल कर देगा, लेकिन आपका इतिहास आदि एक ही छोड़ दें।

तो आप इस रीसेट के साथ वास्तव में क्या करना चाहते हैं?

संपादित करें -

आप .. अपने रेपो के लिए "टैग" जोड़ सकते हैं और फिर वापस एक टैग में जाते हैं। लेकिन एक टैग वास्तव में sha1 के लिए एक शॉर्टकट है।

आप इसे टैग 1 के रूप में टैग कर सकते हैं .. फिर git reset --soft c14809fa, git reset --soft TAG1, या git reset --soft c14809fafb08b9e96ff2879999ba8c807d10fb07 सभी एक ही काम करेंगे।

+1

मुझे उस स्थिति में वापस रोल करने की आवश्यकता थी। लेकिन यह जानना अच्छा है कि मेरे पास 'ऐसा दिखने' का विकल्प हो सकता है। मुझे बताने के लिए धन्यवाद। बीटीडब्ल्यू, डिफ़ॉल्ट क्या विकल्प है? सख्त या नरम? – prosseek

+1

@prosseek डिफ़ॉल्ट वास्तव में मिश्रित है। - मिश्रित इंडेक्स को रीसेट करता है लेकिन काम करने वाले पेड़ नहीं (यानी, बदली गई फाइलें संरक्षित हैं लेकिन प्रतिबद्ध के लिए चिह्नित नहीं हैं) और रिपोर्ट जो अपडेट नहीं की गई हैं। यह डिफ़ॉल्ट कार्रवाई है। देखें http://www.kernel.org/pub/software/scm/git/docs/git-reset.html – bwawok

+0

@prosseek: यदि रीसेट के विभिन्न तरीके आपके लिए थोड़ा उलझन में हैं, तो मैन पेज पढ़ने के बाद भी (ध्यान से!) आप इस अन्य प्रश्न का प्रयास कर सकते हैं http://stackoverflow.com/questions/2530060/can-you-explain-to-me-git-reset-in-plain-english – Cascabel

15

git reset c14809fafb08b9e96ff2879999ba8c807d10fb07 है क्या आप के बाद कर रहे हैं ...

+0

पूरे शा को टाइप करने की ज़रूरत नहीं है, बस थोड़ा सा काम करेगा – bwawok

+31

@bwawok: लेकिन यह एक संक्षिप्त SHA1 टाइप करने के बजाय चुनने और मध्यम-क्लिक-पेस्ट करने के लिए तेज़ है! – Cascabel

+3

क्या 'गिट पुश मूल मायब्रैंच' होगा तो मूल रेपो को वापस करने का कारण बन जाएगा? – javadba

2

आप इस मुद्दे को मजबूर करने के लिए चाहते हैं, आप कर सकते हैं:

git reset --hard c14809fafb08b9e96ff2879999ba8c807d10fb07 

तुम वापस कैसे अपना Git क्लोन चेकइन

+0

आपको किन मामलों को मजबूर करने की आवश्यकता होगी? – jacoballenwood

+1

"चेकइन के समय" का क्या अर्थ है? अस्पष्ट। यदि मैं "गिट रीसेट - हार्ड एक्स" करता हूं तो रेपो राज्य जैसा पहले एक्स को प्रतिबद्ध करता है या प्रतिबद्ध एक्स के बाद ... – nyholku

+0

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

117

मुझे लगता है कि के समय की तरह दिखाई देता करने के लिए भेजने के लिए, bwawok के जवाब गलत है कुछ बिंदु पर:

अगर आप

git reset --soft c14809fa 

यह आपकी स्थानीय फाइलों को तब तक बदल देगा जैसे वे थे, लेकिन अपना इतिहास इत्यादि छोड़ दें।

manual: git-reset के अनुसार

, "Git --soft रीसेट" ...

इंडेक्स फ़ाइल है और न ही सभी पर काम कर रहे पेड़ स्पर्श नहीं करता है (लेकिन रीसेट करता है < के लिए सिर के लिए प्रतिबद्ध >, जैसे सभी मोड करते हैं)।इससे आपकी सभी बदली गई फाइलें "परिवर्तन करने के लिए परिवर्तन" छोड़ देती हैं, क्योंकि गिट स्थिति इसे रखेगी।

तो यह शाखा से नए कामों को "हटा देगा"। इसका मतलब है, अपने पुराने कोड को देखने के बाद, आप आसानी से इस शाखा में नवीनतम प्रतिबद्धता पर नहीं जा सकते हैं। तो यह bwawok द्वारा वर्णित विरोध करता है: स्थानीय फाइलें नहीं बदली जाती हैं (वे "गिट रीसेट - सॉफ्ट" के ठीक पहले दिखती हैं), लेकिन इतिहास संशोधित है (निर्दिष्ट प्रतिबद्धता के बाद शाखा को छोटा कर दिया जाता है)।

आदेश bwawok के जवाब के लिए हो सकता है:

git checkout <commit> 

आप इस का उपयोग कर सकते हैं पुराने संशोधन पर नज़र करने के लिए: मेरे कोड देखो कैसे कल किया था?

(मुझे पता है, मैं इस सवाल का जवाब करने के लिए टिप्पणी में यह रखना चाहिए, लेकिन stackoverflow मुझे ऐसा करने के लिए अनुमति नहीं है! मेरे प्रतिष्ठा बहुत कम है।)

+1

अभी तक एक महान व्यक्ति है, एक कम प्रतिष्ठा :) – keni

+0

लेकिन 'गिट चेकआउट' केवल पढ़ा जाता है, इसलिए आप पुराने संशोधन नहीं कर सकते हैं। – robben

+0

@ पीटर ए: "गिट रीसेट - सॉफ्ट" के बाद "गिट चेकआउट" के बाद, मुझे उस फ़ाइल में कोई बदलाव नहीं दिख रहा है जिस पर मैं काम कर रहा हूं। क्या ऐसा हो सकता है क्योंकि मैं मास्टर शाखा में नहीं हूं? – moonman239

संबंधित मुद्दे