2011-06-02 14 views
31

को देखते हुए निम्नलिखित git इतिहास:गिट रिबेस हत्या मर्ज करने से कैसे बचें?

C-I origin/master 
/
A-B-F-G-H master 
\ /
    D-E  branch-b 

मैं origin/master के शीर्ष पर अपने स्थानीय master शाखा rebase करना चाहते हैं, लेकिन मैं संरक्षित करने के लिए मर्ज प्रतिबद्ध G चाहते हैं। जब मैंने पर master पर D..E को G के रूप में स्क्वैश किया और E के प्रतिबद्ध संदेश के साथ प्रतिबद्ध किया, तो इतिहास जो कि विलय था, खो गया था। क्या अभी भी रिबेस मिलने के दौरान इस विलय को संरक्षित करने का कोई तरीका है? स्पष्टता के लिए, मेरा इच्छित परिणाम है:

A-B-C-I-F-G-H master 
\  /
    D-----E  branch-b 

उत्तर

44

--preserve-merges अपने रिबेस आदेश में जोड़ें। यदि आपके विलय में संघर्ष के संकल्प थे, तो पैरामीटर के रूप में 'रिकर्सिव उनकी' रणनीति जोड़ें।

+11

या बस '-p'। –

+6

इस ध्वज के साथ क्या होगा, इस बारे में बेतुका विस्तार के लिए, http://stackoverflow.com/questions/15915430/what-exactly-does-gits-rebase-preserve-merges-do-and- क्यों। – Chris

+4

क्या आप विस्तार कर सकते हैं कि इस मामले में 'रिकर्सिव इन' क्यों मदद करेगा? अलग-अलग संघर्ष समाधान रणनीति का उपयोग करके प्रतिबद्ध 'जी' बनाया गया हो सकता है, है ना? –

2

यह बहुत सुंदर नहीं होगा लेकिन मुझे लगता है कि आप इसे कर सकते हैं।

git checkout F 
git checkout -b new_master 
git rebase origin/master 

मर्ज शाखा-बी अपनी नई शाखा में:

रिबेस अपने नए मास्टर शाखा के रूप में मूल/मास्टर पर एफ

git merge branch-b 

चेरी शेष एच लेने अपने नए मास्टर पर प्रतिबद्ध शाखा:

git cherry-pick master 

अपने पुराने गुरु शाखा हटाएँ:

+०१२३५१६४१०६१
git branch -D master 

दुर्भाग्यवश आपको फिर से मर्ज करना होगा (उम्मीद है कि यह कोई मैन्युअल विलय नहीं लेता है)।

मैंने वास्तव में इसे आजमाया नहीं था, इसलिए मैं पहले भंडार का बैकअप बनाउंगा, लेकिन मुझे पूरा भरोसा है कि आप जो चाहते हैं उसे प्राप्त करेंगे। मैं प्रत्येक आदेश के बाद "F5" के साथ पेड़ को खोलने और रीफ्रेश करने का भी सुझाव देता हूं ताकि आप देख सकें कि क्या बदल रहा है।

किसी और को अभी भी पोस्ट करना चाहिए यदि उन्हें ऐसा करने का एक और शानदार तरीका पता है।

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