रोलबैक ए गेट मर्ज


225
develop branch
--> dashboard (working branch)

मैं git merge --no-ff developडैशबोर्ड में किसी भी अपस्ट्रीम परिवर्तन को मर्ज करने के लिए उपयोग करता हूं

गिट लॉग:

commit 88113a64a21bf8a51409ee2a1321442fd08db705
Merge: 981bc20 888a557
Author: XXXX <>
Date:   Mon Jul 30 08:16:46 2012 -0500

    Merge branch 'develop' into dashboard

commit 888a5572428a372f15a52106b8d74ff910493f01
Author: root <root@magneto.giveforward.com>
Date:   Sun Jul 29 10:49:21 2012 -0500

    fixed end date edit display to have leading 0

commit 167ad941726c876349bfa445873bdcd475eb8cd8
Author: XXXX <>
Date:   Sun Jul 29 09:13:24 2012 -0500

मर्ज इसमें लगभग 50+ था, और मैं सोच रहा था कि मर्ज को वापस कैसे लाया जाए ताकि डैशबोर्ड वापस पूर्व-मर्ज में चला जाए

इसका दूसरा भाग है, अगर मैं साथ विलय नहीं करता हूं, तो मुझे --no-ff' मर्ज शाखा' को 'डैशबोर्ड में विकसित' करने के लिए प्रतिबद्ध नहीं मिलता है .. मैं उस विलय को वापस कैसे लाऊंगा?


3
पूर्ववत की संभावित डुप्लिकेट एक मर्ज मर्ज?

जवाबों:


321

मर्ज कमेटी को वापस लाकर अन्य प्रश्नों में विस्तृत रूप से शामिल किया गया है जब आप तेजी से आगे मर्ज करते हैं, तो दूसरा जो आप वर्णन करते हैं, आप git resetपिछली स्थिति में वापस लाने के लिए उपयोग कर सकते हैं :

git reset --hard <commit_before_merge>

आप पा सकते हैं <commit_before_merge>के साथ git reflog, git logया, आप Moxy महसूस कर रहे हैं (और किया कुछ और नहीं किया है):git reset --hard HEAD@{1}


6
त्वरित उत्तर के लिए धन्यवाद .. git लॉग को देखते हुए, मर्ज से पहले की प्रतिबद्धता 50+ वापस आती है, क्योंकि git मर्ज का विकास वास्तव में अन्य सभी कमिटों में होता है। मुझे लगता है कि मुझे जो नहीं मिलता है, अगर मुझे नहीं पता कि क्या / जहां वह मर्ज था - मैं इसे कैसे खोजूं? आपने कमेटी_बीज_मरेज को खोजने का उल्लेख किया है। मुझे लगता है कि मैं उस हिस्से को नहीं समझ रहा हूं
cgmckeever

4
गिट रिफ्लग के साथ ऐसा लगता है कि यह पिछले प्रमुखों को अच्छी तरह से सारांशित करता है, और मुझे यह जानने की अनुमति देता है कि मुझे कहाँ रीसेट करने की आवश्यकता है। लगता है कि लॉग को रीसेट करने के लिए जगह को इंगित करने के लिए बहुत अधिक ग्रैन्युलैरिटी है। धन्यवाद
cgmckeever

1
हाँ, reflogएक जीवन रक्षक है। HEAD@{1}बस HEAD के दूसरे सबसे हाल के राज्य का वर्णन करता है, या अधिक तकनीकी रूप से: "ब्रेस जोड़ी में संलग्न एक अध्यादेशीय विनिर्देश के साथ प्रत्यय @ के बाद एक रेफरी (जैसे {1}, {15}) एन-वें पूर्व मूल्य को निर्दिष्ट करता है संदर्भ।"
क्रिस्टोफर

4
रिमोट को वापस लाने के बारे में क्या? मैं यह नहीं देखता कि यह कैसे काम करेगा।
एंटोन Savelyev

2
यह निराशाजनक है। यह मर्ज के बाद सभी आवागमन को नष्ट कर देता है।
आका १२२०४

151

यहां से:

http://www.christianengvall.se/undo-pushed-merge-git/

git revert -m 1 <merge commit hash>

Git रिवर्ट एक नई कमिट जोड़ता है जो निर्दिष्ट कमिट को वापस करता है।

उपयोग -m 1 यह बताता है कि यह एक मर्ज है और हम मास्टर ब्रांच पर माता-पिता की ओर वापस लौटना चाहते हैं। आप विकसित शाखा को निर्दिष्ट करने के लिए -m 2 का उपयोग करेंगे।


30
ध्यान दें कि आप इसके बाद शाखा को फिर से मर्ज नहीं कर सकते हैं, जैसा कि डॉक्स कहते हैं: "मर्ज कमिट की घोषणा करते हुए कहा कि आप कभी नहीं चाहेंगे कि मर्ज द्वारा लाया गया पेड़ परिवर्तन हो। नतीजतन, बाद में मर्ज केवल पेड़ के परिचय में लाएगा। उन कमिटों द्वारा जो पूर्ववर्ती मर्ज के पूर्वज नहीं हैं। यह वही हो सकता है जो आप चाहते हैं। "
दलिबोर कारलोवीक

23
@ DaliborKarlović यह कथन थोड़ा कठोर है। आप निश्चित रूप से उन परिवर्तनों को बाद में वापस ला सकते हैं, चाल वापस करने के लिए प्रतिबद्ध है। अनुभाग में यहां अधिक जानकारी "
रिवर्टिंग द रिवर्टिंग

3
अफसोस की बात hereहै कि @Hilikus टिप्पणी में लिंक अब मान्य नहीं है। साइट का दावा है कि सामग्री किसी पुस्तक ( git-scm.com/book/en/v2 ) पर स्थानांतरित हो गई है , लेकिन यदि ऐसा है, तो यह वहाँ का पता लगाने के लिए गैर-तुच्छ है।
जेसी चिशोल्म

@ DaliborKarlović क्या यह मामला @Christopher से ऊपर का जवाब है?
जेम्स बी

3
पूर्ववत मर्ज सामग्री को यहां
SEK

28

बस के साथ मर्ज कमिट रीसेट करें git reset --hard HEAD^

यदि आप उपयोग करते हैं - तो एफएफ गिट हमेशा एक मर्ज बनाता है, भले ही आपने बीच में कुछ भी नहीं किया हो। बिना -नो-एफएफ गिट सिर्फ एक तेजी से आगे करेगा, जिसका अर्थ है कि आपकी शाखाएं मर्ज की गई शाखा के सिर पर सेट की जाएंगी। इसे हल करने के लिए आप जिस ई-आईडी को वापस करना चाहते हैं, उसे खोजें git reset --hard $COMMITID


1
अच्छा समाधान अगर आप मर्ज से पहले कमिटमेंट नहीं जानते हैं।
iglesiasedd

मेरे लिए काम किया क्योंकि मैं आईडी नहीं जानता। + 1
अनंत सिंह ---

यदि अवांछित मर्ज पहले से ही रिमोट के लिए प्रतिबद्ध था, तो मैंने gver के पुश -f का उपयोग करने के बाद रिमोट ब्रांच को अपडेट किया।
जुमेक

16
git revert -m 1 88113a64a21bf8a51409ee2a1321442fd08db705

लेकिन अप्रत्याशित दुष्प्रभाव हो सकते हैं। Git-scm.com/docs/git-revert--mainline parent-number में विकल्प देखें

शायद एक प्रतिबद्ध लेकिन प्रभावी तरीका यह होगा कि उस प्रतिबद्ध के बाएं माता-पिता की जांच HEADकरें, सभी फाइलों की एक प्रति बनाएं, फिर से चेकआउट करें और सभी सामग्रियों को पुरानी फाइलों से बदल दें। फिर git आपको बताएगा कि क्या रोल किया जा रहा है और आप अपनी खुद की रिवर्ट कमेटी बनाएं :)!


1
+1 क्योंकि यह उत्तर इतिहास के साथ खिलवाड़ नहीं करता है जैसा कि रीसेट करता है (वास्तव में यदि आप पहले से ही रिमोट में धकेल दिए गए हैं तो यह महत्वपूर्ण है)। लेकिन मुझे क्या अप्रत्याशित दुष्प्रभाव की उम्मीद करनी चाहिए?
13

3
क्या यह साइड-इफ़ेक्ट आपने उल्लेख किया है? Reverting a merge commit declares that you will never want the tree changes brought in by the merge. As a result, later merges will only bring in tree changes introduced by commits that are not ancestors of the previously reverted merge. This may or may not be what you want.
14

1
आप कहते हैं git resetकि समाधान है, लेकिन यह भी उल्लेख है कि यह अप्रत्याशित दुष्प्रभाव हो सकता है। हालाँकि, वह लिंक :) से git revertनहीं हैgit reset
मार्क

2
कृपया ध्यान दें, git रीसेट में -m ध्वज नहीं है। यह भी ध्यान दें @JorgeOrpinel git-revert डॉक्स का संदर्भ देता है, न कि git-reset का। मुझे लगता है कि वह कहने का मतलब git revertनहीं थाgit reset
डेविन ग्लेंसन लैम्बर्ट

मेनलाइन से बचने के लिए कैसे निर्दिष्ट किया गया था लेकिन प्रतिबद्ध 1234xyz एक मर्ज त्रुटि नहीं है
आंचल

0

यदि आपने शाखा को मर्ज कर दिया है, तो एक पुल अनुरोध का उपयोग करके मर्ज को वापस कर दिया और उस पुल के विलय को वापस करने के लिए मर्ज कर दिया।

सबसे आसान तरीका मुझे लगा:

  1. विकसित / मास्टर (जहां आप विलय किया गया है) से एक नई शाखा निकालें
  2. "रिवर्ट" का उपयोग करके वापस लौटें git revert -m 1 xxxxxx (यदि रिवर्ट को एक शाखा का उपयोग करके विलय कर दिया गया था) या git revert xxxxxxअगर यह एक साधारण रिवर्ट था
  3. नई शाखा में अब वे परिवर्तन होने चाहिए जिन्हें आप फिर से मर्ज करना चाहते हैं।
  4. परिवर्तन करें या इस शाखा को विकसित / मास्टर करने के लिए मर्ज करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.