Git में शाखाएँ कब हटाएं?


284

मान लीजिए कि हमारे पास एक एप्लिकेशन है जो स्थिर है।

कल, कोई व्यक्ति एक बड़े ol 'बग की रिपोर्ट करता है जिसे हम तुरंत ही हॉटफ़िक्स करने का निर्णय लेते हैं। तो हम "मास्टर" से उस हॉटफिक्स के लिए एक शाखा बनाते हैं, हम इसे "2011_हॉटिफ़िक्स" नाम देते हैं, और हम इसे ऊपर धक्का देते हैं ताकि सभी डेवलपर्स इसे ठीक करने में सहयोग कर सकें।

हम बग को ठीक करते हैं, और "2011_हॉटिक्स" को "मास्टर" के साथ-साथ वर्तमान विकास शाखा में विलय कर देते हैं। और धक्का "मास्टर।"

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

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


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

3
मैं जानना चाहता हूं: यदि दूरस्थ हॉटफिक्स को हटाया जा रहा है, तो क्या यह सभी डेवलपर्स के लिए स्थानीय रूप से हटा दिया जाएगा जो सहयोग करते हैं? अगर नहीं; इसे कैसे पूरा करें? मुझे लगता है कि एक व्यक्ति हॉटफ़िक्स को मास्टर करने के लिए माइग्रेट करता है, लेकिन उसके बाद उसे सभी सहयोगियों के लिए भी साफ किया जाना चाहिए, ताकि उन्हें उस शाखा में कमिट्स जोड़ने से रोका जा सके।
रान्डेलो

1
आप अपने सह-कर्मियों के कंप्यूटर के स्थानीय रिपॉजिटरी को प्रभावित नहीं कर सकते। आपको या तो उसे स्थानीय रूप से शाखा को हटाने के लिए कहना होगा या आप इस सर्वर पक्ष को गिट हुक / शाखा सुरक्षा के साथ लागू कर सकते हैं जिससे आप अपनी शाखा से धक्का को रोक सकें जिसे आप हटाना चाहते हैं
srz2

जवाबों:


183

आप सुरक्षित रूप से एक शाखा को निकाल सकते हैं git branch -d yourbranch। यदि इसमें असमान परिवर्तन होते हैं (यानी, आप शाखा को हटाकर कमिट करेंगे), तो गिट आपको बताएगा और इसे हटा नहीं देगा।

तो, मर्ज की गई शाखा को हटाना सस्ता है और इससे आपको कोई इतिहास नहीं खोना पड़ेगा।

किसी दूरस्थ शाखा को हटाने के लिए git push origin :mybranch, अपना दूरस्थ नाम मानकर उपयोग करें , और जिस दूरस्थ शाखा को आप हटाना चाहते हैं, उसका नाम mybranch है।


35
"मर्ज की गई शाखा को हटाना सस्ता है" लेकिन इसे इधर-उधर रखा जा रहा है। यदि आप इसे इधर-उधर रखते हैं, तो समय या स्पेस गिट उपयोग के संदर्भ में कोई महत्वपूर्ण प्रदर्शन नहीं होता है। उस ने कहा, मैं शाखा को हटा दूंगा क्योंकि इतिहास में सभी आवागमन पहले से ही हैं master, इसलिए यह चीजों को बहुत साफ करता है।
मेट्रिक्सफ्रॉग

22
शाखाओं को नष्ट करने के इच्छुक मेरे कारणों में से एक यह है: हम शाखाओं में बहुत सारे बदलाव करते हैं (वास्तव में, सभी परिवर्तन) इसलिए अंततः आपको कमांड 'गिट शाखा' का उपयोग करते समय एक लंबी सूची मिलती है। अवलोकन के लिए, मैं उस सूची को छोटा करना चाहता हूं। इसलिए पुरानी शाखाओं को हटा दिया जाएगा। रीले रिलीज़ टैग किए गए हैं, इसलिए मेरे लिए इस विवाद में नहीं हैं।
michel.iamit

7
जबकि मैं उन शाखाओं को हटाने से सहमत हूं जो पहले ही विलय हो चुकी हैं, यदि आप उन शाखाओं की एक सूची देखना चाहते हैं जिन्हें आपकी वर्तमान शाखा में विलय नहीं किया गया है, तो आप उपयोग कर सकते हैं: git
Branch

51
@ मेट्रिक्सफ्रॉग यह सस्ता है क्योंकि यह जीआईटी के संदर्भ में आसपास रहता है, हालांकि मानव लागत महंगी हो सकती है। मैंने अभी लगभग 40 शाखाओं के साथ एक परियोजना में प्रवेश किया है, सभी संख्यात्मक शाखा नामों के साथ। मुझे नहीं पता कि क्या है और लगभग हर एक शाखा बासी है। उन शाखाओं के माध्यम से खोज करने और यह पता लगाने में कि क्या थका है और समय लगता है। तो हाँ, तकनीकी रूप से यह सस्ता है, लेकिन यह वास्तव में नहीं है। मुझे अपना गिट रेपो शिप शेप रखना पसंद है। यदि यह सक्रिय देव में नहीं है और इसे मर्ज कर दिया गया है, तो इसे हटा दें। लेकिन यह सिर्फ मेरा एमओ है और मैं सम्मान करता हूं कि अन्य कुछ अलग कर सकते हैं।
dudewad

1
--no-mergedडिफ़ॉल्ट बनाने के लिए क्या है ? मैंने कोशिश की git config --global --add branch.noMerged trueऔर इसे जोड़ा गया लेकिन इससे कोई फर्क नहीं पड़ा।
क्रेग सिल्वर

55

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

पुरानी शाखाओं को हटाएं

git branch -d branch_name

सर्वर से उन्हें हटा दें

git push origin --delete branch_name

या पुराने सिंटैक्स

git push origin :branch_name

जो "मूल में शाखा_नाम में कुछ भी नहीं धक्का" के रूप में पढ़ता है।

उन्होंने कहा, जब तक डीएजी (निर्देशित चक्रीय ग्राफ) इसे इंगित कर सकता है, इतिहास में कमिट्स वहीं होंगे।

Google "गिट-फ्लो" और जो रिलीज़ मैनेजमेंट, ब्रांचिंग और टैगिंग पर कुछ और जानकारी दे सकता है।


31

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

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

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

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


2
यह समझाने के लिए धन्यवाद कि जीथब मुझे "डिलीट ब्रांच" बटन क्यों दिखा रहा था।
टोड ओवेन

हम sourcetree का उपयोग कर रहे हैं और यह स्थानीय हॉटफ़िक्स शाखा और दूरस्थ हॉटफिक्स शाखा को खुला रखने का विकल्प देता है। मैंने सोचा था कि एक हॉटफ़िक्स शाखा को बंद करने का मतलब है इसे हटाना और आप इसे फिर से उपयोग नहीं कर सकते। उदाहरण के लिए हमें अगले 5 दिनों के लिए हर रोज हॉट फ़िक्सेस पुश करने की आवश्यकता है। फिर हम इसे बंद कर देते हैं। लेकिन 6 वें दिन कहते हैं, हमें एक और हॉटफ़िक्स की आवश्यकता है। क्या हम एक नई हॉटफिक्स शाखा बनाते हैं?
डेंजर 14

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

7

मैं जोड़ूंगा कि शाखाओं को हटाने का नुकसान यह है कि आप GitHub पर उन शाखाओं के लिए कोई भी हाइपरलिंक तोड़ देंगे (यह सवाल गिथब को टैग किया गया है)। आपको 404 Not Foundउन लिंक के लिए एक त्रुटि मिलेगी । यही कारण है कि मैं GitHub पर एक शाखा को हटाने के बाद अपने लिंक को एक कमिट या टैग की ओर इंगित करता हूं।

क्योंकि कुछ लिंक को बदला नहीं जा सकता है, जैसे कि ईमेल में, मैं अब पूरी तरह से GitHub शाखाओं में हाइपरलिंक करने से बचता हूं और पहले दिन से एक कमिट या टैग से लिंक करता हूं।

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

सबसे पहले मैं अपनी स्थानीय शाखा को हटाता हूं। यह इसे गलती से बाद में धकेलने से रोकता है।

git branch -d branchName

फिर मैं रिमोट ट्रैकिंग शाखा को हटा देता हूं

git branch -dr remoteName\branchName

फिर मैं GitHub पर शाखा हटाता हूं। मैं वेब इंटरफ़ेस का उपयोग करता हूं, लेकिन समकक्ष कमांड नीचे है।

git push remoteName :branchName

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

git tag -a tagName commitOrBranchName

फिर मैं टैग को जीथब पर पुश करता हूं

git push remoteName tagName

कचरा संग्रहकर्ता शाखा के कमिट्स को कब खाता है? क्या शाखा को हटाने से पहले आपको टैग को टैग करने और पुश करने की आवश्यकता है?
जारेड थिरस्क


4

ऐसा लगता है कि आप 2011_Hotfixअपना इतिहास खोए बिना शाखा को हटाना चाहते हैं । मैं पहले विलोपन और दूसरे पर इतिहास पर चर्चा करूंगा।

सामान्य gitशाखा हटाने के तरीके पहले ही ऊपर वर्णित किए गए हैं, और वे उम्मीद के मुताबिक काम करते हैं। gitएक या दो शब्द कमांड नहीं है जिसका अर्थ है, "अरे git, स्थानीय और दूरस्थ शाखा दोनों को हटाएं।" लेकिन शैल लिपि के माध्यम से इस व्यवहार की नकल की जा सकती है। उदाहरण के लिए, ज़च होल्मन की शेल स्क्रिप्ट 'गिट-न्यूक' को लें । यह बहुत ही सरल है:

#!/bin/sh
git branch -D $1
git push origin :$1

इसे अपनी एक निर्देशिका में निष्पादन योग्य फ़ाइल (जैसे, git-nuke) में रखें $PATH। यदि आप 2011_Hotfixशाखा पर नहीं हैं , तो आप बस git-nuke 2011_Hotfixस्थानीय और दूरस्थ दोनों शाखाओं को हटा देंगे। यह मानक की तुलना में अधिक तेज़ और सरल है - हालांकि शायद अधिक खतरनाक हैgit कमांड की ।

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

मेरे पास जोड़ने के लिए एक और शब्द है जो शायद आपके प्रश्न के दायरे से परे है, लेकिन फिर भी प्रासंगिक है। आइए कल्पना करें कि 20 छोटे हैं, "काम-में-प्रगति" पर काम करता है 2011_Hotfix; हालाँकि, आप केवल एक पूर्ण वचनबद्धता 2011_Hotfixको masterइतिहास में जोड़ना चाहते हैं । आप सभी 20 छोटे-छोटे कामों को एक बड़ी प्रतिबद्धता में कैसे जोड़ते हैं? सौभाग्य से, gitआप का उपयोग करके एक प्रतिबद्ध में कई कमिट को समेकित करने की अनुमति देता है git-rebase। मैं यहाँ नहीं समझाऊँगा कि यह कैसे काम करता है; हालांकि, यदि आप रुचि रखते हैं, तो इसके लिए प्रलेखनgit-rebase उत्कृष्ट है। ध्यान दें कि git rebaseइतिहास को फिर से लिखता है, इसलिए इसका उपयोग विवेकपूर्ण तरीके से किया जाना चाहिए, खासकर यदि आप इसके लिए नए हैं। अंत में, आपका 2011_Hotfixपरिदृश्य एक देव टीम के बारे में है, न कि एकल देव के बारे में। यदि प्रोजेक्ट टीम के सदस्य उपयोग करते हैंgit rebase, यह टीम के लिए बुद्धिमान दिशा निर्देश है git rebaseकि आदेश में उपयोग पर स्पष्ट निर्देश है कि टीम पर कुछ चरवाहा देव परियोजना के gitइतिहास को अनजाने में नुकसान नहीं पहुंचाते हैं ।


3

यदि इसे सफलतापूर्वक वापस मर्ज कर दिया गया है और शायद टैग भी किया गया है तो मैं कहूंगा कि इसका अब कोई फायदा नहीं है। तो आप सुरक्षित रूप से कर सकते हैं git branch -d branchname


2

यदि आप स्थानीय शाखाओं को प्रून करना चाहते हैं जो मूल से हटा दिए गए हैं, तो आप उपयोग करते समय भी प्रिउन कर सकते हैं git fetch

git fetch --prune

0

आप सभी प्रमुख वेब UIs जैसे github, BitBucket में शाखाएं हटा सकते हैं। शाखा को ऑनलाइन हटाने के बाद, आप स्थानीय शाखा का उपयोग करके हटा सकते हैं

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