संस्करण प्रबंधन के लिए गिटब, शाखाओं और स्वचालित रिलीज का उपयोग कैसे करें? [बन्द है]


24

मैं अब तक के अधिकांश मूल Git / Github अवधारणाओं को समझता हूं, हालांकि मुझे अभी भी बड़ी तस्वीर को समझने में परेशानी है।

ये कुछ चीजें हैं जिन्हें मैंने अब तक काम करने में कामयाब किया है:

  • धक्का देता है
  • शाखाओं के साथ काम करें
  • एक निरंतर एकीकरण प्रणाली ट्रैविस सीआई के साथ जीथूब को एकीकृत करें
  • वाया ट्रैविस CI, स्वचालित रूप से मास्टर के लिए हर कमिट पर निर्माण करता है और रिलीज के तहत जीथ पर जिप के रूप में रिलीज करता है।

हालाँकि, मैंने अभी तक परियोजनाओं के अल्फा / बीटा संस्करणों पर ही काम किया है, इसलिए मैंने अभी तक अभ्यास में संस्करण जारी नहीं किए हैं।

इस प्रकार मैं संस्करण के बारे में और जानना चाहता हूं, अलग-अलग संस्करणों को बनाए रखना, संस्करणों को अपडेट करना, आदि।

मैं यह कैसे सुनिश्चित करूंगा कि निम्नलिखित चीजें हों:

  • मेरी परियोजना के विभिन्न संस्करण हैं, उदाहरण के लिए संस्करण 1.1.0 और 2.0.0
  • संस्करणों पर हॉटफ़िक्स को पुश करने की क्षमता है, संस्करण को 1.1.1 या 2.0.1 से टक्कर देने की तरह, आदि।
  • एक निरंतर एकीकरण प्रणाली बनाएं जो उस संस्करण को स्वचालित रूप से प्रतिबद्ध करता है और यदि सफल होता है, तो उस विशिष्ट संस्करण के लिए रिलीज़ प्रकाशित करें।

मैं निम्नलिखित विकल्पों के बीच संदेह कर रहा हूं:

  • क्या मुझे हर संस्करण के लिए टैग का उपयोग करने की आवश्यकता है? यदि हां, तो एक निरंतर एकीकरण प्रणाली अपने आप रिलीज कैसे बना सकती है?
  • क्या मुझे हर संस्करण के लिए शाखाएँ बनानी चाहिए? यदि ऐसा है, तो यह पूरी टन शाखाएँ नहीं बनायेगा (जैसे 1.1 और 2.0 शाखा, निश्चित रूप से शाखाएँ उस शाखा पर जाती हैं)
  • मैं संस्करण संख्या कैसे निर्दिष्ट करूंगा? क्या कॉन्फ़िगरेशन फ़ाइल होना ठीक है जो संस्करण संख्या निर्दिष्ट करती है, या इसके आस-पास और भी स्मार्ट तरीके हैं? इस मामले में, यह एक जावा परियोजना होगी, यदि यह मायने रखता है।

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

सामग्री को प्रतिबिंबित करने के लिए शीर्षक को थोड़ा नीचे रखा।
माइकल डुरंट


1
मैं यह इंगित करूंगा कि जब मैं यह पा सकता हूं कि बहुत से, और अधिक (मैं कमरे से बाहर भाग गया), इस प्रश्न के भीतर व्यक्तिगत प्रश्नों के लिए संभव डुप्लिकेट है मेरा मानना ​​है कि समग्र प्रश्न 'बहुत व्यापक' पक्ष पर थोड़ा सा है।

"आपके प्रश्नों को यथोचित रूप से बंद किया जाना चाहिए ..." ( सहायता केंद्र )। देखें meta.programmers.stackexchange.com/questions/6483/...
कुटकी

जवाबों:


42

आपको git-flow को देखना चाहिए । यह एक उत्कृष्ट (और लोकप्रिय) शाखा मॉडल है।

गिट फ्लो सारांश

शाखाओं में

मुख्य चड्डी जो हमेशा के लिए आसपास रहती हैं developऔर हैं mastermasterआपकी नवीनतम रिलीज़ को developहोल्ड करता है और आपकी नवीनतम "स्थिर" डेवलपमेंट कॉपी रखता है।

योगदानकर्ता featureशाखाएँ बनाते हैं ( feature/अधिवेशन के साथ उपसर्ग ) develop :

$ git checkout -b feature/my-feature develop

और hotfixशाखाएँ ( hotfix/सम्मेलन के साथ उपसर्ग ) बंद master:

# hotfix the latest version of master
$ git checkout -b hotfix/hotfix-version-number master

# or hotfix from a specific version
$ git checkout -b hotfix/hotfix-version-number <starting-tag-name>

ये शाखाएं "डिस्पोजेबल" हैं, जिसका अर्थ है कि मुख्य चड्डी में वापस विलय करने से पहले उनका जीवनकाल छोटा होता है। वे कार्यक्षमता के छोटे टुकड़ों को एनकैप्सुलेट करने के लिए हैं।

शाखाओं को खत्म करना

जब एक featureशाखा के साथ एक योगदानकर्ता किया जाता है , तो वे इसे वापस मर्ज कर देते हैं develop:

$ git checkout develop
$ git merge --no-ff feature/my-feature
$ git branch -d feature/my-feature

जब वे एक hotfixशाखा के साथ किया जाता है , तो वे इसे वापस दोनों में विलय कर देते हैं masterऔर developइसलिए हॉटफ़िक्स आगे बढ़ता है:

$ git checkout master
$ git merge --no-ff hotfix/hotfix-version-number
$ git checkout develop
$ git merge --no-ff hotfix/hotfix-version-number
$ git branch -d hotfix/hotfix-version-number

यह निरंतर एकीकरण पहलू है।

विज्ञप्ति

जब आप किसी रिलीज़ को पैकेजिंग शुरू करने के लिए तैयार होते हैं, तो आप releaseअपनी "स्थिर" developशाखा से एक शाखा बनाते हैं (उसी तरह featureशाखाएँ बनाना )। आप फिर संस्करण संख्या को एक टैग (नीचे वर्णित) में टकराते हैं।

अलग-अलग releaseशाखाओं का उपयोग करने से developआपको बग्स को ठीक करने और releaseशाखा में परिष्करण स्पर्श जोड़ने के लिए नई सुविधाओं को विकसित करना जारी रखने की अनुमति मिलती है ।

जब आप रिलीज़ को पूरा करने के लिए तैयार हो जाते हैं, तो आप releaseशाखा को दोनों में विलय कर देते हैं masterऔर develop(सिर्फ एक जैसे hotfix) ताकि आपके सभी परिवर्तन आगे बढ़ें।

टैगिंग

जब आप एक releaseशाखा या शाखा बनाते हैं hotfix, तो आप संस्करण संख्या को एक टैग में उचित रूप से टकराते हैं। वेनिला गिट के साथ, जो इस तरह दिखता है:

$ git tag -a <tag-name> -m <tag-description>

फिर आपको अपने दूरस्थ रिपॉजिटरी में टैग (अलग से) पुश करने होंगे:

$ git push --tags

यह आमतौर पर सिमेंटिक संस्करण का उपयोग करने के लिए सबसे अच्छा है जिसमें आपके संस्करण फॉर्म लेते हैं major.minor.hotfix। मेजर बम्प्स पीछे की ओर असंगत हैं, जबकि मामूली और हॉटफ़िक्स बम्प्स पीछे की ओर असंगत नहीं हैं (जब तक कि आप बीटा में नहीं हैं, 0.x.x)।

विलय

जैसा कि आपने ऊपर देखा, git-flow आपको निम्नलिखित कमांड के साथ शाखाओं को मर्ज करने के लिए प्रोत्साहित करता है:

$ git merge --no-ff <branch-name>

--no-ffविकल्प आपको वर्तमान में चारों ओर झूठ बोल रही शाखाओं का एक समूह छोड़े बिना अपनी शाखा इतिहास के सभी बनाए रखने के लिए भंडार (ताकि कोई चिंता नहीं है, तो आप हर संस्करण के लिए एक शाखा के लिए नहीं होगा) के लिए प्रतिबद्ध है।

आपको साथ खींचने के लिए भी प्रोत्साहित किया जाता है

$ git pull --rebase

तो आप बहुत सारे बेकार मर्ज को नहीं जोड़ते हैं।

आप इन दोनों चीजों को डिफ़ॉल्ट रूप से करने के लिए git कॉन्फ़िगर कर सकते हैं .gitconfig। मैं तुम्हें उस एक को देखने दूँगा;)

ब्राउजिंग संस्करण

जब कोई आपके कोडबेस के विशिष्ट संस्करण की तलाश में होता है, तो वे टैग को नाम से देख सकते हैं:

# checkout in detached HEAD to browse
$ git checkout <tag-name>

# OR checkout and create a new local branch (as you might for a hotfix)
$ git checkout -b <new-branch-name> <tag-name>

या, अगर कोई गितुब पर ब्राउज़ कर रहा है, तो "शाखाओं" ड्रॉपडाउन में "टैग" टैब भी है।

Git-flow एक्सटेंशन (अनुशंसित) का उपयोग करना

इस मॉडल का उपयोग करने का मेरा पसंदीदा तरीका git के लिए git flow एक्सटेंशन है।

( संपादित करें: लुई ने एवीएच कांटा की सिफारिश की है जो git describeअब बेहतर काम करता है और अब अधिक सक्रिय हो सकता है। धन्यवाद लुई।)

विस्तार सभी गंदे भागों को स्वचालित करता है (जैसे merge --no-ffविलय के बाद शाखाओं का उपयोग करना और हटाना) ताकि आप अपने जीवन के साथ जुड़ सकें।

उदाहरण के लिए, एक्सटेंशन के साथ, आप एक सुविधा शाखा बना सकते हैं जैसे:

$ git flow feature start my-feature-name

और इसे खत्म करो

$ git flow feature finish my-feature-name

हॉटफ़िक्स और रिलीज़ के लिए आदेश समान हैं, हालांकि वे शाखा नाम के स्थान पर संस्करण संख्या का उपयोग करते हैं, जैसे:

# Create hotfix number 14 for this minor version.
$ git flow hotfix start 2.4.14

# Create the next release
$ git flow release start 2.5.0

Git flow तब आपके लिए संस्करण टैग बनाता है और कृपया आपको किसी भी कॉन्फ़िगरेशन या प्रकट फ़ाइलों में संस्करण को टक्कर देने के लिए याद दिलाता है (जो आप ग्रंट जैसे कार्य प्रबंधक के साथ कर सकते हैं)।


आशा है कि मदद करता है :) मुझे यकीन नहीं है कि आप इसे अपने ट्रैविस सीआई सेटअप के साथ कैसे एकीकृत करेंगे, लेकिन मुझे लगता है कि जीथूको आपको मिल जाएगा।


रिलीज़ शाखा शुरू करते समय, क्या आप एक ही शाब्दिक स्ट्रिंग 'रिलीज़' का उपयोग प्रत्येक रिलीज़ के लिए शाखा के नाम के रूप में करते हैं, या 'v0.3.0' जैसे विशिष्ट संस्करण के लिए? ये निर्देश उत्कृष्ट हैं और मैं उन्हें पत्र का पालन करने का प्रयास करूंगा, लेकिन मैं इसके इस पहलू को गड़बड़ाना नहीं चाहता।
पॉल

1
Git flow plugin कमांड का उपयोग करते हुए, आप संस्करण पहचानकर्ता को, जैसे v0.3.0, के लिए डालेंगे <release> git flow release start <release> [<base>]। हुड के तहत, यह संस्करण सहित एक शाखा नाम बनाएगा, जैसे release/v0.3.0
mxdubois

3

क्या मुझे हर संस्करण के लिए एक टैग का उपयोग करने की आवश्यकता है?

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

क्या मुझे हर संस्करण के लिए शाखाएँ बनानी चाहिए?

ज़रूर! Git में ब्रांचिंग सस्ती / मुफ्त होती है, इसलिए मैं इससे मिलने वाले हर मौके का फायदा उठाता हूं। आप शाखाओं को विलय भी कर सकते हैं और शाखाओं को भी जल्दी से हटा सकते हैं। यदि आपको लगता है कि आपके पास कई शाखाएँ हैं, तो आप उन्हें कुछ चुनिंदा विलय के साथ हमेशा बाद में उन्हें बंद कर सकते हैं। यदि आप एक आजमाई हुई और सच्ची योजना का उपयोग करना चाहते हैं तो Git शाखाओं की योजनाएं उपलब्ध हैं।

मैं संस्करण संख्या कैसे निर्दिष्ट करूंगा?

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


3

क्या मुझे हर संस्करण के लिए टैग का उपयोग करने की आवश्यकता है?

यदि "संस्करण" से आपका तात्पर्य फाइलों के एक सेट से है, जो एक रिलीज या रिलीज का उम्मीदवार है, तो मैं दृढ़ता से हर संस्करण को टैग करने की सलाह देता हूं। यदि आपको सड़क के नीचे 1.2.7 संस्करण का उल्लेख करने की आवश्यकता है, तो क्या आप कमिट के हैश के लिए शिकार करना चाहते हैं या संस्करण संख्या का उपयोग करना चाहते हैं?

इसके अलावा यदि आप git describeकहीं भी (जैसा मैं करते हैं) जानकारी दर्ज करने के लिए उपयोग करते हैं, तो टैग का उपयोग करके इसे बहुत अच्छे आउटपुट प्रदान करने की अनुमति मिलती है।

यदि हां, तो एक निरंतर एकीकरण प्रणाली अपने आप रिलीज कैसे बना सकती है?

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

क्या मुझे हर संस्करण के लिए शाखाएँ बनानी चाहिए? यदि ऐसा है, तो यह पूरी टन शाखाएँ नहीं बनायेगा (जैसे 1.1 और 2.0 शाखा, निश्चित रूप से शाखाएँ उस शाखा पर जाती हैं)

मैं "प्रति-संस्करण" होने के नाते शाखा नहीं देखता। मेरे पास कुछ परियोजनाएं हैं जहां मेरे संस्करण masterशाखा पर सभी हैं । मुझे इसके लिए अब और अधिक जटिल चीज़ों की आवश्यकता नहीं है क्योंकि न तो परियोजना स्थिर अवस्था में है और न ही पुराने संस्करणों के दीर्घकालिक समर्थन की आवश्यकता है। लेकिन मान लें कि मैं 1.0, 1.1, 1.2 जारी करता हूं, तो मैं 2.0 रिलीज करता हूं और मुझे अभी भी 1.0 श्रृंखला को सुरक्षा फ़िक्सेस आदि के साथ समर्थन करना है, फिर मैं निश्चित रूप से 1.x श्रृंखला के लिए रखरखाव रिलीज़ को चालू करने के लिए एक शाखा रखूंगा। ।

मैं संस्करण संख्या कैसे निर्दिष्ट करूंगा? क्या कॉन्फ़िगरेशन फ़ाइल होना ठीक है जो संस्करण संख्या निर्दिष्ट करती है, या इसके आस-पास और भी स्मार्ट तरीके हैं? इस मामले में, यह एक जावा परियोजना होगी, यदि यह मायने रखता है।

कॉन्फ़िगरेशन फ़ाइल की तरह, आपके संस्करण संख्या के लिए एकल स्रोत होने के नाते, यह सबसे अच्छा तरीका है क्योंकि यह वसा उंगली की त्रुटियों को रोकता है जो अन्यथा हो सकती है यदि आपको कई स्थानों पर संख्याओं को अपडेट करना है। मैं ... हम्म ... शर्मनाक अनुभव से बोल रहा हूं। आप केवल 1.3 जारी करते हैं कि सॉफ्टवेयर अभी भी रिपोर्ट करता है कि यह संस्करण 1.2 है। ऊप्स!

एक अन्य जवाब में, mxdubois ने आपके लिए gitflow की सिफारिश की। यदि आप gitflow का उपयोग करने का निर्णय लेते हैं, तो मैं AVH संस्करण का उपयोग करने की सलाह दूंगा । मूल संस्करण अब सक्रिय रूप से बनाए नहीं रखा गया है। एक उल्लेखनीय अंतर यह है कि एवीएच संस्करण रिलीज मर्ज करता है जो git describeबुद्धिमानी से काम करने की अनुमति देता है। मूल संस्करण एक तरह से मर्ज करता है जो यात्राएं करता हैgit describe


0

आपकी सूची को स्कैन करके मैं संस्करण को आपके फोकस के रूप में देखता हूं , इसलिए ...

संस्करणों को बनाए रखने का एक तरीका शाखाओं और विलय (या रिबासिंग) के साथ है।

मतलब आपके पास है:

master

फिर आप एक शाखा बनाते हैं

v1

तब आप और अधिक परिवर्तन जोड़ते हैं

master(diff1)

फिर आप एक शाखा बनाते हैं

v3

तब आप और अधिक परिवर्तन जोड़ते हैं

master(diff2)

अभी व:

संस्करण 2 को अपडेट करने के लिए अब आप करते हैं

git checkout v2
git merge master  # for the changes you want to bring into version 2
# rebasing is also an option
# resolve any merge conflicts
# Done.

संस्करण 3 अद्यतन करने के लिए

git checkout v3
git merge master

ऊपर थोक अपडेट के लिए है।

यह संभवतः अधिक संभावना है, हालांकि आप इसके लिए विशिष्ट परिवर्तन करना चाहते हैं

git cherry-pick

Http://git-scm.com/docs/git-cherry-pick पर चेरी लेने पर अधिक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.