2009-09-25 26 views
5

मैं गिट विलय और रीबेज डॉक्स के माध्यम से खुदाई कर रहा हूं, और कुछ डूब नहीं रहा है। मैं सक्रिय रूप से गिट में एक परियोजना पर काम कर रहा हूं, और विशिष्ट मील के पत्थर को अन्य के साथ साझा करने की आवश्यकता है डेवलपर्स। मैं प्रत्येक मील का पत्थर/रिलीज पर कोड को ठीक से साझा करना चाहता हूं, लेकिन मेरे सभी छोटे कामों में से प्रत्येक रिलीज तक नहीं बढ़ रहा है।सार्वजनिक रिलीज के लिए गिट रिबेस/विलय

मैं एक रिलीज शाखा कैसे बना सकता हूं जो विकास शाखा को मिरर करता है, जहां रिलीज शाखा में काम करता है, प्रत्येक में विकास शाखा से कई लोग काम करते हैं? दूसरे शब्दों में, रिलीज शाखा में संपीड़ित इतिहास होना चाहिए, लेकिन अन्यथा विकास शाखा से मेल खाना चाहिए।

मूल रूप से, मैंने सोचा था कि एक अलग शाखा का उपयोग करके और गिट विलय का उपयोग करना - स्क्वैश प्रभावी होगा, जो कि प्रत्येक रिलीज के बीच परिवर्तनों के पूर्ण सेट को प्रतिबिंबित करने वाली एक श्रृंखला के साथ एक नई शाखा बनाते हैं। अब मैं समझता हूं कि गिट मर्ज - स्क्वैश बार-बार उपयोग के लिए काम नहीं करता है।

गिट रिबेस एक बड़ी प्रतिबद्धता में कई कामों को ध्वस्त करने के लिए काम करेगा, लेकिन क्योंकि यह प्रतिबद्धता इतिहास को बदलता है, तो मेरे निजी इतिहास के साथ-साथ सार्वजनिक रिलीज भी नहीं बदलेगा?

मैं छोटे बदलावों का अपना इतिहास खोना नहीं चाहता, लेकिन एक साझा सर्वर पर संयुक्त प्रतिबद्धता को धक्का देना चाहता हूं।

उत्तर

7

निश्चित रूप से, यदि आपकी प्रतिबद्धता सार्वजनिक रिलीज की ओर आपके काम को बनाए रखने और बनाने के लायक हैं, तो उन्हें आपके प्रकाशित इतिहास का हिस्सा बनना चाहिए? यदि आप अपना पूरा भंडार इतिहास प्रकाशित नहीं करना चाहते हैं तो रिलीज टैरबॉल बनाने के लिए आप बस git archive का उपयोग कर बेहतर हो सकते हैं।

यह कहकर कि यदि आप वास्तव में एक अलग इतिहास के साथ एक रिलीज शाखा बनाना चाहते हैं तो यह संभव है। आप खुद को अधिक रखरखाव ओवरहेड के लिए सेट अप कर रहे हैं, हालांकि, आप कभी भी अपने निजी इतिहास से अपनी सार्वजनिक रिलीज शाखा में विलय नहीं कर सकते क्योंकि यह आपके रिलीज शाखा में सभी निजी इतिहास लाएगा। यह गिट करता है; यह ट्रैक करता है कि परिवर्तन कहां से आते हैं।

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

मान लीजिए कि आप उस बिंदु पर पहुंच गए हैं जहां आप रिहाई शाखा (release) पर निजी प्रतिबद्धता (private) में वर्तमान प्रतिबद्धता के आधार पर एक प्रतिबद्धता बनाना चाहते हैं और यह मानते हुए कि आपके पास पेड़ जारी किया जाना है इंडेक्स में कोई बदलाव नहीं है, यहां आप क्या कर सकते हैं।

# Low-level plumbing command to switch branches without checking anything out 
# (Note: it doesn't matter if this branch hasn't yet been created.) 
git symbolic-ref HEAD refs/heads/release 

# Create a new commit based on the current index in the release branch 
git commit -m "Public release commit" 

# Switch back to the private branch 
git checkout private 

आप प्रत्येक रिलीज (या उप विज्ञप्ति) और नए अपने निजी इतिहास के किसी भी शामिल बिना प्रतिबद्ध पिछले रिलीज के शीर्ष पर सीधे बनाया जाएगा के लिए ऐसा कर सकते हैं।

+0

यह निश्चित रूप से करता है। मेरे लिए काम किया :) –

+0

धन्यवाद, चार्ल्स। यही वह है जो मैं ढूंढ रहा हूं। – Neil

2

बस एक नई शाखा बनाएं और वहां सभी स्क्वैशिंग करें। फिर इसे प्रकाशित करें। आपकी छोटी सी चीजें अभी भी अन्य शाखाओं में होंगी।

इस के लिए मेरे कार्यप्रवाह कुछ इस तरह दिखेगा:

git co -b release_branch_squash release_branch_with_all_commits 

git rebase last_release_tag 

अब यह सब संघर्ष है कि उत्पन्न हो सकती है से निपटने के लिए समय है। मैं वास्तव में नहीं जानता कि इससे कैसे बचें। आम तौर पर हालांकि यह एक समस्या का अधिक नहीं है। मेरा गिट रिपोजिटरी पहले से ही सबसे अधिक संघर्ष संकल्प दर्ज कर चुका है।

git rebase --interactive last_release_tag 

यह विम लाएगा। सभी रिलीज के लिए मैं स्क्वैश करना चाहता हूं मैं pick squash के साथ प्रतिस्थापित करता हूं। फिर बस सहेजें और छोड़ दें। किया हुआ।

+0

क्या आप विस्तृत कर सकते हैं? Http://stackoverflow.com/questions/1464642/git-merge-squash-repeatedly/1465119#1465119 जैसी टिप्पणियों से यह बार-बार विलय की तरह दिखता है - स्क्वैश काम नहीं करेगा। जब मैंने यह कोशिश की है, तो मुझे विवादों की बहुत लंबी सूची मिलती है, भले ही फाइलों का एक आम इतिहास हो। अगर मैं सही ढंग से समझता हूं, तो गिट विलय - स्क्वैश एक नई प्रतिबद्धता बनाता है जो पुराने कामों का इतिहास साझा नहीं करता है, इसलिए भविष्य में विलय में सामान्य पूर्वजों नहीं होते हैं। आपने जिस व्यवहार को मैं चाहता हूं उसका वर्णन किया है, लेकिन मैं इसे करने के लिए गिट प्राप्त करने पर ठोकर खा रहा हूं। – Neil

+0

मैंने अपने प्रस्तावित वर्कफ़्लो के साथ उत्तर अपडेट किया है। हालांकि मुझे स्वीकार करना होगा कि चार्ल्स बेलीज़ समाधान आपकी आवश्यकताओं के लिए उपयुक्त हो सकता है। – davrieb

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