"Git स्टेटस" मैं मास्टर ब्रांच पर क्यों दिखाता हूं और "git ब्रांच" एक नए बनाए गए रिपॉजिटरी में नहीं है?


83

मैं एक प्रक्रिया को स्वचालित करने की कोशिश कर रहा हूं और git branchयह पता लगाने के लिए कमांड जारी कर रहा हूं कि मैं किस शाखा में हूं। एक नए आरंभिक रेपो को छोड़कर सब कुछ ठीक चल रहा है जहां git branchकुछ भी नहीं मिलता है। यह देखते हुए कि मैंने रेपो के साथ कुछ भी नहीं किया है, प्रारंभिक प्रतिबद्ध भी नहीं, मैं उत्तर स्वीकार कर सकता हूं। हालांकि, अगर मैं git statusइसे चलाता हूं, तो मुझे बताता है कि मैं masterशाखा पर हूं , जैसा कि यहां देखा गया है:

$ mkdir todelete
$ cd todelete
$ git init
Initialized empty Git repository in /u/u70021a/todelete/.git
$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)
$ git branch
$

क्या मुझसे कुछ गलत हो रही है? क्या कुछ सेटिंग है जो मैंने ठीक से सेट नहीं की है?

मेरे पास Git में कई नए लोग हैं और मैं उन्हें यह नहीं समझा सकता कि कमांड को यह दिखाने के लिए कि वे किस शाखा में हैं, कुछ भी नहीं दिखाते हैं, फिर भी स्थिति कमांड नहीं करती है।

जवाबों:


94

मैंने दो अन्य उत्तर दिए, लेकिन मुझे लगता है कि यह सोचने का तरीका सरल है: आप उस शाखा पर हो सकते हैं जो मौजूद नहीं है। यह एक नई खाली रिपॉजिटरी में भी सामान्य है, क्योंकि शाखा नाम मौजूद होने के लिए, उस शाखा का नाम मौजूदा, मान्य कमिट की हैश आईडी की पहचान करना चाहिए । एक नए खाली भंडार का कोई आवागमन नहीं है, इसलिए अभी तक किसी भी शाखा के नाम की अनुमति नहीं है।

फिर भी, आप शुरू में, किसी शाखा पर हैं। आप जिस शाखा पर हैं, वह वह है जिसका नाम विशेष नाम में संग्रहीत है HEAD। एक नए, खाली भंडार में, Git नाम को संग्रहीत करता है master(अधिक सटीक रूप से, refs/heads/masterशाखा का पूरा नाम) HEAD, इसलिए आप चालू हैं master, जबकि masterमौजूद नहीं है।

आप बदल सकते हैं कि आप किस गैर-मौजूद शाखा का उपयोग कर रहे हैं git checkout -b:

$ git init
Initialized empty Git repository in [path]
$ git checkout -b asdf
Switched to a new branch 'asdf'
$ git checkout -b hello
Switched to a new branch 'hello'

जब भी आप एक शाखा है, जो अस्तित्व में नहीं है पर कर रहे हैं, अगले प्रतिबद्ध आप कर बनाता शाखा। यह भी कैसे git checkout --orphanकाम करता है।


6
धन्यवाद। जबकि मैं इस बात से सहमत नहीं हूं कि क्या प्रदर्शन हो रहा है। कम से कम मैं समझता हूँ क्यों। आपका चेकआउट उदाहरण दिलचस्प है। "गिट चेकआउट" के लिए प्रलेखन के अनुसार -b का अर्थ है: एक नई शाखा बनाएं जिसका नाम <new_branch> है जो कड़ाई से सच नहीं है। आपके उदाहरण में, न तो शाखा asdf या हैलो वास्तव में बनाए गए हैं। लेकिन वे एक प्रतिबद्ध प्रदर्शन किया है, तो हो जाएगा। मेरी निजी राय है "ऑन ब्रांच मास्टर" संदेश को "नेक्स्ट कमिट टू ब्रांच मास्टर" में बदल देना चाहिए क्योंकि जब तक कमिट नहीं किया जाता तब तक मास्टर ब्रांच मौजूद है।
ग्वारने जूल

2
मुझे यकीन नहीं है कि यह आपके मामले के लिए प्रासंगिक है या नहीं, लेकिन मैं यह बताना चाहता हूं कि Git के लिए किसी भी शाखा में नहीं होना संभव है।
स्कालोट

Git आंतरिक रूप cat .git/HEADसे यह देखने के लिए उपयोग करता है कि यह किस शाखा पर है, शाखा के बाहर मौजूद होने से अधिक CPU और डिस्क समय की खपत होती है, इसलिए शायद उन्होंने ऐसा नहीं किया
Ferrybig

जो उल्लेख किया जाना चाहिए, वह यह है कि आपको git branchएक स्वचालित प्रक्रिया में उपयोग नहीं करना चाहिए क्योंकि यह उस उपयोग के मामले के लिए डिज़ाइन नहीं किया गया है। यह देखना दिलचस्प होगा कि गैर-चीनी मिट्टी के बरतन कमांड यहां क्या दर्शाते हैं, क्या git symbolic-ref --short HEADसमान व्यवहार है?
वू

@Voo: git symbolic-refHEAD (इसलिए अनाथ / अजन्मे शाखा संदर्भ) में निहित नाम दिखाता है बशर्ते कि HEADअलग न किया गया हो। एक नए खाली भंडार में, अलग HEAD नहीं किया जा सकता है क्योंकि एक अलग HEAD में एक मौजूदा, मान्य कमिट की हैश आईडी होनी चाहिए। (एक अरिक्त भंडार में, एक अलग सिर के साथ, git symbolic-refएक त्रुटि पैदा करता है।)
torek

23

git branchकोई शाखा नहीं होने के कारण कुछ भी नहीं दिखाता है। लेकिन, जैसा कि आप में पढ़ सकते हैं man git init:

यह कमांड एक खाली Git रिपॉजिटरी बनाता है - मूल रूप से ऑब्जेक्ट्स, रेफ्स / हेड्स, रिफ्स / टैग्स और टेम्प्लेट फ़ाइलों के लिए उपनिर्देशिका के साथ .IT डायरेक्टरी। एक प्रारंभिक HEAD फ़ाइल जो मास्टर शाखा के HEAD को भी संदर्भित करती है।

मैंने उस हिस्से को बोल्ड किया जो मुझे लगता है कि प्रासंगिक है - ऐसा लगता है कि हालांकि अभी तक कोई मास्टर शाखा नहीं है, इसके लिए एक संदर्भ पहले से मौजूद है और यही कारण है कि इसे अंदर दिखाया गया है git status। प्रतिबद्ध होने पर एक उचित शाखा बनाई जाएगी।


3
तो ऐसा लगता है कि "git स्टेटस" सिर्फ "शाखा का नाम" प्रदर्शित कर रहा है जैसा कि .it / HEAD (Ref: refs / heads / master) में देखा गया है, लेकिन .git / refs / head को देखने के लिए यह देखने के लिए कोई संगति जाँच नहीं करता है या नहीं वास्तव में मौजूद है।
ग्वारने जूल

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

17

मौजूदा उत्तर वास्तविक प्रश्न को संबोधित करते हैं कि आउटपुट क्यों है, लेकिन मुझे लगता है कि वे वास्तविक मुद्दे पर एक तरह से चमक गए हैं ...

आपने कहा कि आप कुछ स्वचालित कर रहे हैं, इसलिए मैं सुझाव दूंगा कि न तो git status और न ही git branchएक पटकथा संदर्भ में सबसे अच्छा उपकरण है।

इस चर्चा में कुछ विकल्प मिल सकते हैं: कैसे प्रोग्राम को वर्तमान चेक आउट जीट शाखा निर्धारित करें

आपकी ज़रूरतों को जाने बिना (या आप कैसे व्यवहार करने के लिए एक अजन्मे शाखा चाहते हैं) मैं जरूरी सिफारिश नहीं कर सकता, लेकिन मुझे जो बिंदु मिल रहा है, वह कुछ आदेश मानव संपर्क (चीनी मिट्टी के बरतन) के लिए हैं और अन्य लिपियों के लिए हैं ( पाइपलाइन)


15

शाखा अजन्मा है, फिर भी। इसलिए git branchयह नहीं दिखाता है (यह git symbolic-ref HEADइंगित करता है कि आपका HEAD डिफ़ॉल्ट शाखा मास्टर की ओर इशारा कर रहा है और जैसा कि यह अजन्मा हैgit branch यह नहीं दिखा है, यानी, आप उस शाखा पर हो सकते हैं जो अभी तक मौजूद नहीं है)। हालाँकि, कुछ करने से शाखा बनेगी।

यदि आप किसी orphanशाखा की जांच करते हैं, तो यह भी मामला है ।

मुझे लगता git statusहै कि शाखा का नाम दिखाता है क्योंकि यह वह शाखा है जिसे बनाया जाएगा।

स्क्रिप्टिंग के लिए देखें कि प्रोग्राम को वर्तमान चेक आउट Git शाखा से कैसे निर्धारित किया जाए


2

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

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


2
मैं समझती हूं कि मुझे समझ नहीं आ रहा है कि "git status" क्यों कहता है कि मैं एक ऐसी शाखा पर हूँ जो मौजूद नहीं है।
ग्वारने जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.