2010-02-23 11 views
562

को धक्का दे दिया गया है क्या प्रतिबद्ध है कि है एक विशेष पूर्ववत करने के लिए सबसे आसान तरीका है में प्रतिबद्ध:पूर्ववत करें एक विशेष Git कि दूरदराज के रेपोस

    सिर या HEAD
  • में
  • नहीं रिमोट को धक्का दे दिया गया है।

क्योंकि अगर ऐसा नहीं है नवीनतम प्रतिबद्ध,

git reset HEAD 

काम नहीं करता। और क्योंकि यह एक दूरस्थ करने के लिए धक्का दिया गया है,

git rebase -i 

और

git rebase --onto 

रिमोट में कुछ समस्या का कारण होगा।

और इसलिए, मैं वास्तव में इतिहास को संशोधित नहीं करना चाहता हूं। यदि कोई बुरा कोड था, तो यह इतिहास में था और देखा जा सकता है। मैं इसे काम करने की प्रतिलिपि में बस चाहता हूं, और मुझे एक रिवर्स मर्ज प्रतिबद्धता नहीं है।

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk 

जो रिवर्स उन संशोधन में सभी परिवर्तनों का विलय करके 302 करने के लिए 295 से सभी परिवर्तनों को निकाल देता है, एक नया प्रतिबद्ध के रूप में:

दूसरे शब्दों में, निम्नलिखित SVN आदेशों की Git बराबर क्या है।

svn merge -c -302 ^/trunk 

जो एक और जोड़कर नाश कर देती 302 पाठ्यक्रम के लिए प्रतिबद्ध, प्रतिबद्ध है कि रिवर्स विलीन हो जाती है कि संबंधित से परिवर्तन हो।

मैंने सोचा कि यह गिट में काफी सरल संचालन होना चाहिए और काफी आम उपयोग केस होना चाहिए। परमाणु काम का मुद्दा क्या है?

हमारे पास stashing स्टेजिंग है और यह सुनिश्चित करने के लिए कि काम पूरी तरह से परमाणु है, क्या आप आसानी से उन परमाणुओं में से एक या अधिक को पूर्ववत नहीं कर पाएंगे?

उत्तर

877

git log का उपयोग करके प्रतिबद्धता के हैश की पहचान करें, फिर इन परिवर्तनों को हटाते हुए एक नई प्रतिबद्धता बनाने के लिए git revert <commit> का उपयोग करें। एक तरह से, git revertgit cherry-pick के विपरीत है - बाद में उस शाखा को पैच लागू करता है जो इसे याद कर रहा है, पूर्व इसे उस शाखा से निकाल देता है जिसमें यह है।

+174

रूप में ही है और -n स्विच यदि का उपयोग आप कोड वापस चाहते हैं, लेकिन स्वचालित रूप से फिर से प्रतिबद्ध नहीं हैं – jaygooby

+9

"एम" विकल्प क्या करता है? मैंने 8213f7d को वापस करने की कोशिश की लेकिन इसे इसके बजाय मिला: त्रुटि: Commit 8213f7dad1ed546b434a0d8a64cb783b530a5a30 एक विलय है लेकिन नो-एम विकल्प दिया गया था। घातक: असफल – Malcolm

+1

'गिट हेल्प रिवर्ट' कहता है कि यह आपको उस विलय का कौन सा अभिभावक चुनने की अनुमति देता है जिसे आप वापस जाना चाहते हैं। आप माता-पिता को चुनने के बिना विलय को वापस नहीं कर सकते हैं। प्रलेखन –

32

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

266

मुझे ऑटो-प्रतिबद्धता पसंद नहीं है कि git revert करता है, इसलिए यह कुछ के लिए सहायक हो सकता है।

तुम सिर्फ स्वतः प्रतिबद्ध संशोधित फ़ाइलों चाहते हैं, आप उपयोग कर सकते हैं --no-commit

% git revert --no-commit <commit hash> 

जो -n

% git revert -n <commit hash> 
+6

तुम भी कर सकता है 'Git रीसेट HEAD ~ 1 --soft' आप पहले से ही' बिना -n' – Daniel

+1

लेकिन 'Git रीसेट HEAD ~ n' किसी भी नाश का समाधान नहीं होगा से लगातार लग नहीं रहा प्रतिबद्ध को वापस लाया गया है, तो सिर। सवाल किसी विशेष प्रतिबद्धता को वापस करना है। – sangeethkumarp

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