मुझे इस लिंक से मर्ज को वापस लाने के लिए अच्छी व्याख्या मिली और मैंने नीचे दिए गए स्पष्टीकरण को कॉपी किया और यदि नीचे लिंक काम नहीं करता है तो यह उपयोगी होगा।
एक दोषपूर्ण विलय को वापस कैसे करें
एलन (alan@clueserver.org) ने कहा:
मेरी एक मास्टर ब्रांच है। हमारी एक शाखा है जो कुछ डेवलपर्स काम कर रहे हैं। उनका दावा है कि यह तैयार है। हम इसे मास्टर शाखा में विलय कर देते हैं। यह कुछ तोड़ता है इसलिए हम मर्ज वापस कर देते हैं। वे कोड में परिवर्तन करते हैं। वे इसे एक बिंदु पर ले जाते हैं, जहां वे कहते हैं कि यह ठीक है और हम फिर से विलय कर देते हैं। जब जांच की जाती है, तो हम पाते हैं कि रिवर्ट से पहले किए गए कोड परिवर्तन मास्टर ब्रांच में नहीं होते हैं, लेकिन मास्टर ब्रांच में कोड परिवर्तन के बाद होते हैं। और इस स्थिति से उबरने के लिए मदद मांगी।
"मर्ज के वापस आने" के तुरंत बाद का इतिहास इस तरह दिखेगा:
---o---o---o---M---x---x---W
/
---A---B
जहाँ A और B उस साइड डेवलपमेंट पर हैं जो इतना अच्छा नहीं था, M वह मर्ज है जो इन प्रीमेच्योर बदलावों को मेनलाइन में लाता है, x उन परिवर्तनों से असंबंधित है जो साइड ब्रांच ने किए थे और पहले से ही मेनलाइन पर किए गए थे, और W "है" मर्ज M के पीछे "(W, M को उल्टा नहीं देखता है?)। IOW, "diff W ^ .. W" "diff -RM ^ .. M" के समान है।
इस तरह के एक "वापसी" के साथ बनाया जा सकता है:
$ git रिवर्ट -m 1 M
साइड शाखा के डेवलपर्स अपनी गलतियों को ठीक करने के बाद, इतिहास इस तरह दिख सकता है:
---o---o---o---M---x---x---W---x
/
---A---B-------------------C---D
जहाँ C और D को A और B में जो टूट गया था उसे ठीक करना है, और W के बाद मेनलाइन पर आपके पास पहले से ही कुछ अन्य बदलाव हो सकते हैं।
यदि आप अपडेटेड साइड ब्रांच (इसके टिप पर D के साथ) को मर्ज करते हैं, तो ए या बी में किए गए परिवर्तनों में से कोई भी परिणाम में नहीं होगा, क्योंकि वे डब्ल्यू द्वारा वापस कर दिए गए थे।
लिनस स्थिति बताते हैं:
नियमित रूप से कमिट करना केवल प्रभावी ढंग से कम करता है जो कि किया, और काफी सीधा है। लेकिन एक मर्ज कमिटमेंट को वापस लाने से भी डेटा बदल जाता है कि कमेट बदल गया है, लेकिन यह इतिहास पर उन प्रभावों के लिए बिल्कुल कुछ नहीं करता है जो मर्ज़ के पास थे। तो मर्ज अभी भी मौजूद रहेगा, और इसे अभी भी दो शाखाओं को एक साथ मिलाने के रूप में देखा जाएगा, और भविष्य के मर्ज उस विलय को अंतिम साझा स्थिति के रूप में देखेंगे - और वापस लाए गए मर्ज को वापस लाएंगे जो कि बिल्कुल भी प्रभावित नहीं करेगा। इसलिए "रिवर्ट" डेटा में बदलाव को पूर्ववत करता है, लेकिन यह बहुत अधिक है नहीं हैएक "पूर्ववत" इस अर्थ में कि यह रिपॉजिटरी इतिहास पर एक प्रतिबद्ध के प्रभाव को पूर्ववत नहीं करता है। इसलिए यदि आप "पूर्ववत करें" को "पूर्ववत" मानते हैं, तो आप हमेशा श्रद्धा के इस हिस्से को याद करेंगे। हां, यह डेटा को पूर्ववत करता है, लेकिन नहीं, यह इतिहास को पूर्ववत नहीं करता है। ऐसी स्थिति में, आप पहले वाले रिवर्ट को पहले वापस करना चाहेंगे, जिससे इतिहास इस तरह दिखाई देगा:
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
जहां Y, W का पुनर्निमाण है। ऐसा "रिवर्ट का रिवर्ट" के साथ किया जा सकता है:
$ git W को वापस
लाएगा यह इतिहास होगा (जो कि W और W..Y बदल गया है, के बीच संभावित संघर्षों की अनदेखी करना) इतिहास में W या Y के बिल्कुल न होने के बराबर होगा:
---o---o---o---M---x---x-------x----
/
---A---B-------------------C---D
और साइड ब्रांच को फिर से मर्ज करने से पहले के रिवर्ट और रिवर्ट के रिवर्ट से उत्पन्न होने वाले संघर्ष नहीं होंगे।
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
बेशक सी और डी में किए गए परिवर्तन अभी भी किसी भी एक्स द्वारा किए गए के साथ संघर्ष कर सकते हैं, लेकिन यह सिर्फ एक सामान्य मर्ज संघर्ष है।