2010-05-26 13 views
20

मैं एक छोटी सी टीम के साथ काम करता हूं जो स्रोत कोड प्रबंधन के लिए गिट का उपयोग करता है। हाल ही में, हम सुविधाओं का ट्रैक रखने के लिए विषय शाखाएं कर रहे हैं, फिर उन्हें स्थानीय स्तर पर मास्टर में विलय कर रहे हैं और फिर उन्हें रिमोट सर्वर पर केंद्रीय गिट भंडार में डाल रहे हैं। मास्टर में कोई बदलाव नहीं होने पर यह बहुत अच्छा काम करता है: मैं अपनी विषय शाखा बना देता हूं, इसे प्रतिबद्ध करता हूं, इसे मास्टर में विलय करता हूं, फिर धक्का देता हूं। हुर्रे।रिमोट अपडेट पर गीट रीबेस

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

तो, पुन: प्रयास करना स्पष्ट विकल्प है।

  • के नए प्रमुख पर (क्योंकि मैं महारत हासिल करने के लिए प्रतिबद्ध नहीं है तेजी से आगे)
  • रिबेस विषय शाखाओं पकड़े कई प्रतिबद्ध
  • चेकआउट मास्टर विषय शाखाओं बना सकते हैं और खींच: क्या मैं चाहूँगा करने के लिए है गुरु
  • मास्टर के खिलाफ विषयों rebase (ताकि विषयों सिर स्वामी से शुरू), मेरे विषय सिर अप करने के लिए मास्टर लाने

वर्तमान में ऐसा करने का मेरा तरीका नीचे सूचीबद्ध है:

git checkout master 
git rebase master topic_1 
git rebase topic_1 topic_2 
git checkout master 
git rebase topic_2 
git branch -d topic_1 topic_2 

क्या ऐसा करने का कोई तेज़ तरीका है?

उत्तर

10

मैं पाया है, समय के साथ, मेरा पसंदीदा समाधान है:

git checkout topic 
# make [n] commits 
git rebase -i HEAD~[n] #clean up time 
git checkout master 
git pull --rebase 
git checkout topic 
git rebase master 
git checkout master 
git merge topic 
git push origin 
+0

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

2

हमारी टीम के लिए हमने कुछ सेट अप किया जो बहुत अच्छी तरह से काम करता है और बिल्कुल रीबेस का उपयोग नहीं करता है।

हमने जिरा टिकटों में अपना काम घटाया जो बहुत अधिक समय नहीं लेता, आमतौर पर 1-2 दिन का प्रयास नहीं करता है। प्रत्येक देव प्रति टिकट एक शाखा बनाता है और इस शाखा पर काम करता है। इसे साझा करने के लिए तैयार होने पर केंद्रीय सर्वर पर धक्का दिया जाता है।

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

वहां से हम इसे वापस हमारे भंडार में खींचते हैं। हम नियमित रूप से करते हैं (यानी हर दो दिनों) केंद्रीय कार्यकर्ता के साथ हमारी कार्यशील शाखाओं को 'करीबी' रखने के लिए विलय करते हैं।

चूंकि कोई भी 'विलय' मशीन पर काम नहीं कर रहा है और सीआई सर्वर के अलावा कोई भी मास्टर को छूता नहीं है, इसलिए हमने बहुत कम मुद्दों को विलय कर दिया है (लगभग 1-2% काम करता है)। और इन्हें वर्कस्पेस की सफाई करके बिल्ड सर्वर पर जल्दी से हल किया जाता है। हमने पाया कि शाखाओं को कम करने और धक्का देने से पहले रिमोट मास्टर के साथ विलय करके हम इनमें से अधिकतर से बचा सकते थे।

मुझे यह भी पसंद है कि विलय करने से विलय करना अधिक मजबूत है और इसके लिए बहुत कम आवश्यकता है।

+0

धीमे विकास के लिए यह बहुत अच्छा है, लेकिन हमारे पास ऐसा माहौल है जिसके लिए कुछ रात की रात में जाने की आवश्यकता होती है जबकि अन्य बड़ी रिलीज की प्रतीक्षा करते हैं। मुझे लगता है कि इसे संभालने का एक तरीका है रात को सेट करना और रिमोट रिपोजिटरी पर शाखाएं जारी करना ... लेकिन ऐसा लगता है कि अगर इन्हें पूरी तरह सम्मान नहीं किया जाता है तो यह अधिक मर्ज कामों को भी आमंत्रित कर सकता है। जबकि मुझे यह भी विश्वास है कि विलय अधिक 'मजबूत' है, हमारी टीम गिट-रिबेस को समझने और मुद्दों के माध्यम से काम करने में सक्षम है। एक और अधिक पठनीय प्रतिबद्ध इतिहास होने के नाते मेरे लिए महत्वपूर्ण है। –

+0

व्यक्तिगत रूप से, मुझे लगता है कि मर्ज किए गए कांटे इतिहास में बदसूरत/गन्दा हैं इसलिए मैं हमेशा दूरस्थ मूल में temp/विकासात्मक शाखाओं को पुनर्जीवित करता हूं। फिर भी, मुझे यह दिलचस्प लगता है कि आपके समूह ने कुछ मुद्दों और मापनीय लाभों के साथ प्रभावी रूप से मर्ज-केवल योजना लागू की है। क्या आप केंद्रीय मास्टर को चीजों को 'करीब' रखने के लिए अपने नियमित पुल शेड्यूल पर छूट देते हैं? "वर्कस्पेस की सफाई" क्या करता है? और, क्या आप केन्द्रीय भंडार के साथ विलय करने से पहले विवादों की जांच करने के लिए खींचते हैं और पुन: प्रयास करते हैं? –

+0

@EvanPlaice कार्यक्षेत्र की सफाई जेनकींस पर कार्यशील निर्देशिका को मिटा रही है। अगली बार एक ताजा क्लोन बनाया जाता है। –

30

क्या आप git pull --rebase के बारे में जानते हैं? जब आप खींचते हैं तो विलय करने के बजाय यह विद्रोह करता है, और विलय को आपके इतिहास को प्रदूषित करने से रोकता है।

आप इसे branch.<name>.rebase और branch.autosetuprebase कॉन्फ़िगरेशन विकल्पों वाले शाखा के लिए डिफ़ॉल्ट व्यवहार के रूप में भी सेट अप कर सकते हैं।

+2

हां, और रिमोट से नवीनतम में साझा कोड बेस अपडेट करते समय मैं अक्सर इसका उपयोग करता हूं। हालांकि, यह पोस्ट फीचर शाखाओं के बारे में अधिक थी और ऐसा करने के लिए एक और सुव्यवस्थित तरीका था और गिट पुल रीबेसेज आईएमओ नहीं है। हालांकि, शाखा ऑटो रीबेज एक शानदार विशेषता है और मैंने इसे पहले से ही कुछ रिपो में जोड़ा है। महान टिप! :) –

1

आप, साथ ही अप-टू-डेट मास्टर

git checkout topic_1 
git rebase refs/remotes/origin/master 

कौन सा खींचने के लिए की जरूरत है obviates के खिलाफ rebase कर सकते हैं (कम से कम अपनी फीचर शाखा के ईओएल तक)। हमारी प्रक्रिया गिटहब पुल अनुरोधों का उपयोग करती है, इसलिए मुझे स्थानीय रूप से ऐसा करने की आवश्यकता नहीं है।

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