क्या गिट में मर्ज को फिर से करने का एक तरीका है?


17

इसलिए मैंने बहुत बड़ी गलती की। मैंने एक कमिट किया, खींचा, मर्ज किया (लेकिन ऐसा करते समय कोड गड़बड़ कर दिया) और फिर धक्का दिया। मैं उस विलय को पुनः प्राप्त करना चाहूंगा और कोड को सही पाऊंगा। क्या इसे करने का कोई तरीका है?

मैं बिटकॉइन का उपयोग करता हूं।

git 

10
बस एक नोट - यह वास्तव में एसओ पर विषय पर है, और इसे माइग्रेट नहीं किया जाना चाहिए था । अपने स्वयं के सहायता पृष्ठों को कुछ समय पढ़ने का प्रयास करें और प्रोग्रामर लाइन द्वारा आमतौर पर उपयोग किए जाने वाले सॉफ़्टवेयर टूल पर ध्यान दें । उस ने कहा, यह भी यहाँ विषय पर है - स्विफ्टकोर, बुरा मत मानो कि यह माइग्रेट किया गया था, यह आपकी गलती नहीं थी।
Bob

जवाबों:


13

निश्चित नहीं है कि यह करने के लिए "धन्य" तरीका है, लेकिन यहां मैंने "बल धक्का" या इस तरह के कुछ भी सकल के बिना एक ही समस्या को हल करने के लिए क्या किया।

चलिए मान लेते हैं कि आपका इतिहास कुछ इस तरह का है (और एम फ्लब्ड मर्ज है):

-A--B--C--M (master points here)
  \      /
   D----E

git checkout -b merge_fix <commit ID E>इससे पहले कि हम कोई गलती करें, रनिंग एक शाखा बनाता है:

-A--B--C--M (master points here)
  \      /
   D----E (HEAD and merge_fix point here)

अब, हमारी नई शाखा पर मर्ज को फिर से करते हैं। हम सिर्फ मर्ज नहीं कर सकते हैं master, इसलिए हमें अपने खराब मर्ज से पहले मैन्युअल रूप से कमिटमेंट लेने की जरूरत है: git merge <commit ID C>पिछली बार आपने जो गलतियां की थीं , उन्हें न करें!

-A--B--C--M (master points here)
  \      X
   D----E-G (HEAD and merge_fix point here)

यह मानते हुए कि प्रतिबद्ध Gअच्छा लगता है, अब हम masterशाखा के शीर्ष के साथ सिंक करना चाहते हैं । यह आदेश उन परिवर्तनों को अनदेखा करने के लिए कहता है जो मास्टर करने के लिए किए गए थे, और मर्ज परिणाम बनने के लिए हमारे परिवर्तनों को बाध्य करते हैं:git merge -s ours master

-A--B--C--M (master points here)
  \      X  \
   D----E-G--H (HEAD and merge_fix point here)

अंत में, (फिर से यह मानते हुए कि प्रतिबद्ध Hअच्छा लगता है, हम masterअपने निश्चित मर्ज को शामिल करने के लिए तेजी से आगे बढ़ना चाहते हैं:

git checkout master
git merge merge_fix

यह वास्तव में सिर्फ masterशाखा सूचक को स्थानांतरित करता है H, लेकिन मैं अपनी ASCII कला को थोड़ा साफ करने का अवसर लूंगा:

-A--B--C--M--H (HEAD, master, and merge_fix all point here)
  \      X  /
   D----E--G

आखिर तुमने इसे हासिल कर ही लिया है! आपने किसी भी इतिहास को अमान्य किए बिना मर्ज को फिर से सफलतापूर्वक किया है!


6

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

  1. अपने मर्ज से पहले कमिट पर रीसेट करें।
  2. मर्ज फिर से करें
  3. बल धक्का

अर्थात्:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

बस ध्यान रखें कि git push --forceआपके पास दूरस्थ शाखा में जो कुछ भी था, उसे फिर से लिखना होगा, और उस शाखा का उपयोग करने वाले अन्य लोग भी इससे प्रभावित हो सकते हैं। (आम तौर पर आपको ऐसा नहीं करना चाहिए।)


6
बस याद रखना git push --forceसुरक्षित नहीं है
ज़ेपलॉक

1

git merge --abort और फिर आप फिर से विलय कर सकते हैं


मुझे सिर्फ "गर्भपात करने के लिए कोई मर्ज नहीं है" संदेश मिलता है

3
यह केवल तब किया जा सकता है जब मर्ज संघर्ष हो।
चंचल

माइनस एक क्यों? इससे मुझे मदद मिली।
स्वदेश

क्योंकि सवाल तब है जब आपने पहले ही मर्ज (गलत तरीके से) खत्म कर दिया और धक्का दे दिया।
रॉबिन ग्रीन

-1

कृपया इस आशा को जांचें कि यह आपके लिए उपयोगी है

https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html

हालांकि यह ओपी प्रश्न का उत्तर दे सकता है, केवल एसओ पर उत्तर को अच्छी तरह से स्वीकार नहीं किया जाता है। आप हालांकि अपने उत्तर में लिंक से सबसे अधिक प्रासंगिक अंश उद्धृत कर सकते हैं।

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
प्रणव Pran
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.