2015-03-28 16 views
20

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

# Incorporating a finished feature on develop 
$ git checkout develop 
Switched to branch 'develop' 
$ git merge --no-ff myfeature 
Updating ea1b82a..05e9557 
(Summary of changes) 
$ git branch -d myfeature 
Deleted branch myfeature (was 05e9557). 
$ git push origin develop 

मैं शाखा क्यों हटाना चाहिए: उदाहरण के लिए, इस gitflow निम्नलिखित पता चलता है? मैं भी curios क्या करूँगा जब बाद में एक बग की खोज की गई है जो सुविधा द्वारा पेश की गई थी - क्या मुझे उसी नाम से शाखा बनाना चाहिए, वहां बग ठीक करना चाहिए, मास्टर में विलय करना चाहिए और फिर शाखा को हटा देना चाहिए?

+1

क्योंकि आपकी सुविधा समाप्त हो गई है। शाखा को बनाए रखने की क्या आवश्यकता होगी, जिससे गिट शाखा-ए आदि के नतीजे खराब हो जाएंगे? –

+0

@ ओलिवर चार्ल्सवर्थ इतिहास –

+0

@ जेडखुल्ला - काम अभी भी इतिहास में होगा। –

उत्तर

33

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

A - B - C - F - H [master] 
    \ 
     D - E - G - I[feature] 

देखें प्रतिबद्ध किया गया था है? वास्तविक शाखा जब आप मास्टर में git merge feature, आपको यह मिलता है।

A - B - C - F - H - J [master] 
    \   /
     D - E - G - I [feature] 

और जैसे ही आप git branch -d feature शाखा इतिहास बनी हुई है!

A - B - C - F - H - J [master] 
    \   /
     D - E - G - I 

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

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

git merge --no-ff का उपयोग गिट को "फास्ट फॉरवर्ड" करने और शाखा इतिहास खोने से रोकने के लिए किया जाता है। ऐसा तब होता है जब शाखा बनाई गई थी, master पर कोई काम नहीं किया गया है। इस तरह एक तेजी से आगे दिखता है।

A - B[master]- D - E - G - I [feature] 

git checkout master 
git merge feature 

A - B - D - E - G - I [feature] [master] 

master के बाद से feature का प्रत्यक्ष पूर्वज है, कोई मर्ज की आवश्यकता है। गिट बस master लेबल ले जा सकता है। आपका शाखा इतिहास खो गया है, ऐसा लगता है कि डी, ई, जी और मैं सभी मास्टर पर व्यक्तिगत काम करता हूं। git merge --no-ff गिट को हमेशा ऐसा करने के लिए कहता है, हमेशा मर्ज करने के लिए।

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

फिर भी, शाखा को क्यों हटाएं?दो कारण। सबसे पहले, यह आपकी शाखाओं की सूची मृत शाखाओं के साथ अव्यवस्थित करेगा।

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

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

यदि आप मैक पर हैं, तो GitX आपके लिए भंडार को विज़ुअलाइज़ करेगा। gitk सामान्य संस्करण है।

+0

आपके उत्तर के लिए धन्यवाद! क्या आप उस हिस्से को स्थानांतरित कर सकते हैं जो गिट शाखा की व्याख्या के पहले शाखा_ को हटाएं, ताकि कोई भी वही उत्तर ढूंढने वाले व्यक्ति को शीर्ष पर प्रतिक्रिया मिल सके :)। 'वॉनसी' का जवाब भी बहुत उपयोगी है, हो सकता है कि आप जानकारी के एक पूर्ण स्रोत को बनाने के लिए अपने उत्तर में अपने उत्तर के कुछ हिस्से को शामिल कर सकें। धन्यवाद! –

+0

@ मैक्सिमस आईएमओ गिट शाखाओं के काम के बारे में समझने के बिना, शाखा को हटाने के लिए मेरा तर्क समझ में नहीं आता है। वॉनसी के जवाब के लिए, मैं नहीं देखता कि उसके अंदर क्या है जिसमें मैंने कवर नहीं किया था; क्या आप विस्तारित कर सकते हैं? – Schwern

+0

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

1

क्योंकि myfeature शाखा इतिहास myfeature को लागू करने के लिए किए गए सभी इंटरमीडिएट प्रतिबद्धताओं का प्रतिनिधित्व करता है।

यह रणनीति master में केवल एक प्रतिबद्धता रखती है, और मध्यवर्ती चरणों के बारे में भूल जाती है, जो लंबे समय तक रहने वाली शाखाओं के लिए समझ में आता है, जैसा कि मैंने "Why does git fast-forward merges by default?" में बताया है।

master में किए गए एक प्रतिबद्ध (विलय) के प्रतिबद्ध संदेश को यह स्पष्ट करना चाहिए कि यह 'myfeature' लागू करने के लिए किया गया है।

यदि इसे ठीक करने की आवश्यकता है, तो शाखा का नाम पुन: उपयोग किया जा सकता है (क्योंकि इसे पहले हटा दिया गया था)।

+0

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

+0

क्या आप कृपया अपने उत्तर के लिए छोड़ी गई टिप्पणी को यहां देख सकते हैं [यहां] (http://stackoverflow.com/a/29296584/2545680)? –

+1

@ मैक्सिमस http://stackoverflow.com/a/2850413/6309 एक लंबी-जीवित शाखा के विपरीत, एक शॉट-लाइव शाखा (केवल कुछ ही मास्टर में विलय हो जाता है) दिखाता है, जहां कई काम किए जाएंगे (साथ परीक्षण और त्रुटियां) विलय होने से पहले * आखिरकार * मास्टर के लिए: बाद के मामले में, मास्टर में केवल एक प्रतिबद्धता रखने के लिए क्लीनर है। – VonC

संबंधित मुद्दे