Git की शाखा से टैग कैसे अलग है? मुझे यहां कौन सा उपयोग करना चाहिए?


615

मैं कैसे उपयोग करने के लिए समझ में कुछ असुविधा हो रहा है टैग बनाम शाखाओं में

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


4
चूँकि git टैग का उपयोग करने के लिए वेब खोज ने मुझे सबसे पहले उस लिंक पर लाया, इसलिए मैं इसमें एक टैग के बारे में बेहतर (IMHO) उत्तर देता
हूं

जवाबों:


519

एक टैग समय में एक विशेष शाखा के एक संस्करण का प्रतिनिधित्व करता है। एक शाखा विकास के एक अलग सूत्र का प्रतिनिधित्व करती है जो समान कोड आधार पर अन्य विकास प्रयासों के साथ समवर्ती रूप से चल सकता है। एक शाखा में परिवर्तन करने के बाद उन्हें एकीकृत करने के लिए दूसरी शाखा में वापस विलय किया जा सकता है।

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

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


40
अपने मामले में वह शाखाओं का उपयोग करना चाहता है, हो सकता है कि आप अपने उत्तर में भी इस पर ध्यान दें;)
knittl

13
AFAIK, टैग प्रति शाखा अद्वितीय नहीं हैं। इसलिए यो अलग-अलग शाखाओं में अलग-अलग कमिट के लिए एक ही नाम नहीं दे सकते।
मेरा

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

28
एक टैग एक प्रतिबद्ध हैश के लिए सिर्फ एक उपनाम है। जैसे ही आप किसी कमिटमेंट की जांच git checkout 88c9f229fकर सकते हैं, git checkout your_tagआप कुछ ऐसा कर सकते हैं और आप उस कमेट को चेक करेंगे, जो टैग द्वारा अलियास किया गया था।
जटर्म

6
@ जेट, शाखाएँ भी नहीं हैं? अंतर केवल इतना है कि एक शाखा-उर्फ स्वचालित रूप से श्रृंखला में सबसे हाल ही में प्रतिबद्ध है।
विक्टर मोलोकोस्टोव

529

से सैद्धांतिक दृष्टिकोण:

  • टैग किसी दिए गए संशोधन के लिए प्रतीकात्मक नाम हैं । वे हमेशा एक ही वस्तु की ओर इशारा करते हैं (आमतौर पर: एक ही संशोधन के लिए); वे नहीं बदलते हैं।
  • शाखाएँ विकास की रेखा का प्रतीकात्मक नाम हैं । नई शाखाएँ शाखा के ऊपर बनाई गई हैं। शाखा सूचक स्वाभाविक रूप से अग्रिम करता है, नए और नए तरीकों की ओर इशारा करता है।

से तकनीकी दृष्टिकोण:

  • टैगrefs/tags/ नेमस्पेस में रहते हैं , और टैग ऑब्जेक्ट्स (एनोटेट और वैकल्पिक रूप से हस्ताक्षरित जीपीजी पर हस्ताक्षर किए गए टैग) या सीधे ऑब्जेक्ट (स्थानीय नामों के लिए कम इस्तेमाल किए जाने वाले हल्के टैग), या बहुत दुर्लभ मामलों में यहां तक ​​कि ट्री ऑब्जेक्ट या ब्लॉ ऑब्जेक्ट पर भी इंगित कर सकते हैं (जैसे एलपीजी हस्ताक्षर )।
  • शाखाएंrefs/heads/ नामस्थान में रहती हैं , और केवल वस्तुओं के लिए संकेत कर सकती हैंHEADसूचक एक शाखा (प्रतीकात्मक संदर्भ) या सीधे एक प्रतिबद्ध (अलग सिर या अनाम शाखा) के लिए का उल्लेख करना चाहिए।
  • रिमोट-ट्रैकिंग शाखाएँrefs/remotes/<remote>/ नामस्थान में रहती हैं , और दूरस्थ रिपॉजिटरी में साधारण शाखाओं का अनुसरण करती हैं <remote>

यह भी देखें gitglossary मैनपेज:

डाली

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

टैग

किसी टैग या प्रतिबद्ध वस्तु की ओर इशारा करते हुए रेफरी। एक सिर के विपरीत, एक टैग एक प्रतिबद्ध द्वारा नहीं बदला जाता है। टैग (टैग ऑब्जेक्ट नहीं) में संग्रहीत हैं $GIT_DIR/refs/tags/। [...]। एक टैग का उपयोग आमतौर पर प्रतिबद्ध वंश श्रृंखला में एक विशेष बिंदु को चिह्नित करने के लिए किया जाता है।

टैग ऑब्जेक्ट

एक ऑब्जेक्ट जिसमें किसी अन्य ऑब्जेक्ट की ओर इशारा करते हुए रेफरी होता है, जिसमें एक कमिट ऑब्जेक्ट की तरह एक संदेश हो सकता है। इसमें एक (PGP) हस्ताक्षर भी हो सकता है, जिस स्थिति में इसे "हस्ताक्षरित टैग ऑब्जेक्ट" कहा जाता है।


36
प्रश्न: यदि आप एक शाखा को टैग की तरह मानते हैं (यानी आप इसे बनाते हैं, तो इसे कभी अपडेट न करें), क्या कोई वास्तविक अंतर है?
स्टीव बेनेट

30
@SteveBennett बिल्कुल। इसमें अलग-अलग informations हैं (आप एक टैग पर हस्ताक्षर कर सकते हैं, आप एक शाखा में एक विवरण जोड़ सकते हैं)। आप एक शाखा को स्थानांतरित कर सकते हैं (इसलिए भले ही आप इसे कभी भी अपडेट न करें, आप अभी भी इसे रिबेट कर सकते हैं।) आप एक टैग नहीं ले जा सकते हैं (यह एक विशिष्ट प्रतिबद्ध से जुड़ा हुआ है)। आप एक शाखा को आगे बढ़ाने के लिए चुन सकते हैं। टैग डिफ़ॉल्ट रूप से पुश नहीं किए जाते हैं। आपको कभी भी दूसरे के लिए एक का उपयोग नहीं करना चाहिए (जब तक कि आप वास्तव में एक एसवीएन मानसिकता में नहीं हैं, उस स्थिति में आपको "अन-लर्न" की आवश्यकता है जो उपवास करना चाहते हैं यदि आप गिट के साथ जाना चाहते हैं)।
VonC

19
@SteveBennett: एक अंतर यह है कि कैसे Git शाखाओं का इलाज करता है बनाम यह कैसे टैग का इलाज करता है। इसके अलावा जो VonC ने कहा, आप गलती से टैग को आगे नहीं बढ़ा सकते हैं: " git checkout <tag>" अनाम अनाम शाखा उत्पन्न करेगा (तथाकथित 'अलग किया गया') और टैग की स्थिति का चयन करें । एक नई प्रतिबद्ध बनाना इस अनाम शाखा पर करता है, और यह नहीं बदलता है कि टैग किस बिंदु पर इंगित करता है।
जकुब नारबस्की

60
IMO, शाखाएं अलग-अलग समयसीमा (समानांतर दुनिया) हैं, और टैग एक समय पर विशिष्ट क्षण हैं।
Eonil

25
यहाँ किसी ने अभी तक इसका उल्लेख नहीं किया है, लेकिन आप एक टैग को शाखा शुरू करने के लिए बिंदु के रूप में उपयोग कर सकते हैं:git checkout -b <branch name> <tag name>

143

यदि आप अपनी रिपॉजिटरी को एक पुस्तक के रूप में मानते हैं जो क्रोनिकल्स आपकी परियोजना पर प्रगति करती है ...

शाखाओं

आप उन स्टिक बुकमार्क में से एक शाखा के बारे में सोच सकते हैं :

यहाँ छवि विवरण दर्ज करें

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

इसके अलावा, आप हमेशा किसी विशेष बुकमार्क को पुस्तक के किसी अन्य पृष्ठ पर ले जा सकते हैं (उपयोग करते हुए git-reset उदाहरण के लिए, उदाहरण के लिए); समय के साथ रुचि के बिंदु अलग-अलग होते हैं।

टैग

आप अध्याय शीर्षकों के रूप में टैग के बारे में सोच सकते हैं ।

बुकमार्क

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


16
मुझे लगता है कि एक शाखा एक पुस्तक होगी, और बुकमार्क टैग हैं। आप एक पुस्तक लिखना जारी रख सकते हैं, लेकिन आप इसे संपादित नहीं कर सकते। पुस्तक में टैग एक निश्चित क्षण है।
मालती ब्रीडिस

5
@ जुब्स मुझे विकास की एक पंक्ति के रूप में शाखा स्पष्टीकरण पसंद आया। एक किताब एक शाखा होगी। आप उस स्थान के आधार पर एक नई पुस्तक शुरू कर सकते हैं जहां मुख्य शाखा छोड़ दी गई है। आप उन्हें पैराल लिख सकते हैं और फिर एक पुस्तक / शाखा में विलय करने का प्रयास कर सकते हैं।
मालती ब्रीडिस

2
@ Mrrti MšBriedis मुझे लगता है कि जिस तरह से आप एक शाखा के बारे में सोचना पसंद करते हैं, लेकिन मुझे लगता है कि, गिट में, यह वास्तव में भ्रामक है। देखें stackoverflow.com/questions/25068543/…
jub0bs

2
यह वास्तव में एक समय बचाने वाला जवाब है
अली फोउगी

2
यदि आप एक पुस्तक लिखना शुरू करते हैं और आपके पास पहले 50 पृष्ठ हैं, तो आप इसे कॉपी कर सकते हैं (इसमें से एक नई शाखा बना सकते हैं) और साथ में दो किताबें लिखना जारी रखें (या किसी अन्य लेखक - डेवलपर को पुस्तक की प्रतिलिपि दें) और अंत में आप विलय कर सकते हैं दूसरी पुस्तक से आपकी पुस्तक में परिवर्तन।
नंगे पाँव

42

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

अब आप (SVN के साथ इस समय) स्पष्ट रूप से अपनी रिपॉजिटरी के साथ संरचना नहीं करेंगे:

branches
   myFirstBranch
     myProject
       mySubDirs
   mySecondBranch
     ...
tags
   myFirstTag
     myProject
       mySubDirs
   mySecondTag
   ...

यह संरचना इस तथ्य से आती है कि सीवीएस एक संशोधन प्रणाली है न कि एक संस्करण प्रणाली (देखें स्रोत नियंत्रण बनाम संशोधन नियंत्रण? )।
इसका मतलब है कि सीवीएस के लिए टैग के माध्यम से शाखाओं का अनुकरण किया जाता है, एसवीएन के लिए निर्देशिका प्रतियां।

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

गिट में, संशोधनों का इतिहास एक ग्राफ बनाने के लिए, श्रृंखलाओं की एक श्रृंखला है।
एक शाखा उस ग्राफ का एक मार्ग है

x--x--x--x--x # one branch
    \ 
     --y----y # another branch
       1.1
        ^
        |
        # a tag pointing to a commit
  • यदि आप एक टैग की जांच करते हैं, तो आपको उससे काम शुरू करने के लिए एक शाखा बनाने की आवश्यकता होगी।
  • यदि आप किसी शाखा की जांच करते हैं, तो आप सीधे उस शाखा के नवीनतम प्रतिबद्ध ('हेड') देखेंगे।

जकुब नारबस्की का उत्तर देखेंसभी तकनीकी के लिए , लेकिन स्पष्ट रूप से, इस बिंदु पर, आपको सभी विवरणों की आवश्यकता नहीं है (अभी तक);

मुख्य बिंदु यह है: एक टैग एक प्रतिबद्ध को एक साधारण सूचक होने के नाते, आप कभी भी इसकी सामग्री को संशोधित करने में सक्षम नहीं होंगे। आपको एक शाखा की आवश्यकता है।


आपके मामले में, प्रत्येक डेवलपर एक विशिष्ट सुविधा पर काम कर रहा है:

  • अपने संबंधित भंडार में अपनी शाखा बनाना चाहिए
  • अपने सहयोगी की रिपॉजिटरी (एक ही फीचर पर काम करने वाले) से शाखाओं को ट्रैक करें
  • अपने साथियों के साथ अपने काम को साझा करने के लिए खींच / धक्का।

अपने सहयोगियों की शाखाओं को सीधे ट्रैक करने के बजाय, आप केवल एक "आधिकारिक" केंद्रीय रिपॉजिटरी की शाखा को ट्रैक कर सकते हैं, जिसमें हर कोई इस विशेष सुविधा के लिए हर किसी के काम को एकीकृत करने और साझा करने के लिए अपने काम को आगे बढ़ाता है।


1
यह स्पष्ट करने के लिए धन्यवाद कि शाखाएँ और टैग कैसे काम करते हैं :) मैं आपके उदाहरण के बिना इसे पूरी तरह से समझने में सक्षम नहीं होगा।
ufk

3
@VonC: मुझे लगता है कि आपको अपने जवाब में "SVN" से मतलब है न कि "CVS" से। सीवीएस में निर्देशिका संरचना नहीं है; एसवीएन करता है। वास्तव में, git में टैगिंग मुझे SVN (जहाँ टैग == पतित शाखा) में टैग करने की तुलना में RCS / CVS में टैगिंग की बहुत याद दिलाता है।
क्रिस क्लेलैंड

1
@ क्रिसक्लेलैंड अच्छी बात है। मैंने (संपादित) उत्तर में थोड़ा और CVS और SVN अंक अलग करने की कोशिश की है।
वॉन

37

शाखाएं लकड़ी से बनी होती हैं और पेड़ के तने से उगती हैं। टैग कागज के बने होते हैं (लकड़ी के व्युत्पन्न) और पेड़ में विभिन्न स्थानों से क्रिसमस के गहने की तरह लटकते हैं।

आपकी परियोजना पेड़ है, और परियोजना में जोड़ा जाएगा कि आपकी सुविधा एक शाखा पर बढ़ेगी। उत्तर है शाखा।


3
सादृश्य के लिए प्यार
May87

16

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


11
टैग की गारंटी दी जाती है कि जब तक वे मौजूद हैं, तब तक उसी प्रतिबद्धता को इंगित करें। पूरी तरह से सच नहीं है। आप वास्तव में एक टैग के साथ आगे बढ़ सकते हैं git tag -f
17

14

टैग पर हस्ताक्षर किए जा सकते हैं या अहस्ताक्षरित हो सकते हैं ; शाखाओं पर कभी हस्ताक्षर नहीं होते हैं।

हस्ताक्षर किए गए टैग कभी भी स्थानांतरित नहीं हो सकते क्योंकि वे एक विशेष प्रतिबद्धता के साथ क्रिप्टोग्राफिक रूप से बाध्य हैं (हस्ताक्षर के साथ)। अहस्ताक्षरित टैग बाध्य नहीं हैं और उन्हें स्थानांतरित करना संभव है (लेकिन टैग्स का चलना सामान्य उपयोग का मामला नहीं है)।

शाखाएं न केवल एक अलग प्रतिबद्धता के लिए आगे बढ़ सकती हैं, बल्कि उनसे ऐसा करने की अपेक्षा की जाती है। आपको अपने स्थानीय विकास परियोजना के लिए एक शाखा का उपयोग करना चाहिए। यह "एक टैग पर" एक जीत भंडार के लिए काम करने के लिए काफी मतलब नहीं है।


12

मैं के बारे में सोचना चाहते शाखाओं के रूप में जहाँ आप जा रहे हैं , टैग के रूप में आप कहां गए थे

एक टैग अतीत में एक विशेष महत्वपूर्ण बिंदु के बुकमार्क की तरह लगता है, जैसे कि एक संस्करण रिलीज़।

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


10

Git दृष्टान्त बताते हैं कि कैसे एक ठेठ DVCS बनाया जाता है और यही कारण है कि उनके रचनाकारों किया उन्होंने क्या किया। इसके अलावा, आप कंप्यूटर वैज्ञानिक के लिए Git पर एक नज़र डालना चाहते हैं ; यह बताता है कि Git में प्रत्येक प्रकार की वस्तु क्या है, जिसमें शाखाएं और टैग शामिल हैं।


6

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


4

सरल:

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

Git उपयोगकर्ता मैनुअल


4

सरल उत्तर है:

शाखा: वर्तमान शाखा सूचक रिपॉजिटरी के लिए हर कमिट के साथ चलती है

परंतु

टैग: वह कमिट जो एक टैग पॉइंट नहीं बदलता है, वास्तव में टैग उस कमिट का स्नैपशॉट है।

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