Git का कहना है कि मेरी मास्टर शाखा "पहले से ही अद्यतित है" भले ही वह नहीं है?


118

बुनियादी समस्या

मैंने अभी-अभी अपनी परियोजना की एक फ़ाइल से सभी कोड हटा दिए हैं और अपने स्थानीय परिवर्तन (उद्देश्य पर) के लिए बदलाव किया है। मैंने किया

git pull upstream master

अपस्ट्रीम से लाने और मर्ज करने के लिए (इसलिए सिद्धांत रूप में कि हटाए गए कोड वापस होना चाहिए)।

Git मुझे बताता है कि सब कुछ अप टू डेट है।

सब कुछ निश्चित रूप से अद्यतित नहीं है - हटाए गए सभी कोड अभी भी हटाए गए हैं।

अन्य प्रासंगिक जानकारी

मेरी केवल एक शाखा है जिसे "मास्टर" कहा जाता है।

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

ब्रांच मास्टर को अपस्ट्रीम से रिमोट ब्रांच मास्टर ट्रैक करने के लिए स्थापित किया गया है।

कमांड git branch -vvपैदावार:

* master 7cfcb29 [upstream/master: ahead 9] deletion test

ऐसा क्यों हो रहा है? मैं अपने प्रोजेक्ट मैनेजर को अपने कोड में कोई भी बदलाव करने के लिए सिर्फ ई-मेल कर रहा हूं।

अपडेट करें

मुझे लगा कि यह स्पष्ट है, लेकिन वैसे भी यह मेरा लक्ष्य है:

मेरे सिस्टम पर सबसे हाल का कोड प्राप्त करें।

मेरे गुस्से को यहाँ माफ करो, लेकिन इतना आसान काम क्यों होता है?


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

जवाबों:


208

मुझे लगता है कि आपका मूल मुद्दा यह है कि आप गलत समझ रहे हैं और / या गलतफहमी है कि यह क्या करता है और यह क्यों करता है।

जब आप कुछ अन्य रिपॉजिटरी को क्लोन करते हैं, तो git "वहाँ पर" जो कुछ भी है, उसकी एक प्रति बनाता है। यह "उनके" शाखा लेबल को भी लेता है, जैसे कि master, और उस लेबल की एक प्रतिलिपि बनाता है जिसका "पूरा नाम" आपके गिट ट्री में है (सामान्य रूप से) remotes/origin/master(लेकिन आपके मामले में remotes/upstream/master)। अधिकांश समय आपको remotes/भाग को छोड़ना पड़ता है, इसलिए आप उस मूल प्रति का उल्लेख कर सकते हैं upstream/master

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

इसके बाद git pullकमांड केवल शॉर्टहैंड git fetchहै git merge। यह महत्वपूर्ण है क्योंकि इसका मतलब है कि आपको यह समझने की आवश्यकता है कि वास्तव में वे दो ऑपरेशन क्या करते हैं।

git fetchआदेश भी आप से क्लोन (या अन्य प्रकार से लाने के लिए एक जगह के रूप में स्थापित किया है) और "नया सामान किसी और जोड़ा या बदल या निकाल" खोजने के लिए वापस जाने के लिए कहते हैं। उन परिवर्तनों को कॉपी किया जाता है और आपकी कॉपी पर लागू होता है जो आपको उनसे पहले मिला था । वे केवल अपने काम पर ही लागू नहीं होते हैं।

git mergeआदेश अधिक जटिल और जगह है जहाँ आप धराशायी हो जा रहे हैं है। यह जो कुछ करता है, उसकी थोड़ी सी तुलना की जाती है, "आप अपनी कॉपी में क्या बदल गए हैं" की तुलना "किसी और से प्राप्त किए गए परिवर्तनों से करें और इस तरह आपकी कॉपी-ऑफ़-द-किसी-किसी के काम में जुड़ जाए"। यदि आपके परिवर्तन और उनके परिवर्तन संघर्ष के लिए प्रतीत नहीं होते हैं, तो mergeऑपरेशन उन्हें एक साथ जोड़ देता है और आपको एक "मर्ज कमिट" देता है जो आपके विकास और उनके विकास को एक साथ जोड़ता है (हालांकि एक बहुत ही सामान्य "आसान" मामला है जिसमें आपके पास कोई नहीं है परिवर्तन और आपको एक "फास्ट फॉरवर्ड") मिलता है।

अब आप जिस स्थिति का सामना कर रहे हैं, वह वह है जिसमें आपने बदलाव किए हैं और उन्हें नौ बार प्रतिबद्ध किया है, वास्तव में, इसलिए "आगे 9" - और उन्होंने कोई बदलाव नहीं किया है। इसलिए, fetchकर्तव्यनिष्ठता से कुछ भी नहीं मिलता है, और फिर mergeउनके अभावों को बदल देता है और कुछ भी नहीं करता है।

आप जो चाहते हैं, वह है, या कोड के उनके "संस्करण" को "रीसेट" करना भी है।

यदि आप इसे देखना चाहते हैं, तो आप बस उस संस्करण को देख सकते हैं:

git checkout upstream/master

यह बताता है कि आप वर्तमान निर्देशिका को उस शाखा में ले जाना चाहते हैं जिसका पूरा नाम वास्तव में है remotes/upstream/master। पिछली बार जब आप भागे थे git fetchऔर आपको उनका नवीनतम कोड मिला था, तो आप उनका कोड देखेंगे ।

यदि आप अपने सभी परिवर्तनों को छोड़ना चाहते हैं , तो आपको जो करने की आवश्यकता है, वह है बदलाव का विचार, जिसमें आपके लेबल को संशोधन masterकरना चाहिए, नाम होना चाहिए। वर्तमान में यह आपकी सबसे हाल की प्रतिबद्ध का नाम देता है। यदि आप उस शाखा पर वापस आते हैं:

git checkout master

तब git resetकमांड आपको "लेबल को स्थानांतरित करने" की अनुमति देगा, जैसा कि यह था। एकमात्र बची हुई समस्या (यह मानकर कि आप जो कुछ भी करना चाहते हैं उसे छोड़ देने के लिए वास्तव में तैयार हैं) यह पा रहा है कि लेबल को कहां इंगित करना चाहिए।

git logआपको संख्यात्मक नाम खोजने देगा 7cfcb29- जैसे कि वे चीजें जो स्थायी (कभी नहीं बदल रही) नाम हैं, और उन्हें नाम देने के लिए अन्य तरीकों की एक हास्यास्पद संख्या है, लेकिन इस मामले में आप केवल नाम चाहते हैं upstream/master

लेबल को स्थानांतरित करने के लिए, अपने स्वयं के परिवर्तनों को मिटा देना (जो भी आपने किया है वह वास्तव में काफी समय के लिए पुनर्प्राप्त करने योग्य है, लेकिन यह बहुत कठिन है इसके बाद बहुत सुनिश्चित हो):

git reset --hard upstream/master

--hardका सफाया करने के लिए आप क्या कर दिया गया है, वर्तमान शाखा लेबल ले जाते हैं, और उसके बाद की जाँच दी प्रतिबद्ध git बताता है।

यह वास्तव में सुपर-आम नहीं है git reset --hardऔर काम का एक गुच्छा मिटा देना चाहता है । एक सुरक्षित तरीका (अगर आप कुछ तय कर लेते हैं, तो उस काम को ठीक करना बहुत आसान हो जाता है) अपनी मौजूदा शाखा का नाम बदलना है:

git branch -m master bunchofhacks

और फिर एक नई लोकल ब्रांच बनाइए जिसका नाम masterहै "ट्रैक्स" (मुझे वास्तव में यह शब्द पसंद नहीं है क्योंकि मुझे लगता है कि यह लोगों को भ्रमित करता है लेकिन यह गित शब्द है :-)) मूल (या अपस्ट्रीम) मास्टर:

git branch -t master upstream/master

जिसके बाद आप खुद को उसके साथ पा सकते हैं:

git checkout master

अंतिम तीन कमांड क्या करते हैं (मौजूदा दो लेबल बनाने के लिए शॉर्टकट है) मौजूदा लेबल पर चिपकाए गए नाम को बदलना है, फिर एक नया लेबल बनाना है, फिर उस पर स्विच करें:

कुछ भी करने से पहले:

C0 -    "remotes/upstream/master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9    "master"

के बाद git branch -m:

C0 -    "remotes/upstream/master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9    "bunchofhacks"

के बाद git branch -t master upstream/master:

C0 -    "remotes/upstream/master", "master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9    "bunchofhacks"

यहाँ C0नवीनतम प्रतिबद्ध (एक पूर्ण स्रोत पेड़) है जो आपको तब मिला जब आपने पहली बार अपना काम किया था git clone। C9 के माध्यम से C1 आपके कमिट हैं।

ध्यान दें कि यदि आप git checkout bunchofhacksऔर फिर थे git reset --hard HEAD^^, तो यह अंतिम तस्वीर को बदल देगा:

C0 -    "remotes/upstream/master", "master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 -    "bunchofhacks"
                                                      \
                                                       \- C8 --- C9

कारण यह है कि HEAD^^संशोधन को वर्तमान शाखा के प्रमुख से दो नाम दिए गए हैं (जो कि रीसेट से ठीक पहले होगा bunchofhacks), और reset --hardफिर लेबल को स्थानांतरित करता है। कमिट C8 और C9 अब ज्यादातर अदृश्य हैं (आप रिफ्लॉग जैसी चीजों का उपयोग कर सकते हैं और git fsckउन्हें ढूंढ सकते हैं लेकिन अब यह बहुत मामूली है)। आपके लेबल आपके कदम हैं जो आपको पसंद हैं। fetchआदेश जो कि के साथ शुरू की देखभाल करता है remotes/। यह "तुम्हारा" "उनके" के साथ मेल खाने के लिए पारंपरिक है (इसलिए यदि remotes/origin/mauveआपके पास आपका नाम mauveभी है), लेकिन आप "उनका" टाइप कर सकते हैं जब भी आप नाम चाहते हैं / देखते हैं कि आपको "उनसे मिला" है। (याद रखें कि "एक प्रतिबद्ध" एक संपूर्ण स्रोत वृक्ष है। आप git showउदाहरण के लिए , एक प्रतिबद्ध से एक विशिष्ट फ़ाइल निकाल सकते हैं ,


12
मैंने आपके उत्कृष्ट उत्तर से बहुत कुछ सीखा है। लेकिन मैं अभी भी इस उलझन में हूं कि मुझे गिट स्थिति का संदेश क्यों मिलता है: "आपकी शाखा 'मूल / मास्टर' के साथ अप-टू-डेट है" जब अपस्ट्रीम रेपो मेरे वर्तमान रेपो से कई गुना आगे है। मैं गिट पुल के साथ अप-टू-डेट हो सकता हूं, लेकिन मुझे कैसे पता चलेगा कि मुझे खींचने की जरूरत है अगर संदेश कहता है कि मैं अप-टू-डेट हूं?
क्रिस्टोफर वर्बी

@ChristopherWerby: ऐसा लगता है कि आप git mergeएक कमांड-लाइन कमांड के रूप में चल रहे हैं (जो कुछ ऐसा है जो मैं खुद करता हूं, यह एक उचित मानक है)। ध्यान दें, हालांकि, यह git pullपहले चलने से शुरू होता है git fetch, फिर चल रहा है git merge(या git rebaseयदि आप इसे इसके बजाय ऐसा करने के लिए कहते हैं)। यह लाने कदम है कि वास्तव में लाता है अधिक नए प्रतिबद्ध मर्ज करने (या केवल-रिबेस)।
torek

@torek क्या कुछ कमांड है, इसके अलावा git status, मैं यह देखने के लिए उपयोग कर सकता हूं कि क्या अपस्ट्रीम रेपो मेरे वर्तमान रेपो से आगे है? मुझे जो संदेश मिलता है, git statusवह कहता है "आपकी शाखा 'मूल / मास्टर' के साथ अद्यतित है" मुझे यह सोचने में भ्रमित करती है कि मुझे नवीनतम परिवर्तन मिले हैं, जब मैं नहीं करता। कभी-कभी, मुझे एक संदेश मिलता है जो कुछ कहता है जैसे "मूल / मास्टर आपकी शाखा के आगे 5 कमिट हैं" (पैराफ़्रास्टिंग)। लेकिन यह सुसंगत नहीं है।
क्रिस्टोफर Werby

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

1
git pullgit fetchपहले चलाता है , फिर git merge(या अपनी पसंद का दूसरा आदेश)। git fetchकदम अद्यतन करता है अपने की Git की स्मृति उनके ऊपर फोन करके Git की स्थिति, उनके Git और उनमें से कुछ भी नया हो रही। आपका git statusकेवल आपके Git की उनके Git की मेमोरी की जाँच करता है।
torek

18

मुझे आप जैसी ही समस्या थी।

मैंने किया था git status git fetch git pull, लेकिन मेरी शाखा अभी भी उत्पत्ति के पीछे थी। मेरे पास फोल्डर और फाइलें थीं जो रिमोट में धकेल दी गईं और मैंने वेब पर फाइलें देखीं, लेकिन मेरे लोकल पर वे गायब थीं।

अंत में, इन कमांड ने मेरे लोकल पर सभी फाइलों और फोल्डरों को अपडेट किया:

git fetch --all
git reset --hard origin/master 

या यदि आप एक शाखा चाहते हैं

git checkout your_branch_name_here
git reset --hard origin/your_branch_name_here

1
धन्यवाद! यह वास्तव में काम किया। ध्यान रखें कि शाखा नाम संवेदनशील हैं!
एंड्रे रेमन

4

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

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

अपडेट करें:

मेरे सिस्टम पर कोड के सबसे हाल ही में प्राप्त करें

आप जो नहीं समझते हैं वह यह है कि आपके पास पहले से ही सबसे हाल का कोड है, जो आपका है। यदि आप वास्तव में चाहते हैं कि किसी और के काम का सबसे हाल ही में मास्टर शाखा में देखना है , तो बस यह करें:

git fetch upstream
git checkout upstream/master

ध्यान दें कि यह आपको तुरंत (फिर से) अपना काम शुरू करने की स्थिति में नहीं छोड़ेगा। यदि आपको यह जानने की आवश्यकता है कि आपके द्वारा किए गए कुछ को कैसे पूर्ववत करें या अन्यथा आपके या किसी और द्वारा किए गए परिवर्तनों को वापस लाएं, तो कृपया विवरण प्रदान करें। इसके अलावा, क्या संस्करण नियंत्रण के लिए पढ़ने पर विचार करें, क्योंकि आप इसके मूल उद्देश्य को गलत समझते हैं।


मैं वास्तव में अपने सिस्टम पर किसी और के कोड का सबसे हाल का संस्करण चाहता हूं। हालाँकि, उन दो आदेशों ने ऐसा नहीं किया। सब मुझे मिलता है "पहले से ही शाखा मास्टर पर"। मेरी फाइलों में कोड दूसरे व्यक्ति के कोड को प्रतिबिंबित नहीं करता है।
user1971506

क्षमा करें, होना चाहिए था upstream/master। मेरे उत्तर को अपडेट किया।
रयान स्टीवर्ट

3

जैसा कि अन्य पोस्टरों में कहा गया है, ऊपर की ओर से बदलावों को आपकी रिपॉजिटरी में बदलते हैं। यदि आप अपने रिपॉजिटरी में क्या बदलना चाहते हैं जो अपस्ट्रीम में है, तो आपके पास कई विकल्प हैं। कफ से, मैं साथ जाऊंगा

git checkout HEAD^1  # Get off your repo's master.. doesn't matter where you go, so just go back one commit
git branch -d master  # Delete your repo's master branch
git checkout -t upstream/master  # Check out upstream's master into a local tracking branch of the same name

1

शीर्ष उत्तर, चौड़ाई और दी गई जानकारी की गहराई के संदर्भ में बहुत बेहतर है, लेकिन ऐसा लगता है कि यदि आप चाहते हैं कि आपकी समस्या लगभग तुरंत ठीक हो जाए, और संस्करण नियंत्रण के बुनियादी सिद्धांतों में से कुछ पर ध्यान न दें, तो आप कर सकते हैं ...

  1. गुरु पर स्विच करें

    $ git checkout upstream master
    
  2. अपनी अवांछित शाखा हटाएं। (ध्यान दें: सामान्य -d ध्वज के बजाय यह होना चाहिए -D, क्योंकि आपकी शाखा मास्टर के आगे बहुत सी है।)

    $ git branch -d <branch_name>
    
  3. एक नई शाखा बनाएँ

    $ git checkout -b <new_branch_name>
    

1

जबकि इनमें से किसी भी उत्तर ने मेरे लिए काम नहीं किया, मैं निम्नलिखित कमांड का उपयोग करके समस्या को ठीक करने में सक्षम था।

git fetch origin

इसने मेरे लिए एक चाल चली।


0

बस एक दोस्ताना अनुस्मारक अगर आपके पास स्थानीय रूप से फाइलें हैं जो गिटहब में नहीं हैं और फिर भी आपका git statusकहना है

आपकी शाखा 'मूल / मास्टर' के साथ अद्यतित है। कुछ भी नहीं करने के लिए, साफ पेड़ काम कर रहा है

यह तब हो सकता है जब फाइलें अंदर हों .gitignore

दौड़ने की कोशिश करो

cat .gitignore 

और यह देखते हुए कि ये फाइलें वहां दिखाई देती हैं या नहीं। यह समझाता है कि git उन्हें रिमोट पर क्यों नहीं ले जाना चाहता।

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