2012-05-02 16 views
41

यह एक बड़ी समस्या नहीं है, केवल कुछ मैं जानना चाहता हूं कि यह संभव है या नहीं।एकल प्रतिबद्धता के हिस्से के रूप में एकाधिक प्रतिबद्धताओं को वापस कैसे करें

मान लें कि हमारे पास दो काम हैं, abcd123 और wxyz789, जो कि रेपो के इतिहास में बहुत दूर, अलग-अलग स्थानों पर होते हैं। अब मान लें कि हम उन्हें वापस करना चाहते हैं।

git revert abcd123 wxyz789 

कर दो अलग-अलग करता में परिणाम होगा, एक abcd123 को पूर्ववत करने और अन्य wxyz789 को पूर्ववत।

यह सब ठीक है और ठीक है, लेकिन अगर हम दोनों कामों में जो गलतियों को ठीक करना चाहते हैं, वे तर्कसंगत रूप से जुड़े हुए हैं, और स्वयं-दस्तावेज के प्रयोजनों के लिए हम एक एकल प्रतिबद्धता बनाना चाहते हैं जिसमें एक एकल "मैंने कुछ तोड़ दिया तो अब मैं फाइलों को वापस कर रहा हूं x, y और z "टिप्पणी? क्या कोई गिट कमांड है जो यह करता है?

(। मैं निश्चित रूप से पता है कि इसे बनाने के लिए संभव है एक प्रतिबद्ध जहां मैं सिर्फ मैन्युअल रूप से सभी परिवर्तनों को ठीक है और फिर धक्का कर रहा हूँ यह सब obbious कारणों के लिए दर्दनाक होता है।)

+0

[एकाधिक गिट कमेट्स को वापस लाएं] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/1463340/revert-multiple-git-commits) –

+0

मैंने उस धागे को देखा। इसके और इसके बीच का अंतर यह है कि बिल हेड से कई फाइलों को बैकट्रैक करने की उम्मीद कर रहा है। मेरी गतिविधियां "रेपो के इतिहास में बहुत दूर, अलग-अलग जगहों पर" होती हैं। – JimmidyJoo

+1

और फिर भी, चुने गए उत्तर को दोबारा पढ़ना मुझे वह चाहिए जो मुझे चाहिए। - नो-प्रतिबद्ध झंडा मुझे चाहिए जो मुझे चाहिए। तो ... मैं अस्तित्व से हटाए जाने के लिए अपने प्रश्न को कैसे नामांकित करूं ?! – JimmidyJoo

उत्तर

52

आप कर सकते हैं:

git revert abcd123 
git revert --no-commit wxyz789 
git commit --amend 

... और उसके बाद एक उचित प्रतिबद्ध संदेश लिखें जो दोनों कामों को वापस करने के संयुक्त प्रभाव का वर्णन करता है।

+0

क्या यह 2 से अधिक काम करता है? –

+0

@ AntonI.Sipos हां, जितना आप चाहें। – Trufa

+17

अधिक संक्षेप: 'git revert abcd123 wxyz789 --no-commit' 'गिट प्रतिबद्ध' – rmp251

29

जटिल रिवर्ट के मामले में, जो एक दूसरे को बदलता है, revert --no-commit समस्याग्रस्त हो सकता है।

मेरे सरल उपाय असली पूर्ववत करने के लिए था, और स्क्वैश:

git revert <all commits> 
git rebase -i 

और फिर बनाने के लिए एकल के लिए प्रतिबद्ध, squash के रूप में सभी वापस आ निशान पहले एक को छोड़कर,।

+0

मुझे यह समाधान बहुत पसंद है! – monokrome

+1

+1। गिट शिक्षार्थियों के लिए: 1. जो कुछ भी करता है उस पर थोड़ा सा पढ़ें, 2. इंटरैक्टिव रिबेस के साथ कुशल बनें: स्क्वैशिंग, रिमूविंग, एडिटिंग, रीबेजिंग, री-ऑर्डरिंग। एक बार जब आप इसके बारे में परिचित हो जाते हैं (संकेत: यह सिर्फ समय यात्रा कर रहा है), यह समाधान '--no-commit' जैसी चीजों के साथ स्विच करने से कहीं अधिक प्राकृतिक हो जाता है। (और "प्रकाशित न करें" नियम से डरो मत - जब तक आप इसे अपनी स्थानीय या निजी शाखा में करते हैं, तो आप * कुछ भी * कर सकते हैं।) –

+1

** अतिरिक्त टिप्स: ** पहला 'pick' से' reword' में बदल दिया जा सकता है (एक नया प्रतिबद्ध संदेश दर्ज करने के लिए) या 'संपादित करें' (बिना किए गए परिवर्तनों को व्यवस्थित करने के लिए)। अन्य रिवर्ट्स के लिए, यदि आप प्रतिबद्ध संदेशों की परवाह नहीं करते हैं तो आप 'स्क्वैश' के बजाय' फिक्सअप 'का उपयोग कर सकते हैं। – ADTC

18
git revert -n <commits> 
git commit 

पहला आदेश सभी परिणामों को बिना किसी काम के बनाएगा और अंतिम परिणाम (-एन विकल्प) चरणबद्ध करेगा। उसके बाद, प्रतिबद्ध आदेश एक ही प्रतिबद्ध बनाता है।

+1

बिल्कुल सही। संक्षिप्त। और यह आपको अन्य प्रतिबद्धताओं के सुझाव देने के लिए वापस जाने के बजाय सभी रिवर्ट के बाद अपना प्रतिबद्ध संदेश जोड़ने देता है। –

+0

सिवाय इसके कि यह काम नहीं करता है। मुझे पिछले 5 कामों को वापस रोल करने की ज़रूरत है, जिनमें से 3 इन शानदार गिट विलय होते हैं जो तब भी होते हैं जब आप किसी एल्स परिवर्तन में खींचते हैं। तो '<###> प्रतिबद्ध' के साथ यह त्रुटियां एक मर्ज है लेकिन नो-एम विकल्प दिया गया है '। प्रत्येक विलय में दो माता-पिता होते हैं, जाहिर है मुझे यह निर्धारित करना होगा कि इनमें से प्रत्येक विलय के माता-पिता को मुझे रखने की आवश्यकता है। मैं यह भी कैसे काम करता हूं कि मैं इसे कैसे निर्दिष्ट करता हूं कि मैं इसे वापस करने के लिए निर्दिष्ट करता हूं, मुझे कोई जानकारी नहीं है। – Neutrino