"Git Branch -r" को चलाते समय "मूल / HEAD" क्यों दिखाया जाता है?


160

जब आप दौड़ते हैं git branch -rतो ब्लेज़ की सूची क्यों होती है origin/HEAD? उदाहरण के लिए, GitHub पर एक दूरस्थ रेपो है, कहते हैं, दो शाखाओं के साथ: मास्टर और कमाल की सुविधा। यदि मैं git cloneइसे हथियाने के लिए करता हूं और फिर अपनी नई निर्देशिका में जाता हूं और शाखाओं को सूचीबद्ध करता हूं, तो मैं इसे देखता हूं:

$ git branch -r
origin/HEAD
origin/master
origin/awesome-feature

या जो भी आदेश होगा (अल्फा? मैं एक निर्दोष रेपो रहस्य की पहचान रखने के लिए इस उदाहरण को बना रहा हूं)। तो HEADव्यवसाय क्या है ? क्या यह आखिरी व्यक्ति pushथा HEADजब उन्होंने अपनी ओर इशारा किया था जब उन्होंने धक्का दिया था? क्या हमेशा ऐसा नहीं होगा जैसा कि वे pushएड थे? HEADइधर उधर घूमना ... मुझे इस बात की परवाह क्यों है कि किसी HEADऔर मशीन पर किसी ने इशारा किया है?

मैं सिर्फ रिमोट ट्रैकिंग और इस तरह का एक हैंडल पा रहा हूं, इसलिए यह एक भ्रम की स्थिति है। धन्यवाद!

संपादित करें: मैं इस धारणा के तहत था कि समर्पित रिमोट रिपोज (जैसे GitHub जहां कोई भी उस कोड पर ssh और काम नहीं करेगा, लेकिन केवल पुल या पुश, इत्यादि) नहीं था और उसके पास HEAD नहीं होना चाहिए क्योंकि मूल रूप से था, कोई काम की नकल नहीं। ऐसा नहीं?


जवाबों:


140

@robinst सही है।

Git में, आप चुन सकते हैं कि कौन सी शाखा डिफ़ॉल्ट रूप से चेक की गई है (यानी जब आप क्लोन करते हैं)। डिफ़ॉल्ट रूप से, origin/HEADउस पर इंगित करेगा।

GitHub पर, आप इसे अपने GitHub रेपो के लिए व्यवस्थापन सेटिंग में बदल सकते हैं । आप इसे कमांड-लाइन के माध्यम से भी कर सकते हैं

git remote set-head origin trunk

या इसे पूरी तरह से हटा दें

git remote set-head origin -d

उदाहरण है । 'स्विच शाखाएँ' ड्रॉप-डाउन पर देखें। trunkजाँच की है, इसलिए origin/HEADनिम्नानुसार है trunk


मैं एक दूरस्थ उन्हें नया नाम देना originऔर मेरे otherremote/HEAD -> masterमुझे परेशान कर रहा था। आपकी आज्ञा चलाना मेरे लिए निश्चित है।
फेलिप अल्वारेज

59

एक नंगे रिपॉजिटरी का कारण एक HEAD हो सकता है, यह इसलिए है क्योंकि यह निर्धारित करता है कि किस शाखा को प्रारंभिक रूप से रिपॉजिटरी के क्लोन के बाद चेक आउट किया गया है।

आम तौर पर, हेड मास्टर को इंगित करता है, और यह वह शाखा है जिसे लोगों द्वारा रिपॉजिटरी को क्लोन करने पर जांच की जाती है। इसे दूसरी शाखा में सेट करना (नंगे भंडार में HEAD को संपादित करके) उस शाखा में परिणाम की जाँच क्लोन पर की जा रही है।


2
क्योंकि धक्का दिए बिना इस संदर्भ को हटाना संभव है, origin/HEADक्या स्थानीय संदर्भ सही है? क्या इसे हटाने से कोई प्रभाव पड़ता है origin?
ज़च पोस्टेन

@zposten: नहीं, उसी तरह से जिसे हटाना origin/masterरिमोट को प्रभावित नहीं करता है।
8

इसका मतलब यह होगा कि संदर्भ को क्लोन करने के बाद सूचना का एक बेकार टुकड़ा है।
बछसौ

@ बासाऊ संदर्भ को क्लोन नहीं किया जाता है।
रॉन्ग

27

मैं इस धारणा के अधीन था कि समर्पित रिमोट रिपोस (जैसे GitHub जहां कोई उस पर काम नहीं करेगा और उस कोड पर काम करेगा, लेकिन केवल पुल या पुश, आदि) नहीं था और उसके पास HEAD नहीं होना चाहिए क्योंकि मूल रूप से, कोई काम नहीं कर रहा था कॉपी। ऐसा नहीं?

आपने जैसा कहा था मुझे ठीक वैसा ही आभास हुआ।

और मैं भी उस मूल / HEAD रिमोट-ट्रैकिंग शाखा को मिटाने से मिट नहीं सकता है, जो जीथब से कर रहा है

git branch -d -r origin/HEAD

इसका कोई असर नहीं हुआ।

क्या कोई मुझे बता सकता है कि मैं उस मूल / HEAD रिमोट-ट्रैकिंग शाखा को कैसे हटा सकता हूं?

अपडेट करें

यद्यपि मुझे यह नहीं मिला कि जीथब से क्लोन बनाते समय उत्पत्ति / HEAD क्यों होती है, मैं इसे हटाने का एक तरीका ढूंढता हूं।

गिट के नए संस्करण प्रदान करते हैं

git remote set-head <name> -d

रिमोट ट्रैकिंग शाखा के बेकार HEAD पॉइंटर को हटाने के लिए।

और हम डंबल डिफॉल्ट नाम 'मूल' को भी बदल सकते हैं जो हम उपयोग करके चाहते हैं

git remote rename origin <new_name>

आशा है कि यह मदद कर सकता है। :)


मैं (GitHub पर भी) एक ही समस्या है, और सेट सिर काम नहीं किया। क्या मुझे 'git रिमोट सेट-हेड HEAD -d' चलाना चाहिए?
जोस्ट शूउर

5
@ जोस्ट: यह हैgit remote set-head origin -d
znq

13

जब आप 'नंगे' होते हैं, यानी जब उनके पास कार्यशील निर्देशिका नहीं होती है, तो आप सही तरीके से समर्पित रिमोट रिपॉजिट पर जोर देते हैं। गिट की वास्तुकला को पैच या pull( fetch) द्वारा अद्यतन करने के लिए डिज़ाइन किया गया है , जो वितरित वीसीएस में समझ में आता है। जैसा कि डॉक्स कहीं कहता है, एक शाखा पर धकेलना जो वर्तमान में चेक आउट हो गया है, "अनपेक्षित परिणाम" हो सकता है

HEAD एक वैध भंडार के लिए आवश्यकताओं का हिस्सा है। Git रिपॉजिटरी लेआउट कहता है, भाग में:

HEAD

A symref (see glossary) to the refs/heads/ namespace describing the currently active  
branch. It does not mean much if the repository is not associated with any working tree  
(i.e. a bare repository), but a valid git repository must have the HEAD file; some  
porcelains may use it to guess the designated "default" branch of the repository  
(usually master). It is legal if the named branch name does not (yet) exist.

तो आप शाखा सूची के भाग के रूप में HEAD को देखने जा रहे हैं, भले ही "इसका मतलब ज्यादा न हो ..."


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

@geoidesic एक रिपॉजिटरी नंगी हो सकती है, भले ही आपने उसे धक्का दिया हो। निम्नलिखित: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config --global user.email "you@example.com"; git config --global user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.bareआउटपुट सच है। इसके अलावा उन आदेशों पर फोब्बो रेपो में धकेल दी गई फ़ाइल की कोई भी कार्यशील प्रतिलिपि नहीं है।
एंडर्स लिंडन

@geoidesic एक रिपॉजिटरी नंगी हो सकती है, भले ही आपने उसे धक्का दिया हो। निम्नलिखित: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config user.email "you@example.com"; git config user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.bareआउटपुट सच है। इसके अलावा उन आदेशों पर फोब्बो रेपो में धकेल दी गई फ़ाइल की कोई भी कार्यशील प्रतिलिपि नहीं है।
एंडर्स लिंडन

@geoidesic A --bare git repo का मतलब सिर्फ एक रेपो है जिसमें कोई वर्किंग ट्री नहीं है, यानी एक रेपो में केवल एक .गित-डायरेक्टरी है, लेकिन किसी भी तरह की चेक आउट फाइल नहीं हो सकती है। चूँकि इसमें कोई भी जाँच की गई फ़ाइलें नहीं हो सकती हैं, यह वास्तव में एक .IT डाइरेक्टरी भी नहीं है, यह केवल। डायरेक्ट फाइल को मुख्य डायरेक्ट्री में रखती है। एक बनाएँ और आप देखेंगे!
00prometheus

5

यदि "उत्पत्ति" एक दूरस्थ भंडार है, तो उत्पत्ति / HEAD उस दूरस्थ भंडार पर डिफ़ॉल्ट शाखा की पहचान करता है।

उदाहरण:

$ git remote show
origin
$ git remote show origin
* remote origin
  Fetch URL: git@github.com:walkerh/pipe-o-matic.git
  Push  URL: git@github.com:walkerh/pipe-o-matic.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

उस रेखा पर ध्यान दें जो "HEAD शाखा: मास्टर" कहती है। यह वह जगह है जहां दूरस्थ रिपॉजिटरी ग्राहकों को यह जानने देती है कि कौन सी शाखा डिफ़ॉल्ट रूप से चेकआउट करना है।


1

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


2
github repos ने शाखाओं की जाँच नहीं की है। मैं नहीं देखता कि यह क्यों लागू होगा।
डस्टिन

दूरस्थ रिपॉजिटरी में कार्यशील निर्देशिका नहीं होनी चाहिए। रिमोट रिपॉजिटरी होनी चाहिए --bare और इस प्रकार वर्तमान में चेक आउट शाखा नहीं हो सकती है।
n4rzul

-14

मेरा अनुमान है कि किसी ने एक शाखा को धक्का दिया और इसे हेड कहा:

git push origin HEAD

क्या मुझे इस बारे में कुछ टिप्पणी मिल सकती है कि इसमें क्या गलत है? यदि आप जीथब पर एक उत्पत्ति / HEAD चाहते हैं, तो मुझे इसे प्राप्त करने का एकमात्र तरीका है।
डस्टिन

दूरस्थ HEAD एक प्रतीकात्मक रेफ (आमतौर पर refs / हेड / मास्टर) है। आप अपनी वर्तमान शाखा के प्रतिबद्ध के हैश आईडी द्वारा प्रतीकात्मक रेफ को बदल देंगे।
डैनियल फंजुल

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