2010-08-02 11 views
64

मैं 82 feature branches hanging around के साथ समाप्त नहीं करना चाहता, इसलिए मैं सोच रहा हूं कि जैसे ही मैं मास्टर को विलय करता हूं, सुविधा तालिका को हटाने में संभावित कमी क्या होती है।गिट फीचर शाखा को हटाने का सही समय कब है?

कार्यप्रवाह:

git co -b feat-xyz 
hack hack 
git ci 
hack some more 
git ci 
git co master 
git merge feat-xyz 
smoke test 
git br -d feat-xyz 

किसी भी मुद्दों यहाँ?

+1

मैं कोई मुद्दा नहीं कहना यदि आप वास्तव में उन्हें जरूरत आप बाद में कभी नष्ट कर दिया शाखा को फिर से शुरू कर सकते हैं क्योंकि होगा किया जाएगा। – slebetman

+0

@ एसलेबेटमैन जहां तक ​​मुझे एक हटाई गई शाखा पता है, पुनरुत्थान नहीं किया जा सकता है। हालांकि अगर शाखा को हटाने से पहले पूरी तरह से मास्टर में विलय कर दिया गया था, तो अब शाखा की कोई आवश्यकता नहीं होनी चाहिए। – Simeon

+1

@ शिमोन हाँ आप कर सकते हैं। जब आप अपनी शाखा हटाते हैं तो गिट कभी भी हटता नहीं है, आप इसे सिर्फ नाम हटा रहे हैं। हटाए गए शाखा को पुनर्जीवित करने के लिए आपको उस शाखा में किए गए आखिरी चीज को याद रखना होगा और आप इसके लिए 'गिट रीफ्लॉग' खोज सकते हैं। फिर हैश – slebetman

उत्तर

47

विलय के बाद हटाएं सामान्य तरीका है। यही कारण है कि git branch -d यह सुनिश्चित करने के लिए जांच करता है कि शाखा पूरी तरह से विलय हो जाने से पहले विलय हो जाएगी।

कुछ कारण हैं जिनके बारे में मैं एक शाखा को रखने के बारे में सोच सकता हूं: यदि आप उत्पादन को हिट करने के बाद बग वापस आते हैं, तो आप इसे पकड़ना चाहेंगे, या आप एक ऐतिहासिक रिकॉर्ड चाहते हैं।

किसी भी मामले में, आपके पास इसे हटाने से पहले शाखा के प्रमुख को टैग करने का विकल्प होता है। एक टैग एक शाखा की तरह है कि यह एक प्रतिबद्ध करने के लिए एक सूचक है, कुछ मामूली अंतर के अलावा है: 1) चीनी मिट्टी के बरतन आमतौर पर Git शो शाखा या टैब-ऑटो चेकआउट में पूरा तरह खोजपूर्ण आदेशों में टैग प्रदर्शित नहीं करता है, 2) एक की जांच करना आपको एक अलग (गैर-रेफरी) सिर में रखता है 3) आप एक "tagging message" छोड़ सकते हैं, जिससे टैग को ऑब्जेक्ट स्टोर में किसी ऑब्जेक्ट के रूप में सहेजा जा सकता है।

इस तरह आप इतिहास को संरक्षित है, और अगर तुम कभी बग को ठीक करने की आवश्यकता है, मैं सिर्फ सुधार के लिए गुरु के बंद एक नई शाखा बनाने का सुझाव देते।

+1

एक टैग आउट की जांच करना हेड सेट करता है, लेकिन स्वचालित रूप से शाखा नहीं बनाता है। एक शाखा के बिना एक प्रतिबद्धता पर एक सिर है जो इसे अलग करता है। – Binarian

+1

आप सही हैं, यह एक रेफरी के बजाय एक प्रतिबद्ध आईडी पर हेड सेट करता है। मेरे ओपी का वह हिस्सा गलत है। मुझे इसे अपडेट करना चाहिए। रेव^1..rev^2: – masonk

1

मुझे लगता है कि कि ठेठ कार्यप्रवाह (मर्ज के बाद हटाने)

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

+0

तो शाखा को चारों ओर रखने में वास्तव में कोई बात नहीं है, है ना? – bstpierre

+1

मैं दृढ़ता से "rebase" से बचने की सलाह देते हैं। रिबेजिंग आमतौर पर हानिकारक है, केवल कुछ मामलों में उपयोगी है। –

+9

रीबेसिंग आपकी स्थानीय, निजी शाखाओं के लिए एक बिल्कुल उचित वर्कफ़्लो है। उदाहरण के लिए पुन: प्रयास करके अपस्ट्रीम काम के साथ सिंक में रखना बहुत आम है ("रिबेसिंग * डाउन *")। यह * कम करने के लिए, बहुत कम आम है, और आमतौर पर हानिकारक है। दूसरे का जवाब वास्तव में, मतलब नहीं है कि आप रिबेसिंग या नदी के ऊपर परिवर्तन में विलय कर रहे हैं, तब भी आप सामान धक्का "ऊपर" किसी भी तरह के लिए है क्योंकि। यहां तक ​​कि आपकी स्थानीय शाखा पर, आपको किसी भी समय मास्टर को अपनी सुविधा में विलय करना होगा। आपकी विशेषताओं पर पुनर्जीवित रहने का लाभ यह है कि यह विलय तेजी से आगे बढ़ता है। – masonk

4

मैं दो कारणों से आप थोड़ा-बहुत एक सुविधा शाखा रखने के लिए चाहते हो सकता है के बारे में सोच सकते हैं:

  • इसकी भी संभावना है कि यह नदी के ऊपर से अधिक काम करने के लिए आपको वापस लात मारी हो जाएगी है।
  • अन्य डेवलपर्स शायद उस विशेषता को मास्टर में अन्य सभी चीज़ों के बिना चाहते हैं।

प्रैक्टिस में, अधिकांश समय विलय के बाद हटाना ठीक है।

74

मैं मर्ज के बाद हटा सकते हैं, लेकिन मैं हमेशा एक git merge --no-ff करते हैं, तेजी से अग्रेषण से बचने के लिए इतना है कि शाखा इतिहास ग्राफ पर दिख रहा है। मैं जहां यह सुविधा शाखा विकास शाखा से चला गया के इतिहास लेना पसंद है और जहां इसे वापस शामिल हो गए:

Merging with or without fast-forwards

यह Git के साथ उपयोग करने के लिए विन्सेंट Driessen, एक बहुत अच्छा कार्यप्रवाह द्वारा A successful Git branching model से लिया जाता है जो मैं मेरी अधिकांश परियोजनाओं के लिए आवेदन करें।

+0

इस इतिहास को संरक्षित करने के लिए एक अच्छा तरीका है, क्योंकि आप प्रतिबद्ध है कि सुविधा से पहुंचा जा सकता है, लेकिन से नहीं जीतने वाले इंसान हैं का चयन कर सकते है। नीचे की तरफ यह है कि यह किसी भी रिबेजिंग को खराब करता है जो आप अपनी मास्टर शाखा से करना चाहते हैं (उदाहरण के लिए, यदि आप मास्टर को अपस्ट्रीम रिमोट पर रीबैड रखना चाहते हैं, जो बहुत आम है)। – masonk

+1

मुझे वह समस्या नहीं थी। हमारी टीम जिथब के माध्यम से सिंक करती है, और मुझे आमतौर पर रीबेज करने की आवश्यकता नहीं होती है, लेकिन मुझे नहीं लगता कि यह यहां एक नकारात्मक पक्ष है। यहां तक ​​कि यदि आप अपनी विकास और फीचर शाखा को पुनर्जीवित करते हैं, तो शाखाएं ग्राफ पर दिखाई देती हैं, और विकास के सापेक्ष फीचर शाखा में क्या मायने रखता है, वह प्रतिबद्धता नहीं है जहां आपने मूल रूप से उस शाखा को बनाया था। – lkraider

+0

@Ikraider, अनुस्मारक के लिए धन्यवाद। मैंने उस आलेख को देखा जब मैं पहली बार गिट सीख रहा था, यह अब मुझे और अधिक समझ में आता है। मैं अपनी फीचर शाखाओं को दोबारा दूंगा, लेकिन मैं मास्टर पर --no-ff' वापस विलय करता हूं क्योंकि आप कहते हैं कि आप इतिहास देख सकते हैं। – bstpierre

3

ठेठ कार्यप्रवाह

// Create new branch 
$ git checkout -b myfeature 
// and then do some changes and commit them 

// Switch to master branch 
$ git checkout master 

// Merge myfeature to master. --no-ff will always keep branch information. 
$ git merge --no-ff myfeature 

// Delete myfeature branch 
$ git branch -d myfeature 

// Push the changes 
$ git push origin master 
संबंधित मुद्दे