मैं GitHub पर निकाली गई शाखा की जांच क्यों कर सकता हूं?


26

हमारे गिटहब भंडार में, एक सहकर्मी ने नाम की एक शाखा को हटा दिया release। लेकिन जब मैं git checkout releaseस्थानीय रूप से दौड़ता हूं , तो मुझे हमेशा हटा दी गई शाखा मिलती है release। एक ही, यहां तक कि जब मैं किसी अन्य शाखा की जाँच की, नष्ट कर दिया releaseके साथ शाखा git branch -D releaseऔर फिर से भाग git checkout release

GitHub रिपॉजिटरी पर तय करने के लिए कुछ है, या मैं स्थानीय रूप से कुछ तय करूंगा?


1
git branch --remoteरनिंग के बाद आउटपुट क्या करता है git fetch? आपको git fetch -pहटाए गए दूरस्थ शाखाओं को भूल जाने की आवश्यकता हो सकती है ।
स्टीफन किट

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

@StephenKitt: धन्यवाद। git branch --remoteआउटपुट origin/release। क्या आपका मतलब git fetch -pअतिरिक्त तर्कों के बिना चलना है, और क्या यह सभी हटाए गए दूरस्थ शाखाओं को prune करेगा?
टिम

1
हां, git fetch -pबिना किसी अतिरिक्त तर्क के सभी हटाए गए दूरस्थ शाखाओं को चुभेंगे।
स्टीफन किट

1
वितरित संस्करण नियंत्रण की दुनिया में आपका स्वागत है!
चिरलीस

जवाबों:


24

दूरस्थ पक्ष पर एक शाखा को हटाने के बाद, आप अभी भी स्थानीय स्तर पर इस पूर्व प्राप्त दूरस्थ शाखा को देख सकते हैं, देखें:

$ git branch -a
[...]
release
remotes/origin/release
[...]

आपने केवल "रिलीज़" को हटा दिया, लेकिन "रीमोज़ / ओरिजिन / रिलीज़" नहीं किया। इसे इस तरह हटाएँ:

$ git branch -rd origin/release

या उन सभी शाखाओं को हटा दें जो अब दूरस्थ रूप से मौजूद नहीं हैं:

$ git remote prune origin 

धन्यवाद। में git branch -rd origin/release, क्या -rमतलब है? क्या -dइसका मतलब वही है -D? git branch -rd origin/releaseसे बदला जा सकता है git branch -d remotes/origin/release?
टिम

@ समय: मैनुअल से; -आर List or delete (if used with -d) the remote-tracking branches.:; -ड:Shortcut for --delete --force.
लूपर

धन्यवाद। git branch -rd origin/releaseसे बदला जा सकता है git branch -d remotes/origin/release?
टिम

@ कोई भी दूरस्थ शाखाओं -rको संदर्भित नहीं करता है , इसकी आवश्यकता है। स्थानीय और दूरस्थ शाखाओं को अलग-अलग निर्देशिकाओं में संग्रहीत किया जाता है, तुलना और । तुम भी एक हो सकता है स्थानीय शाखा कहा जाता है जो बिना नष्ट हो जाएगा । यह भ्रामक लग सकता है लेकिन आप बस चारों ओर खेल सकते हैं, अजीब नामों के साथ शाखाएं बना सकते हैं और देखो कि यह कैसे दिखता है । ls -l .git/refs/headsls -l .git/refs/remotesremotes/origin/release-r.git/
रुडाइमियर

15

जब शाखाओं को दूरस्थ रूप से हटा दिया जाता है, तो आपको अपने स्थानीय रिपॉजिटरी को प्रून करना होगा - ऐसा करने का सबसे आसान तरीका है

git fetch -p

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

git branch --remote

अब हटाए गए दूरस्थ शाखा को नहीं दिखाएगा।

git रिपॉजिटरी पूर्ण हैं, चाहे आपके स्वयं के सिस्टम पर या सर्वर पर। इसलिए जब आप पहली बार एक रिपॉजिटरी का क्लोन बनाते हैं, तो आपको एक पूरी कॉपी मिलती है, और आपका स्थानीय git सभी दूरस्थ शाखाओं के साथ-साथ आपकी स्थानीय शाखाओं के बारे में "जानता" है। यह जानकारी स्वचालित रूप से समन्वयित नहीं होती है, इसलिए जब आपके सहयोगी releaseने सर्वर पर शाखा को हटा दिया, तो आपके स्थानीय गिट रिपॉजिटरी ने दूरस्थ releaseशाखा की अपनी धारणा नहीं खोई । git fetchदूरस्थ शाखाओं पर सभी स्थानीय जानकारी को अपडेट करने के साथ सिंक्रनाइज़ करना ताकि वे सर्वर पर राज्य से मेल खाते हों (सख्ती से बोलना, दूरस्थ रिपॉजिटरी, जहां भी हो), लेकिन दूरस्थ शाखाओं पर किसी भी स्थानीय जानकारी को हटाने के बिना। git fetch -p(या git fetch --prune, या git remote prune) के साथ Pruning दूरस्थ शाखाओं पर स्थानीय जानकारी को हटा देता है जिन्हें हटा दिया गया है।


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

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

धन्यवाद। releaseशाखा को बंद करने से git branch -D releaseपहले शाखा को हटाना क्यों नहीं था ? git checkout releasegit checkout releaserelease
टिम

1
क्योंकि git checkout releaseउस नाम के साथ एक दूरस्थ शाखा होने पर एक शाखा अपने आप फिर से बन जाएगी।
स्टीफन किट

"दूरस्थ शाखा" से, क्या मेरा मतलब है कि आप मेरे स्थानीय भंडार या जीथूब भंडार में एक शाखा हैं? यदि पूर्व में, मेरे स्थानीय भंडार में शाखा git branch -D releaseको पहले ही हटा दिया गया releaseहै; यदि बाद में, एक सहकर्मी ने releaseगिटहब पर शाखा को हटा दिया है; इसलिए मुझे अभी भी यकीन नहीं है कि "यदि उस नाम के साथ एक दूरस्थ शाखा है तो" स्वचालित रूप से एक शाखा का फिर से निर्माण करेगा?
टिम

3

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


3
यह उत्तर पहले से मौजूद उत्तरों से कैसे भिन्न है?
स्टीफन राउच

1

शायद थोड़ा सा मूर्त लेकिन इस साइट के परिप्रेक्ष्य से शाखाओं को हटाने के सामान्य विषय को समझने में मदद मिल सकती है:

http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/

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

for branch in `comm -12  <(git branch --merged|awk '{print($1)}') <(git branch -r --merged|awk '{print($1)}'|awk -F \/ '{print($2)}')`; do echo -e `git show --format="%ci %cr %an" $branch | head -n 1` \\t$branch; done | sort -r

(दुर्भाग्य से "अच्छा, सुपाच्य" स्क्रिप्ट्स के प्रारूपण पर लागू नहीं होता है।)

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