2008-11-07 12 views
718

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

मैंने पुराने धागे को देखकर सीख लिया था कि मैं नाम/नाम में शाखाओं का नामकरण शुरू कर सकता हूं, यानी विषय/कार्य, या ऐसा कुछ। मैं ऐसा करना शुरू कर सकता हूं और देख सकता हूं कि क्या यह चीजों को व्यवस्थित रखने में मदद करता है।

गिट शाखाओं का नामकरण करने के लिए कुछ सर्वोत्तम अभ्यास क्या हैं?

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

+0

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

+9

यह भी देखें https://github.com/agis-/git-style-guide – Agis

+2

पूर्णता के लिए, कुछ [वर्ण अनुक्रम जिन्हें आप उपयोग नहीं कर सकते हैं] (http://stackoverflow.com/a/28183192/313445) । –

उत्तर

41

मेरी व्यक्तिगत वरीयता है कि मैं किसी विषय शाखा के साथ शाखा नाम हटा दूं।

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

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

इससे git branch का उत्पादन अधिक उपयोगी होता है: यह केवल लंबी शाखाओं और सक्रिय विषय शाखाओं की सूची देता है, न कि सभी शाखाएं।

18

प्रत्येक कार्य के लिए तीन शाखाएं/विलय क्यों लेते हैं? क्या आप इसके बारे में अधिक समझा सकते हैं?

यदि आप एक बग ट्रैकिंग सिस्टम का उपयोग करते हैं तो आप शाखा नाम के हिस्से के रूप में बग संख्या का उपयोग कर सकते हैं। यह शाखा नामों को अद्वितीय रखेगा, और आप उन्हें "ResizeWindow-43523" जैसे मानव पठनीय रखने के लिए उन्हें संक्षिप्त और वर्णनात्मक शब्द या दो के साथ उपसर्ग कर सकते हैं। यह शाखाओं को साफ करने के लिए चीजों को आसान बनाने में भी मदद करता है, क्योंकि आप संबंधित बग को देख सकते हैं। इस प्रकार मैं आमतौर पर अपनी शाखाओं का नाम देता हूं।

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

4

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

यदि आपकी शाखा किसी संस्करण का प्रतिनिधित्व करती है, तो ऐसा लगता है कि आम सम्मेलन टैग नामों के लिए शाखा नामों और vx.xx (उदाहरण "v1.0.0") के लिए xxx (उदाहरण: "1.0.0") प्रारूप का उपयोग करना है (संघर्ष से बचने के लिए)। यह भी देखें: is-there-an-standard-naming-convention-for-git-tags

+1

क्या विवादों के साथ कोई समस्या है? यदि इरादा 'v1.2.4' शाखा के लिए होता है तो अंततः 'v1.2.4' टैग _ के साथ अंत बिंदु पर ले जाता है (क्या मैं यह मानने में सही हूं कि यह दोनों स्थितियां हैं जहां आप शाखाएं और टैग नामकरण कर रहे हैं संस्करण) _, तो क्या इससे कोई फर्क पड़ता है? टैग को अभी भी 'रेफ/टैग/v1.2.4' पर और शाखा 'रेफर्स/हेड/v1.2.4' पर पहुंचा जा सकता है, और ऐसा लगता है कि गिट जब टैग अस्पष्ट है (चेतावनी के साथ) टैग टैग पसंद करेगा। –

+1

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

+1

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

200

A successful Git branching model विन्सेंट ड्रिसेन द्वारा अच्छे सुझाव हैं। एक तस्वीर नीचे है। यदि यह शाखा मॉडल आपको अपील करता है तो flow extension to git पर विचार करें। दूसरों commented about flow

Driessen के मॉडल

  • एक मास्टर शाखा भी शामिल है, केवल रिहाई के लिए इस्तेमाल किया है। विशिष्ट नाम master

  • उस शाखा से "विकसित" शाखा। यही वह मुख्य मुख्य कार्य के लिए उपयोग किया जाता है। विशिष्ट नाम devel

  • विकास शाखा से कई फीचर शाखाएं बंद हैं। सुविधा के नाम पर आधारित नाम। इन्हें मास्टर में या रिलीज शाखाओं में नहीं, बल्कि विकास में विलय कर दिया जाएगा।

  • उम्मीदवार रिलीज रखने के लिए रिलीज शाखा, केवल बग फिक्स और कोई नई विशेषताएं नहीं। विशिष्ट नाम rc1.1

हॉटफिक्स मास्टर से आने वाले परिवर्तनों के लिए अल्पकालिक शाखाएं हैं और विकास शाखा के बिना मास्टर में प्रवेश करेंगे।

enter image description here

+34

सिवाय इसके कि यह वास्तव में प्रश्न को संबोधित नहीं करता है, क्योंकि यह उपयोगकर्ता को विशेष रूप से फीचर शाखाओं के लिए नामकरण सम्मेलनों का एक समूह छोड़ देता है (वे "मास्टर, विकास, रिलीज- *, या हॉटफिक्स- *" – Brian

+0

को छोड़कर कुछ भी हो सकते हैं @ ब्रियन मॉडल नाम हल करने वाली समस्याओं के संदर्भ में एक सुविधा नामकरण सम्मेलन में क्या मदद मिलेगी? मैं वास्तव में नहीं देखता हूं, वर्तमान में, सुविधाओं में और भेदभाव कैसे वास्तव में मदद करता है। शायद भविष्य में अगली रिलीज बनाम, लेकिन यह परक्राम्य है और इस प्रकार नाम का हिस्सा नहीं होना चाहिए। पठनीयता के लिए, शायद उन्हें फीचर- * के साथ तैयार करना पर्याप्त होगा। आप कुछ बार मतदान कर चुके हैं इसलिए मैं आपकी विचार प्रक्रिया को सुनने के लिए उत्सुक हूं ... –

+0

हालांकि अच्छी जानकारी यह उत्तर सम्मेलन नामकरण के बजाय प्रवाह के प्रश्न को संबोधित करता है। मुझे लगता है कि ओपी जानना चाहेगा कि कौन से वास्तविक शब्द (संज्ञा बनाम क्रियाएं), डिलीमीटर, केस इत्यादि – Caltor

660

यहाँ अपने शाखा की शुरुआत में कुछ शाखा नामकरण सम्मेलनों है कि मैं का उपयोग करें और उनके लिए कारणों

शाखा नामकरण सम्मेलनों

  1. ग्रुपिंग का उपयोग टोकन (शब्द) कर रहे हैं नाम।
  2. अपने वर्कफ़्लो के लिए सार्थक तरीके से शाखाओं को अलग करने के लिए छोटे लीड टोकन को परिभाषित करें और उपयोग करें।
  3. अपनी शाखा के नामों के हिस्सों को अलग करने के लिए स्लेश का उपयोग करें।
  4. नंगे संख्याओं को प्रमुख भागों के रूप में उपयोग न करें।
  5. लंबी अवधि की शाखाओं के लिए लंबे वर्णनात्मक नामों से बचें।

समूह टोकन

उपयोग अपनी शाखा के नाम के सामने "समूहीकरण" टोकन।

group1/foo 
group2/foo 
group1/bar 
group2/bar 
group3/bar 
group1/baz 

समूह को आपके वर्कफ़्लो से मेल खाने के लिए जो कुछ भी पसंद है, उसका नाम दिया जा सकता है। मैं अपने लिए छोटे संज्ञाओं का उपयोग करना पसंद करता हूं। अधिक स्पष्टता के लिए पढ़ें।

कम अच्छी तरह से परिभाषित टोकन

कम टोकन चुनें ताकि वे अपनी शाखा के नाम से हर एक के लिए बहुत अधिक शोर न जोड़ें।

wip  Works in progress; stuff I know won't be finished soon 
feat  Feature I'm adding or expanding 
bug  Bug fix or experiment 
junk  Throwaway branch created to experiment 

इन टोकन से प्रत्येक के लिए अपने कार्यप्रवाह का कौन सा हिस्सा प्रत्येक शाखा अंतर्गत आता है आपको बताने के लिए इस्तेमाल किया जा सकता: मैं इन का उपयोग करें।

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

new/frabnotz 
new/foo 
new/bar 
test/foo 
test/frabnotz 
ver/foo 

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

$ git branch --list "test/*" 
test/foo 
test/frabnotz 

$ git branch --list "*/foo" 
new/foo 
test/foo 
ver/foo 

$ gitk --branches="*/foo" 

उपयोग अलग अलग हिस्सों

आप किसी भी सीमांकक आप शाखा नामों में सबसे अधिक पसंद है का उपयोग कर सकते करने के लिए स्लैश, लेकिन मैं स्लैश सबसे लचीला होना पाते हैं। आप डैश या डॉट्स का उपयोग करना पसंद कर सकते हैं। लेकिन स्लेश आपको रिमोट से/धक्का देने या लाने के दौरान कुछ शाखा नामकरण करने देते हैं।

$ git push origin 'refs/heads/feature/*:refs/heads/phord/feat/*' 
$ git push origin 'refs/heads/bug/*:refs/heads/review/bugfix/*' 

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

$ git checkout new<TAB> 
Menu: new/frabnotz new/foo new/bar 


$ git checkout foo<TAB> 
Menu: new/foo test/foo ver/foo 

(Zshell आदेश पूरा होने के बारे में बहुत विन्यास योग्य है और मैं भी यह डैश को संभालने के लिए कॉन्फ़िगर कर सकता है, रेखांकित या उसी तरह डॉट्स। लेकिन मैं नहीं चुन सकते हैं।)

यह भी आप शाखाओं के लिए खोज करने देता है कई Git आदेश, इस तरह में:

git branch --list "feature/*" 
git log --graph --oneline --decorate --branches="feature/*" 
gitk --branches="feature/*" 

चेतावनी: Slipp टिप्पणी में बताते हैं के रूप में, स्लैश समस्याएं पैदा कर सकता। चूंकि शाखाओं को पथ के रूप में लागू किया जाता है, इसलिए आपके पास "foo" नामक शाखा नहीं हो सकती है और "foo/bar" नाम की एक और शाखा नहीं हो सकती है। यह नए उपयोगकर्ताओं के लिए भ्रमित हो सकता है।

नंगे संख्या

का उपयोग अपनी शाखा नामकरण योजना के भाग के रूप में उपयोग के नंगे संख्या (या हेक्स संख्या) का उपयोग न करें न करें। किसी संदर्भ नाम के टैब-विस्तार के अंदर, गिट यह तय कर सकता है कि एक शाखा शाखा नाम के बजाय शिया -1 का हिस्सा है। उदाहरण के लिए, मेरे अंक ट्रैकर दशमलव संख्याओं के साथ बग नाम। मैं भ्रम से बचने के लिए सिर्फ nnnnn की बजाय मेरी संबंधित शाखाओं CRnnnnn नाम।

$ git checkout CR15032<TAB> 
Menu: fix/CR15032 test/CR15032 

अगर मैं विस्तार करने के लिए करने की कोशिश की सिर्फ 15,032, Git अनिश्चित हैं कि मैं SHA-1 के या शाखा नाम खोज करने के लिए करना चाहता था हो सकता है, और मेरी पसंद कुछ हद तक सीमित होगा।

बचें लंबे वर्णनात्मक नाम

लांग शाखा के नाम बहुत उपयोगी है जब आप शाखाओं की एक सूची को देख रहे हैं हो सकता है। लेकिन यह सजाए गए एक-लाइन लॉग को देखकर रास्ते में जा सकता है क्योंकि शाखा के नाम अधिकतर पंक्ति को खा सकते हैं और लॉग के दृश्य भाग को संक्षिप्त कर सकते हैं।

दूसरी ओर लंबी शाखा के नाम "मर्ज काम करने" में अधिक सहायक हो सकते हैं यदि आप उन्हें हाथ से फिर से लिखना नहीं चाहते हैं। डिफ़ॉल्ट विलय प्रतिबद्ध संदेश Merge branch 'branch-name' है। Merge branch 'fix/CR15032' के बजाय Merge branch 'fix/CR15032/crash-when-unformatted-disk-inserted' के रूप में संदेशों को मर्ज करने के लिए आपको और अधिक सहायक मिल सकता है।

+117

'बग/20574/फ्रैब्नोटज़-फाइंडर' और 'बग/20424' जैसे रूपों के मिश्रण का उपयोग करने के लिए एक नकारात्मक पक्ष यह है कि एक बार जब आप उप-टोकन के बिना शुरू करते हैं, तो आप बाद में एक और इसके विपरीत नहीं जोड़ सकते हैं। _E.G .: यदि आप 'बग/20424' शाखा बनाते हैं, तो आप बाद में' बग/20424/अतिरिक्त-फ़िक्सिंग 'शाखा नहीं बना सकते हैं (जब तक आप' बग/20424' शाखा हटा नहीं देते)। इसी प्रकार, यदि 'बग/20574/frabnotz-finder' पहले से ही एक शाखा है, तो आप' बग/20574' शाखा नहीं बना सकते हैं ._ मैं इस तरह के मामलों में गैर-उप-टोकन डिलीमीटर का उपयोग करता हूं (उदाहरण के लिए ' बग/20574_frabnotz-finder'), या उप-टोकन (जैसे 'बग/20424/मुख्य') के लिए डिफ़ॉल्ट नाम चुनें। –

+3

इसमें कुछ गिट जीयूआई-आधारित टूल्स को संकेत देने का लाभ भी है जो निर्देशिका सूची दृश्य जैसे टकराव वाले डिवीजनों को ध्वस्त करने की अनुमति देता है। उपर्युक्त उदाहरण में, आपको 'फीचर' समूह और' बग 'समूह दिखाई देगा, जो' foo', 'bar' टैग को पूर्व और' 20574', '20592' समूह और' 20424' दिखाने के लिए विस्तार योग्य होगा, उत्तरार्द्ध के लिए '21334' टैग। –

+19

मैं गिट शाखा नामकरण में कभी भी स्लेश का उपयोग करने के लिए एक अभियान शुरू करने जा रहा हूं। इसका कारण यह है कि यदि उदाहरण के लिए सीआई पर, उदाहरण के लिए पैकेजिंग कोड के दौरान आप शाखा के नाम का संदर्भ लेना चाहते हैं, तो आप यूरी या पाथ (उदाहरण के लिए) बनाते समय शाखा के नाम का उल्लेख करना चाहते हैं, शायद एक बैश लिपि में एक यूरी का निर्माण; यूआरएल भाग जोड़ने के कारण आपको यूरी बनाने में परेशानी होगी। हां स्लैश को प्रतिस्थापित करना संभव है लेकिन यह मुझे हल करने के लिए अधिक समय ले जाएगा। –

21

मैंने जो विभिन्न योजनाएं देखी हैं और मैंने उपयोग की जाने वाली टूलिंग के आधार पर मिश्रित और मिलान किया है। तो मेरी पूरी की शाखा का नाम होगा:

नाम/सुविधा/मुद्दा-ट्रैकर संख्या/शॉर्ट वर्णन

जो अनुवाद होगा करने के लिए:

माइक/ब्लॉग/RSSI- 12/लोगो-फिक्स

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

+0

मैं वही हूं, प्रतिबद्ध संदेश में बग/फीचर नंबर को छोड़कर (गिटहब -> पिवोटल ट्रैकर एकीकरण के लिए)। – Leo

7

नोट, जैसा कि commit e703d7 या commit b6c2a0d (मार्च 2014) में दिखाया गया है, अब गिट 2.0 का हिस्सा है, आपको एक और नामकरण सम्मेलन मिलेगा (जिसे आप शाखाओं पर लागू कर सकते हैं)।

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

एक शाखा का नाम स्थान नहीं कर सकते हैं ("Which characters are illegal within a branch name?" देखते हैं और git check-ref-format man page)।

तो प्रत्येक शाखा नाम के लिए जिसे एक बहु-शब्द अभिव्यक्ति द्वारा दर्शाया जाएगा, एक विभाजक के रूप में '-' (डैश) का उपयोग करना एक अच्छा विचार है।