2009-07-03 14 views
134

में एक उलटा विलय दोबारा कर रहा है मैंने यहां कुछ समस्याएं निभाई हैं: मुझे गिट में समस्या-विशिष्ट शाखा 28s थी, जिसे मैंने सामान्य develop शाखा में विलय कर दिया था। बाहर निकलता है मैंने इसे बहुत तेज़ किया था, इसलिए मैंने मर्ज को पूर्ववत करने के लिए गिट-रिवर्ट का उपयोग किया। अब, समय 28s को develop में विलय करने आया है, लेकिन गिट-मर्ज कमांड मूल विलय को देखता है, और खुशी से घोषणा करता है कि सब ठीक है और शाखाएं पहले से ही विलय हो चुकी हैं। अब मैं क्या करू? एक 'वापसी' बनाएँ "28s -> विकसित करें" "प्रतिबद्ध करें? ऐसा करने का एक अच्छा तरीका प्रतीत नहीं होता है, लेकिन मैं इस समय किसी और की कल्पना नहीं कर सकता।गिट

वृक्ष संरचना क्या लगता है:

Git log output

+0

वह GUI क्या है? –

+3

यह गिटएक्स (http://gitx.frim.nl) है। –

उत्तर

110

आप "वापस लौटने के" करने के लिए है। इस पर निर्भर करता है कि आपने इसे कैसे वापस कर दिया, यह उतना आसान नहीं हो सकता जितना लगता है। official document on this topic देखें।

---o---o---o---M---x---x---W---x---Y 
      /
     ---A---B-------------------C---D 

अनुमति देने के लिए:

---o---o---o---M---x---x-------x-------* 
      /     /
     ---A---B-------------------C---D 

लेकिन यह सब काम करता है? यकीन है कि यह करता है। आप विलय को वापस कर सकते हैं, और से पूरी तरह से तकनीकी कोण से, गिट ने इसे बहुत स्वाभाविक रूप से किया था और परेशानी नहीं थी।
यह सिर्फ "मर्ज से पहले राज्य" से "विलय के बाद राज्य" में परिवर्तन माना जाता है, और यह वह था।
कुछ भी जटिल नहीं, कुछ भी अजीब नहीं, कुछ भी वास्तव में खतरनाक नहीं है। गिट इसके बारे में सोचने के बिना भी करेगा।

तो एक तकनीकी दृष्टि से, वहाँ एक कार्यप्रवाह कोण से किसी मर्ज को पूर्ववत करने, लेकिन साथ कुछ भी गलत नहीं यह कुछ है कि आप आम तौर पर बचने की कोशिश करनी चाहिए है।

बिल्कुल संभव हो तो, उदाहरण के लिए, यदि आप एक समस्या यह है कि मुख्य पेड़ में मिला दिया गया, पाते हैं बजाय मर्ज को पूर्ववत करें, कोशिश वास्तव में कठिन रहे हैं:

  • समस्या द्विभाजित आपके द्वारा विलय की गई शाखा में नीचे, और बस इसे ठीक करें,
  • या इसके कारण होने वाली व्यक्तिगत प्रतिबद्धता को वापस करने का प्रयास करें।

हाँ, यह और अधिक जटिल है, और नहीं, यह हमेशा नहीं काम करने के लिए (कभी कभी जवाब है हो रहा है: "उफ़, मैं वास्तव में यह विलय कर दिया है नहीं करना चाहिए, क्योंकि यह तैयार नहीं अभी तक था, और मुझे वास्तव में विलय के सभी पूर्ववत करने की आवश्यकता है ")। तो फिर आप को वास्तव में विलय को वापस करना चाहिए, लेकिन जब आप विलय को फिर से करना चाहते हैं, तो आप को वापस लौटकर इसे करने की आवश्यकता है।

+5

अच्छा लिंक (+1)। पाठकों को इस मामले में प्रासंगिक विकल्पों को तुरंत देखने की अनुमति देने के लिए मैंने आपके उत्तर में दस्तावेज़ के हिस्से की प्रतिलिपि बनाने की स्वतंत्रता ली। यदि आप असहमत हैं, तो वापस लौटने के लिए स्वतंत्र महसूस करें। – VonC

+3

हम अभी एक ऐसे मामले में भाग गए जहां हमें ऐसा करने की ज़रूरत थी और पाया कि मजा यहां काफी रुकता नहीं है। यह एक लंबी दौड़ वाली शाखा थी जिसे विलय कर दिया गया था, इसलिए हमें इसे अपडेट करना जारी रखना था। मेरा दृष्टिकोण यहां: http://tech.patientslikeme.com/2010/09/29/dealing-with-git-merge-revisions/ – jdwyah

+0

मैंने @ jdwyah के ब्लॉग पोस्ट का पालन किया और यह शानदार था (गंभीरता से, यह बहुत ही बढ़िया था कि यह सिर्फ काम किया)। – hellatan

2
इसके बजाय git-revert का उपयोग कर आप दूर devel शाखा को फेंक में इस आदेश का इस्तेमाल किया जा सकता था (पूर्ववत करें) गलत मर्ज (बस इसे पूर्ववत करने के बजाय) के लिए प्रतिबद्ध की

git checkout devel 
git reset --hard COMMIT_BEFORE_WRONG_MERGE 

यह तदनुसार कार्यशील निर्देशिका की सामग्री को भी समायोजित करेगा। सावधान बनें :

  • विकसित शाखा (गलत मर्ज के बाद से) में अपने परिवर्तन सहेजें क्योंकि वे भी git-reset द्वारा मिटा दिया जाएगा। git reset तर्क के रूप में निर्दिष्ट किए जाने के बाद सभी काम करते हैं!
  • इसके अलावा, ऐसा न करें अगर आपके परिवर्तन अन्य भंडारों से पहले ही खींचे गए थे क्योंकि रीसेट इतिहास को फिर से लिख देगा।

मैं कोशिश करने से पहले git-reset मैन-पेज सावधानी से अध्ययन करने की सलाह देता हूं।

अब, रीसेट के बाद आप अपने परिवर्तन devel में प्रारंभिक एक की तरह फिर से लागू कर सकते हैं और उसके बाद करना

git checkout devel 
git merge 28s 

यह 28s से एक असली मर्ज हो जाएगा devel में (जो अब है Git के से मिटाया इतिहास)। एम

के वापस लौटने है तो इससे पहले कि मैं शुरू समस्याओं मैं डब्ल्यू की चेरी ले करने के लिए प्रतिबद्ध है पाया फिक्सिंग -

+5

किसी भी व्यक्ति के लिए जो गिट से परिचित नहीं है और शायद इन निर्देशों का पालन करना चाहें: 'रीसेट - हार्ड' और 'पुश मूल' संयोजन के साथ सावधान रहें। यह भी ध्यान रखें कि उत्पत्ति के लिए एक बल धक्का वास्तव में गिटहब पर खुले पीआरएस को बना सकता है। – funroll

+0

किसी निजी गिट सर्वर पर कुछ विलय समस्याओं को ठीक करने के लिए बहुत उपयोगी है। धन्यवाद! – mix3d

+2

बदलते इतिहास। इस तकनीक के लिए – njzk2

29

मान लेते हैं आप इस तरह के इतिहास

---o---o---o---M---W---x-------x-------* 
      /      
     ---A---B 

कहाँ ए, बी में विफल रहा करता और डब्ल्यू करते हैं अपनी शाखा

git cherry-pick -x W 

तो मैं वापस लौटने डब्ल्यू अपनी शाखा पर प्रतिबद्ध

git revert W 

फिक्सिंग जारी रखने के बाद।

अंतिम इतिहास दिखाई दे सकता है जैसे:

---o---o---o---M---W---x-------x-------* 
      /     / 
     ---A---B---W---W`----------C---D 

जब मैं एक पीआर कहीं भी होगी भेज स्पष्ट रूप से पता चलता है कि पीआर वापस लाएं पूर्ववत है और कुछ नए प्रतिबद्ध कहते हैं।

+1

ऐसा लगता है कि यह सहायक हो सकता है, लेकिन विवरण पर इतना स्पष्ट है (आखिरी आरेख में सी, डी क्या है) यह उपयोगी – Isochronous

+0

से अधिक निराशाजनक है @ सिंक्रोनस सी और डी ऐसा लगता है कि ए द्वारा पेश की गई समस्याओं को ठीक करता है और बी – Thomas

+0

@ थॉमस बिल्कुल –

2

बहुत ज्यादा अपने कार्यप्रवाह पंगा लेना बिना वापस लाएं वापस जाने के लिए:

  • विकसित
  • वापस लाएं वापस लाएं की स्थानीय प्रतिलिपि पर प्रतिबद्ध विकसित
  • मर्ज कि में कॉपी की एक स्थानीय कचरा प्रति अपना फीचर शाखा, और अपनी फीचर शाखा को अपने गिट सर्वर पर दबाएं।

आपकी सुविधा शाखा अब सामान्य के रूप में विलय करने में सक्षम होनी चाहिए जब आप इसके लिए तैयार हों। यहां केवल एक ही नकारात्मक बात यह है कि आपके पास अपने इतिहास में कुछ अतिरिक्त विलय/वापसी होगी।

1

मुझे एक ही समस्या का सामना करते समय यह पोस्ट मिला। मुझे कठोर रीसेट करने के लिए डरावना करने के लिए रास्ता मिल गया है। मैं कुछ ऐसा हटाना समाप्त कर दूंगा जो मैं नहीं चाहता, और इसे वापस पाने में सक्षम नहीं होगा।

इसके बजाय मैंने उस प्रतिबद्धता की जांच की जिसे मैं चाहता था कि शाखा वापस जाएं git checkout 123466t7632723। फिर एक शाखा git checkout my-new-branch में परिवर्तित कर दिया। तब मैंने उस शाखा को हटा दिया जिसे मैं और नहीं चाहता था। बेशक यह केवल तभी काम करेगा यदि आप जिस शाखा को गड़बड़ कर चुके हैं उसे फेंकने में सक्षम हैं।

+0

'गिट रीफ्लॉग' आपको कुछ महीनों के लिए हार्ड रीसेट पर सुरक्षित रखेगा यदि आपको बाद में पता चलता है कि आपको खोए गए कामों की आवश्यकता है। रीफ्लॉग आपके स्थानीय रेपो तक ही सीमित है। – Todd