जब परिवर्तन ऊपर की ओर होता है तो git स्थिति शो शाखा अप-टू-डेट क्यों होती है?


226

ट्रैक की गई शाखा में परिवर्तन होते हैं, लेकिन जब मैं टाइप git statusकरता हूं तो यह संकेत मिलता है कि मेरी स्थानीय शाखा अद्यतित है। क्या यह नया व्यवहार है, क्या मैंने एक विन्यास सेटिंग बदल दी है, या कुछ गलत है?

सहायता के लिए धन्यवाद।

ubuntu@host:/my/repo# git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean


ubuntu@host:/my/repo# git pull
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 11 (delta 6), reused 0 (delta 0)
Unpacking objects: 100% (11/11), done.
From bitbucket.org:my/repo
   1234567..abcdefg  master     -> origin/master
Updating 1234567..abcdefg
Fast-forward
 file1        |  1 -
 file2        | 43 +++++++++++++++++++++++++++++++++++++++++++
 file3        | 21 ++++++++++++---------
 file4        | 21 ++++++++++++---------
 4 files changed, 67 insertions(+), 19 deletions(-)
 create mode 100644 file5

जवाबों:


274

स्टेटस आपको बता रहा है कि आप रेफ के पीछे हैं origin/master जो आपके स्थानीय रेपो में स्थानीय रेफ है । इस मामले में कि रेफ कुछ रिमोट में एक शाखा को ट्रैक करने के लिए होता है, कहा जाता है origin, लेकिन स्थिति आपको रिमोट पर शाखा के बारे में कुछ भी नहीं बता रही है। यह आपको रेफ के बारे में बता रहा है, जो आपके स्थानीय फाइल सिस्टम पर संग्रहीत एक कमिट आईडी है (इस मामले में, यह आम तौर पर .git/refs/remotes/origin/masterआपके स्थानीय रेपो नामक फाइल में है)।

git pullदो ऑपरेशन करता है; पहले यह git fetchदूरस्थ रेपो (जो origin/masterआपके स्थानीय रेपो में अद्यतन को अद्यतन करता है) के साथ अद्यतित होने के लिए करता है , फिर यह git mergeउन कमियों को वर्तमान शाखा में विलय करने के लिए करता है।

जब तक आप fetchकदम नहीं उठाते हैं (या तो अपने आप या उसके माध्यम से git pull) आपके स्थानीय रेपो को यह जानने का कोई तरीका नहीं है कि अतिरिक्त अपस्ट्रीम हैं, और git statusकेवल आपके स्थानीय origin/masterरेफरी को देखता है ।

जब git statusअप-टू-डेट कहते हैं, तो इसका मतलब है "वर्तमान शाखा को ट्रैक करने वाली शाखा के साथ अप-टू-डेट", जिसका अर्थ है "स्थानीय रेफ के साथ अप-टू-डेट origin/master"। यह केवल "अप-टू-डेट अपस्ट्रीम स्टेटस के साथ है जो पिछली बार हमने प्राप्त किया था fetch" जो कि अपस्ट्रीम की नवीनतम लाइव स्थिति के साथ "अप-टू-डेट" के समान नहीं है।

यह इस तरह से काम क्यों करता है? खैर fetchकदम एक संभावित धीमा और महंगा नेटवर्क ऑपरेशन है। जीआईटी (और अन्य वितरित संस्करण नियंत्रण प्रणाली ) का डिज़ाइन अनावश्यक होने पर नेटवर्क संचालन से बचने के लिए है, और विशिष्ट क्लाइंट-सर्वर सिस्टम के लिए एक पूरी तरह से अलग मॉडल है जो कई लोगों के लिए उपयोग किया जाता है (हालांकि जैसा कि नीचे टिप्पणी में बताया गया है, गिट की अवधारणा) "रिमोट ट्रैकिंग ब्रांच" जो भ्रम का कारण बनता है, सभी DVCS द्वारा साझा नहीं किया जाता है)। यह पूरी तरह से Git ऑफ़लाइन का उपयोग करने के लिए, एक केंद्रीकृत सर्वर से कोई संबंध नहीं है, और इसे git statusप्रतिबिंबित करने के लिए आउटपुट का उपयोग करना संभव है ।

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


79
एक देर से टिप्पणी लेकिन मैं उसी स्थिति में भाग गया। मुझे समझ में आया कि भ्रूण लाने से पहले परिवर्तन के बारे में जानने का कोई तरीका क्यों नहीं है। लेकिन फिर इसे "अप टू डेट" नहीं कहना चाहिए, जो केवल सच नहीं है। यह बेहतर कहना चाहिए "कोई भी विचार दूर से क्या हुआ हो सकता है"।
Droidum

31
शायद यह कड़ाई से तार्किक है, लेकिन यह बिल्कुल भी मानव-उचित नहीं है। आप इसे डीओ को क्यों नहीं डिज़ाइन करेंगे और यह घोषित करें कि क्या यह अद्यतित है? या संदेश को यह बताने के लिए बदलें कि उसने वास्तव में क्या किया था, जैसे "आपकी शाखा 'मूल / मास्टर' के साथ अद्यतित थी जब अंतिम बार {टाइमस्टैम्प} पर चेक किया गया था?" या यहां तक ​​कि सिर्फ यह कहो, "क्या आपकी शाखा अप टू डेट है या नहीं यह जानने के लिए?"
कॉलिन मे

25
"आपकी शाखा अद्यतित है" संदेश को दिखाने में परेशान क्यों हों? मुझे मूल / मास्टर की स्थिति जानने का कोई बिंदु नहीं दिखता है, और अगर यह मूल रिमोट पर वास्तविक मास्टर शाखा का प्रतिनिधित्व करने वाला है, तो इसका स्पष्ट रूप से कोई भी पता नहीं है।
whiterook6

2
@ पस्तुलो, इसलिए एक उपनाम बनाएं।
जोनाथन वैक्ली

23
यह गिट की भयावह उपयोगिता का एक आदर्श उदाहरण है। मुझे इसकी शक्ति और लचीलेपन से प्यार है लेकिन बस संदेश को कुछ इस तरह से बदल रहा है जैसे "आपकी शाखा 'मूल / मास्टर' के स्थानीय संस्करण के साथ अद्यतित है।" एक बहुत बड़ा सुधार होगा। यहाँ भ्रम यह है कि स्थानीय शाखा उत्पत्ति / मास्टर (पैटर्न जो भी रिमोट / शाखाएँ जो आप उपयोग कर रहे हैं) के साथ मेल खाता है जो एक दूरस्थ शाखा को ट्रैक करता है।
मैथ्यूकुम्मिंग्स 516

35

ऐसा इसलिए है क्योंकि आपके स्थानीय रेपो ने अपस्ट्रीम रीमोट्स के साथ जांच नहीं की है। यह काम करने के लिए जैसा कि आप इसे करने की उम्मीद कर रहे हैं, उपयोग करें git fetchफिर चलाएं git status


7

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

git remote show origin

यह जो करता है वह सभी वर्तमान ट्रैक की गई शाखाओं को लौटाता है और सबसे महत्वपूर्ण बात - यह जानकारी कि क्या वे दूरस्थ मूल वाले से आगे या पीछे हैं। उपरोक्त आदेश के बाद, यह एक उदाहरण है कि क्या लौटा है:

  * remote origin
  Fetch URL: https://github.com/xxxx/xxxx.git
  Push  URL: https://github.com/xxxx/xxxx.git
  HEAD branch: master
  Remote branches:
    master      tracked
    no-payments tracked
  Local branches configured for 'git pull':
    master      merges with remote master
    no-payments merges with remote no-payments
  Local refs configured for 'git push':
    master      pushes to master      (local out of date)
    no-payments pushes to no-payments (local out of date)

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


0

"मूल / मास्टर" शाखा के मूल वचन "मूल / मास्टर" के संदर्भ में संदर्भित है। एक संदर्भ Git वस्तु के लिए एक मानव-अनुकूल उपनाम है, आमतौर पर एक प्रतिबद्ध वस्तु है। "मूल / मास्टर" संदर्भ केवल तभी अपडेट हो जाता है जब आप git pushअपने रिमोट ( http://git-scm.com/book/en/v2/Git-Internals-Git-References#Remotes ) में अपडेट हो जाते हैं ।

अपनी परियोजना की जड़ के भीतर से, भागो:

cat .git/refs/remotes/origin/master

प्रदर्शित आईडी के साथ तुलना करें:

cat .git/refs/heads/master

वे एक ही होना चाहिए, और यही कारण है कि गिट कहते हैं masterअप-टू-डेट है origin/master

जब तुम दौड़ते हो

git fetch origin master

यह .it / ऑब्जेक्ट फ़ोल्डर के अंतर्गत स्थानीय रूप से नई Git ऑब्जेक्ट्स को पुनः प्राप्त करता है। और Git अपडेट। .it / FETCH_HEAD ताकि अब, यह प्राप्त ब्रांच की नवीनतम कमिट को इंगित करता है।

इसलिए अपनी वर्तमान स्थानीय शाखा और ऊपर की ओर से प्राप्त शाखा के बीच अंतर देखने के लिए, आप दौड़ सकते हैं

git diff HEAD FETCH_HEAD

1
आपको .it निर्देशिका में आइटम को कैट नहीं करना चाहिए, यह पैक्ड रेफ के साथ काम नहीं करेगा। इसके अलावा आपके द्वारा वर्णित भ्रूण व्यवहार git के पुराने संस्करणों के लिए है।
एंड्रयू सी

क्या origin/masterरेफरी को एक साथ ही एक पुश द्वारा अपडेट नहीं किया जाता है?
जोनाथन वेकली

सही बात। मैं अब तक 1.8.3 Git का उपयोग कर रहा था। मैं वास्तव में संस्करण 2.2.1 के साथ नोटिस कर सकता हूं, FETCH_HEAD एक भ्रूण के दौरान भी अपडेट हो जाता है। यह भी जब यह संदेश आता है कि "आपकी शाखा अप-टू-डेट है ..." या "आपकी शाखा पीछे है ... एक्स कमिट्स द्वारा", यह केवल तभी दिखाता है जब आपकी स्थानीय शाखा किसी दिए गए दूरस्थ शाखा को ट्रैक करती है। मूल / मास्टर को ट्रैक करने के लिए, एक को शाखा शाखा से मूल-गुरु / गुरु को चलाना होगा। यदि कोई ट्रैकिंग नहीं है, तो आपको अभी भी गिट भिन्न को चलाने की आवश्यकता है।
मारेक स्टेनली

तब मैं आपको यह सुझाव देने के लिए कहता हूं कि '' मूल / गुरु '' संदर्भ केवल तभी अपडेट होता है जब आप अपने रिमोट से धक्का देते हैं।
जोनाथन वेकली

0

अगर साथ your branch (master)है तो सत्यापित करने के लिए नमूना git रेपो में देखें ।up to dateorigin/master

सत्यापित करें कि स्थानीय मास्टर मूल / मास्टर को ट्रैक कर रहा है:

$ git branch -vv
* master a357df1eb [origin/master] This is a commit message

स्थानीय मास्टर शाखा के बारे में अधिक जानकारी:

$ git show --summary
commit a357df1eb941beb5cac3601153f063dae7faf5a8 (HEAD -> master, tag: 2.8.0, origin/master, origin/HEAD)
Author: ...
Date:   Tue Dec 11 14:25:52 2018 +0100

    Another commit message

सत्यापित करें कि यदि मूल / स्वामी एक ही वचनबद्ध हैं:

$ cat .git/packed-refs | grep origin/master
a357df1eb941beb5cac3601153f063dae7faf5a8 refs/remotes/origin/master

हम एक ही हैश को चारों ओर देख सकते हैं, और यह कहना सुरक्षित है कि शाखा रिमोट के साथ निरंतरता में है, कम से कम वर्तमान गैस रेपो में।



0

तुच्छ जवाब अभी तक कुछ मामलों में सटीक है, जैसे कि मुझे यहां लाया गया था। मैं एक रेपो में काम कर रहा था जो मेरे लिए नया था और मैंने एक फाइल जोड़ी जो स्टेटस के हिसाब से नई नहीं थी।

यह समाप्त होता है कि फ़ाइल .gitignore फ़ाइल में एक पैटर्न से मेल खाती है।


0

इस मामले में git ऐड का उपयोग करें और सभी लंबित फ़ाइलों को एकीकृत करें और फिर git कमिट और फिर git पुश का उपयोग करें

git ऐड - सभी पेडेंट फाइल को इंटीग्रेट करता है

कमिट कमिट - सेव को कमिट करें

git पुश - रिपॉजिटरी में सेव करें

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