git गिट शाखा सर्वश्रेष्ठ प्रथाओं का नामकरण




naming-conventions branch (6)

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

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

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

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


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

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

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


मेरी व्यक्तिगत प्राथमिकता एक शाखा शाखा के साथ किए जाने के बाद शाखा का नाम हटाना है।

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

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

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


यहां कुछ शाखा नामकरण सम्मेलन हैं जिनका मैं उपयोग करता हूं और उनके कारण

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

  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 branch --list "feature/*"
git log --graph --oneline --decorate --branches="feature/*" 
gitk --branches="feature/*" 

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

नंगे संख्याओं का प्रयोग न करें

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

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

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

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

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

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


विन्सेंट ड्रिससेन द्वारा एक सफल गिट ब्रांचिंग मॉडल के अच्छे सुझाव हैं। एक तस्वीर नीचे है। यदि यह शाखा मॉडल आपको अपील करता है तो गिट के प्रवाह प्रवाह पर विचार करें। दूसरों ने प्रवाह के बारे में टिप्पणी की है

Driessen के मॉडल में शामिल हैं

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

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

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

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

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


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

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

जो अनुवाद करेगा:

माइक / ब्लॉग / RSSI-12 / लोगो ठीक

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


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

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





branch