2012-08-24 5 views
8

तरह से मैं अपने Git लॉगकैसे (हटाया गया) शाखाओं

git log --graph --oneline --all --decorate 

अन्य चीजें हैं जो मैं उपयोगी इसके उत्पादन पाया, शाखा के नाम देखते हैं के अलावा के साथ कर रहे हैं देखना पसंद की Git लॉग प्रदर्शन नाम मिलता है। हालांकि, अगर मैं एक शाखा हटा देता हूं, तो उपर्युक्त उन्हें अब प्रदर्शित नहीं करता है। मैं जैसे सामान का एक गुच्छा देखकर मतलब:

* 87c3294 (QueueExample) blah blah 

और अधिक अर्थपूर्ण (खासकर जब सूची लंबी हो जाता है) this question करने के लिए और विशेष रूप से this comment में

* 87c3294 blah blah 

जवाब का एक समूह से है मतलब करने लगता है कि शाखा के नाम अभी भी "कहीं" हैं।

मैं उन्हें git log या कम से कम किसी अन्य तरीके से आउटपुट में कैसे मुद्रित करूं?

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

उत्तर

14

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

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

* 9eb6e93 (HEAD, master) Merge branch 'feature' 
|\ 
| * 523e2ac (feature) tres 
| * 6d3cc0f dos 
| * 1bc0b2e uno 
* | d39734b three 
* | 779d37b two 
* | facbcbf one 
|/ 
* 58848f4 Initial commit. 

यह सोच कर कि "(फीचर)" एनोटेशन किसी भी तरह सही पर कि शाखा में बात कर रहा है, लेकिन यह नहीं है में मूर्ख बनाया जाना बहुत आसान है: यहाँ क्या git log मुझसे कहता है इससे पहले कि मैं शाखा हटाना है 523e2ac प्रतिबद्ध करने के लिए।

ध्यान दें कि, डिफ़ॉल्ट रूप से, जब गिट हमारे मामले में विलय प्रतिबद्धता (9eb6e93) बनाता है, तो यह स्वचालित रूप से एक टिप्पणी जोड़ता है जिसमें कहा गया है कि यह शाखा 'फीचर' विलय कर रहा है, इसलिए वहां एक शाखा होने के कुछ रिकॉर्ड हैं, लेकिन यह सिर्फ एक टिप्पणी है, और कुछ नहीं।

जब मैं शाखा 'सुविधा' को हटाना, कुछ भी नहीं, सिवाय इसके कि प्रतिबद्ध 523e2ac नहीं रह गया है के साथ लेबल है बदल जाता है "(फीचर)":

* 9eb6e93 (HEAD, master) Merge branch 'feature' 
|\ 
| * 523e2ac tres 
| * 6d3cc0f dos 
| * 1bc0b2e uno 
* | d39734b three 
* | 779d37b two 
* | facbcbf one 
|/ 
* 58848f4 Initial commit. 

तो, आपके सवाल का जवाब देना, नहीं, एक बार आप है एक शाखा हटा दी गई है, आप उस शाखा नाम के साथ प्रतिबद्धता को एनोटेट करने के लिए git log नहीं प्राप्त कर सकते हैं (क्योंकि यह अब मौजूद नहीं है)। हालांकि, आपके पास कुछ विकल्प हैं:

  • शाखा को न हटाएं।जब आप git branch टाइप करते हैं तो यह आपकी स्क्रीन को बंद कर देता है, इसके अलावा शाखाओं को छोड़ने में कोई हानि नहीं है। साथ ही, आप शाखा नामों का पुन: उपयोग करना चाह सकते हैं, जो बाद में समस्याएं पैदा कर सकती हैं यदि आप अपनी शाखाएं नहीं हटाते हैं।

  • शाखा हटाने से पहले प्रतिबद्धता को टैग करें। एक टैग वास्तव में एक शाखा है जो हिलती नहीं है। आप टैग नाम को शाखा नाम के समान भी बना सकते हैं।

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

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

+3

"शाखाएं केवल एक प्रतिबद्धता के संकेतक हैं" - ** + 1 **। इसे साबित करने के लिए, एक गिट प्रोजेक्ट निर्देशिका में, 'ls .git/refs/head' चलाएं। अरे देखो, आपकी सभी शाखाएं फाइलें हैं! अब उन बिल्ली में से एक बिल्ली 'बिल्ली'। इसमें केवल एक विशेष प्रतिबद्धता का हैश होता है। टैग 'रेफ/टैग' में समान हैं। इसे देखकर मुझे वास्तव में समझने में मदद मिली कि "शाखा वास्तव में केवल एक नोड" है। –

+2

@ डेविड - यहां तक ​​कि अधिक प्रमाण: 'cp ./git/refs/heads/master .git/refs/head/fancypants'। अब 'गिट शाखा'। हे देखो, एक नई शाखा, जो सटीक समान वंशावली को 'मास्टर' के रूप में साझा करने लगती है! ऐसा इसलिए है क्योंकि शाखाओं का कोई इतिहास नहीं है; ** ** ** एक इतिहास और एक वंशावली है। एक शाखा सिर्फ एक प्रतिबद्धता के लिए एक लेबल है। –

3

टिप्पणी मर्ज किए गए संदेशों को मर्ज करने के बारे में बात कर रही है, उदा। Merge QueueExample into master। जब आप एक शाखा हटाते हैं, तो शाखा चली जाती है। यदि आप --decorate के साथ अपने लॉग का सामयिक दृश्य बनाए रखना चाहते हैं, तो इसके बजाय टैग का उपयोग करने का प्रयास करें (या शाखा को हटाएं नहीं)।

+0

टिप्पणी मेरी थी, और हाँ, यही मेरा मतलब था। –

0

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

यदि आप उन्हें हमेशा git log आउटपुट में दिखाना चाहते हैं, तो उन्हें हटाएं नहीं। या, शाखा पॉइंटर्स को टैग के साथ प्रतिस्थापित करें ताकि यह इंगित किया जा सके कि शाखा इसे हटाने से पहले कहां थी।