2011-06-06 20 views
55

मैं निम्नलिखित स्थिति है:,Git पिछले Git के बाद rebase विलय

  • मैं एक clone (वाई) बनाया गया एक मुख्य भंडार (एक्स) से, क्योंकि वहाँ बहुत से लोगों को वाई पर काम कर हम कोई भी कार्य नहीं किया था rebase लेकिन केवल merge एस। हम आदेश बातें हैं करने के लिए एक rebase करना चाहते हैं हम एक्स के लिए वितरित करने के लिए (push) वाई चाहते हैं अच्छे और साफ

समस्या यह है कि जब rebase कर हम सभी का आपस में विलय करने के लिए कहा जाता है कि हम पहले से ही पिछले merge चरणों में किया था। क्या इसका कोई समाधान है, जिसका मतलब है कि वास्तव में विलय फिर से करना है?

मुझे उम्मीद है कि यह काफी सरल हो क्योंकि हम पहले ही विवादित विलय को हल कर चुके हैं।

+0

पर: "क्योंकि वाई पर काम करने वाले बहुत से लोग थे, हमने कोई रिबेज नहीं किया लेकिन केवल विलय हो गया", आपका मतलब है कि अपस्ट्रीम के साथ विलय करना है? –

उत्तर

69

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

यदि आपको इतिहास को संरक्षित करने की परवाह नहीं है, तो आप मास्टर की एक नई शाखा बना सकते हैं, इसे जांच सकते हैं, फिर dev शाखा से मेल खाने के लिए अपने काम करने वाले पेड़ को अपडेट करने के लिए git read-tree -u -m dev करें। फिर आप सब कुछ एक बड़ी प्रतिबद्धता में कर सकते हैं और इसे सामान्य के रूप में मास्टर में विलय कर सकते हैं।

+1

आपने जो प्रभावी ढंग से यहां किया है वह एक विलय है। नई शाखा अनावश्यक है। –

+0

@isakgilbert यह वही है यदि आप '--quash' के साथ विलय करते हैं।यदि शाखा में _N_ काम करता है तो नियमित मर्ज _N_ या _N + 1_ मास्टर के लिए प्रतिबद्ध होगा। उपर्युक्त सुझाव, या 'विलय - स्क्वैश', हमेशा मास्टर को केवल एक ही प्रतिबद्धता जोड़ देगा। – peterflynn

+2

@ytpete, हाँ बिल्कुल। मुझे लगता है कि ऊपर से एक विलय करने का एक चौराहे तरीका है - देव से मास्टर तक। "एक नई शाखा बनाना" बस मास्टर के समान स्थान पर इंगित कर रहा है। "सब कुछ एक बड़ी प्रतिबद्धता में प्रतिबद्ध करें" बस स्क्वैश कर रहा है। –

9

दो टिप्पणी:

  • आप rebase कर सकते हैं अपने खुद के (गैर अभी तक पुश) के रूप में कई बार जब आप नव लाए जाने प्रतिबद्ध के शीर्ष पर चाहते हैं के रूप में काम करते हैं।
  • यदि आपके पास activated git rerere था, तो आप मर्ज टकराव (रिबेस के दौरान) से बच सकते हैं, जो इस तरह की स्थिति के लिए किया जाता है।
    http://git-scm.com/images/rerere2.png git rerere पर और देखें।
+0

दुर्भाग्यवश मेरे पास 'rerere' सक्रिय नहीं था ... – INS

+0

@lulian: उस स्थिति में, यदि आपको अपना काम दोबारा करना है, तो मुझे लगता है कि आपको उन संघर्ष विवादों को फिर से विलय करना होगा। – VonC

+0

पुन: सक्रियण के लिए लिंक काम नहीं करता है। – krlmlr

71

git merge --squash अब बड़ी मात्रा में काम के बाद पुन: प्रयास करने का मेरा पसंदीदा तरीका है और कई विलय (see this answer)। शाखा आप पर काम कर रहे my-branch कहा जाता है और आप master से rebase करना चाहते हैं तो बस निम्न कार्य करें:

git checkout my-branch 
git branch -m my-branch-old 
git checkout master 
git checkout -b my-branch 
git merge --squash my-branch-old 
git commit 
0

आप अपने शाखा में परिवर्तन के सभी लेते हैं और उन्हें एक नया में डाल सकते हैं master में प्रतिबद्ध निम्नलिखित के साथ:

git diff master > my_branch.patch 
git checkout master 
patch -p1 < my_branch.patch 

फिर अपनी फाइलें और प्रतिबद्ध करें।

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