तुम विलीन हो जाओ। यह वास्तव में काफी सरल है, और एक पूरी तरह से स्थानीय ऑपरेशन है:
git checkout b1
git merge master
# repeat for b2 and b3
यह ठीक उसी तरह से इतिहास को छोड़ता है जैसा कि हुआ: आपने मास्टर से कांटा लगाया, आपने सभी शाखाओं में परिवर्तन किए, और आखिरकार आपने मास्टर से सभी तीन शाखाओं में परिवर्तन को शामिल किया।
git
इस स्थिति को वास्तव में अच्छी तरह से संभाल सकता है, यह एक ही समय में सभी दिशाओं में होने वाले विलय के लिए डिज़ाइन किया गया है। आप भरोसा कर सकते हैं कि यह सभी थ्रेड्स को एक साथ सही तरीके से प्राप्त करने में सक्षम है। यह केवल परवाह नहीं करता है कि क्या शाखा b1
विलय master
, या master
विलय b1
, मर्ज कमिट सभी को समान दिखता है। एकमात्र अंतर यह है कि कौन सी शाखा इस मर्ज कमिट की ओर इशारा करती है।
आप रिबेट करते हैं। एसवीएन, या इसी तरह की पृष्ठभूमि वाले लोग इसे अधिक सहज पाते हैं। कमांड मर्ज केस के अनुरूप हैं:
git checkout b1
git rebase master
# repeat for b2 and b3
लोग इस दृष्टिकोण को पसंद करते हैं क्योंकि यह सभी शाखाओं में एक रैखिक इतिहास रखता है। हालांकि, यह रैखिक इतिहास एक झूठ है, और आपको पता होना चाहिए कि यह है। इस प्रतिबद्ध ग्राफ़ पर विचार करें:
A --- B --- C --- D <-- master
\
\-- E --- F --- G <-- b1
सही इतिहास में विलय के परिणाम:
A --- B --- C --- D <-- master
\ \
\-- E --- F --- G +-- H <-- b1
हालाँकि, रिबेस आपको यह इतिहास देता है:
A --- B --- C --- D <-- master
\
\-- E' --- F' --- G' <-- b1
मुद्दा यह है कि कमिट्स E'
, F'
और G'
वास्तव में कभी अस्तित्व में नहीं थे, और कभी भी परीक्षण नहीं किया गया है। वे संकलन भी नहीं कर सकते हैं। रिबास के माध्यम से निरर्थक कमिट्स बनाना वास्तव में काफी आसान है, खासकर जब बदलाव master
विकास के लिए महत्वपूर्ण हैं b1
।
इस का परिणाम हो सकता है, कि आप भेद नहीं कर सकते जो तीन प्रतिबद्ध की E
, F
है, और G
वास्तव में एक प्रतिगमन शुरू की, का मूल्य कम हो git bisect
।
मैं यह नहीं कह रहा हूं कि आपको उपयोग नहीं करना चाहिए git rebase
। इसके उपयोग हैं। लेकिन जब भी आप इसका उपयोग करते हैं, तो आपको इस तथ्य के बारे में पता होना चाहिए कि आप इतिहास के बारे में झूठ बोल रहे हैं। और आपको कम से कम नए संकलनों का परीक्षण करने के लिए संकलन करना चाहिए।