क्यों git शाखा को कॉल करें - फिक्स-अप करने के लिए अपस्ट्रीम?


161

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

FYI करें, मेरा ब्लॉग Github Pages पर होस्ट किया गया है।

आज, एक नई पोस्ट पर काम करते समय, git statusनिम्न संदेश दिखाया:

On branch source
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

बाद के सभी आदेशों जैसे git add ., git commit -m 'message'और के लिए एक ही संदेश दोहराया गया git push origin source

  • संदेश का क्या अर्थ है?
  • क्या कुछ टूट गया है?
  • यदि हाँ, तो क्या?
  • क्या मुझे इसे ठीक करने की आवश्यकता है?

यदि संभव हो, तो कृपया मुझे एक पीडीएफ / वेब लेख पर इंगित करें जहां मैं इस पर पढ़ सकता हूं और इसे भविष्य के लिए समझ सकता हूं।

अधिक जानकारी:

bash-3.2$ git branch -a
* source
  remotes/octopress/2.1
  remotes/octopress/HEAD -> octopress/master
  remotes/octopress/gh-pages
  remotes/octopress/linklog
  remotes/octopress/master
  remotes/octopress/refactor_with_tests
  remotes/octopress/rubygemcli
  remotes/octopress/site
  remotes/origin/source

कृपया मुझे बताएं कि क्या अधिक जानकारी की आवश्यकता है। धन्यवाद।

जवाबों:


197

TL; DR संस्करण: रिमोट-ट्रैकिंग शाखा का origin/masterउपयोग किया जाता था, लेकिन अब नहीं है, इसलिए स्थानीय शाखा sourceकुछ ऐसा ट्रैक कर रही है जो मौजूद नहीं है, जो कि सबसे अच्छा है - इसका मतलब है कि एक अलग Git सुविधा आपके लिए कुछ भी करने में असमर्थ है और Git आपको इसके बारे में चेतावनी दे रहा है। आप "अपस्ट्रीम ट्रैकिंग" फीचर के बिना ठीक काम कर रहे हैं, जैसा कि आप चाहते हैं, इसलिए यह आपके ऊपर है कि कुछ भी बदलना है या नहीं।

एक और अपस्ट्रीम सेटिंग्स पर ले जाने के लिए, मुझे "पुश पुश -सेट-अपस्ट्रीम मूल <शाखा>" क्यों करना है?


यह चेतावनी Git में एक नई बात है, जो Git 1.8.5 में पहली बार दिखाई दे रही है। रिलीज नोट में इसके बारे में सिर्फ एक छोटी बुलेट-आइटम है:

  • "गिट शाखा -v -v" (और "गिट स्थिति") उस शाखा के बीच अंतर नहीं करती थी जो किसी अन्य शाखा पर आधारित नहीं है, एक शाखा जो इसके अपस्ट्रीम शाखा के साथ सिंक में है, और एक शाखा जो अपस्ट्रीम के साथ कॉन्फ़िगर की गई है शाखा जो अब मौजूद नहीं है।

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

प्रत्येक "रिमोट" बस एक नाम है, जैसे originया octopressइस मामले में। उनका उद्देश्य स्थानों के पूर्ण URL की तरह रिकॉर्ड बातें करने के लिए है से आप जो git fetchया git pullअपडेट। जब आप 1 का उपयोग करते हैं तो Git उस रिमोट (सहेजे गए URL का उपयोग करके) पर जाता है और अपडेट के उपयुक्त सेट को लाता है। यह "रिमोट-ट्रैकिंग शाखाओं" का उपयोग करके अपडेट को रिकॉर्ड भी करता है।git fetch remote,

एक "रिमोट-ट्रैकिंग शाखा" (या रिमोट-ट्रैकिंग नाम) बस एक शाखा नाम की रिकॉर्डिंग है जैसा कि कुछ "रिमोट" पर अंतिम-देखा जाता है। प्रत्येक रिमोट स्वयं एक गिट रिपॉजिटरी है, इसलिए इसकी शाखाएं हैं। दूरस्थ "मूल" पर स्थित शाखाएं आपके स्थानीय भंडार में दर्ज की जाती हैं remotes/origin/। पाठ आप से पता चला है का कहना है कि नाम के एक शाखा है कि sourceपर origin, और शाखाओं नामित 2.1, linklogऔर पर इतने पर octopress

(एक "सामान्य" या "स्थानीय" शाखा, निश्चित रूप से, केवल एक शाखा-नाम है जिसे आपने अपने स्वयं के भंडार में बनाया है।)

अंतिम, आप एक "दूरस्थ ट्रैकिंग शाखा" को "ट्रैक" करने के लिए एक स्थानीय (स्थानीय) शाखा स्थापित कर सकते हैं। एक बार जब स्थानीय शाखा Lरिमोट-ट्रैकिंग शाखा को ट्रैक करने के लिए तैयार हो जाती है R, तो गिट Rअपनी "अपस्ट्रीम" को कॉल करेगा और आपको बताएगा कि क्या आप अपस्ट्रीम (कमिट के संदर्भ में) के "आगे" और / या "पीछे" हैं। स्थानीय शाखा और दूरस्थ-ट्रैकिंग शाखाओं के लिए समान (दूरस्थ उपसर्ग भाग को छोड़कर) उपयोग करने के लिए यह सामान्य (यहां तक ​​कि अनुशंसा-सक्षम) है, जैसे sourceऔर origin/source, लेकिन यह वास्तव में आवश्यक नहीं है।

और इस मामले में, ऐसा नहीं हो रहा है। आपके पास एक स्थानीय शाखा है sourceजो दूरस्थ-ट्रैकिंग शाखा पर नज़र रखती है origin/master

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

$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master

इन्हें एक साथ रखकर, 2 यह बताता है कि आपकी शाखा sourceआपकी "रिमोट-ट्रैकिंग शाखा" को ट्रैक करती है origin/master

लेकिन अब के आउटपुट को देखें git branch -a, जो आपकी रिपॉजिटरी में सभी स्थानीय और रिमोट-ट्रैकिंग शाखा नामों को दिखाता है। रिमोट-ट्रैकिंग नाम के तहत सूचीबद्ध हैं remotes/... और वहाँ नहीं हैremotes/origin/master । संभवतः एक समय था, लेकिन यह अब चला गया है।

Git आपको बता रहा है कि आप ट्रैकिंग जानकारी को हटा सकते हैं --unset-upstream। यह दोनों को हटा देगा branch.source.originऔर branch.source.mergeचेतावनी को रोक देगा।

यह काफी संभावना है कि आप क्या चाहते हैं, हालांकि, ट्रैकिंग से स्विच करने के लिएorigin/master , कुछ और ट्रैकिंग करना है: शायद origin/source, लेकिन शायद octopress/नामों में से एक।

आप ऐसा कर सकते हैं git branch --set-upstream-to, 3 उदा:

$ git branch --set-upstream-to=origin/source

(यह मानते हुए कि आप अभी भी शाखा "स्रोत" पर हैं, और origin/sourceयह वह अपस्ट्रीम है जो आप चाहते हैं-मेरे लिए यह बताने का कोई तरीका नहीं है कि कौन सा, यदि कोई है, तो आप वास्तव में चाहते हैं, हालांकि)।

(यह भी देखें कि आप मौजूदा गिट शाखा को दूरस्थ शाखा कैसे बनाते हैं? )

मुझे लगता है कि आप जिस तरह से यहां आए हैं वह यह है कि जब आपने पहली बार किया था git clone, तो आपके द्वारा क्लोन की गई एक शाखा थी master। आपके पास एक शाखा भी थी master, जिसे ट्रैक करने के लिए सेट किया गया था origin/master(यह गिट के लिए एक सामान्य, मानक सेटअप है)। इसका मतलब आपके पास था branch.master.remoteऔर branch.master.mergeसेट, टू originऔर refs/heads/master। लेकिन फिर अपने originरिमोट से इसका नाम बदल masterलिए source। मिलान करने के लिए, मेरा मानना ​​है कि आपने अपना स्थानीय नाम भी बदल दिया masterहै source। तो इसमें परिवर्तन के नाम से अपनी सेटिंग्स की, branch.master.remoteकरने के लिए branch.source.remoteऔर से branch.master.mergeकरने के लिए branch.source.merge... लेकिन यह वर्ष छोड़ दिया मूल्यों , इसलिए branch.source.mergeअब गलत था।

यह इस बिंदु पर था कि "अपस्ट्रीम" लिंकेज टूट गया, लेकिन 1.8.5 से अधिक पुराने संस्करणों में, गिट ने कभी भी टूटी हुई सेटिंग पर ध्यान नहीं दिया। अब आपके पास 1.8.5 है, यह इस ओर इशारा कर रहा है।


यह अधिकांश प्रश्नों को शामिल करता है, लेकिन "मुझे इसे ठीक करने की आवश्यकता नहीं है"। यह संभावना है कि आप वर्षों से टूटे-नेस के आसपास काम कर रहे हैं, जैसे (उदाहरण के लिए )। यदि आप ऐसा करते रहते हैं, तो यह समस्या के इर्द-गिर्द काम करता रहेगा- तो, ​​नहीं, आपको इसे ठीक करने की आवश्यकता नहीं है। यदि आप चाहें, तो आप अपस्ट्रीम को हटाने और शिकायतों को रोकने के लिए उपयोग कर सकते हैं , और स्थानीय शाखा को बिल्कुल भी अपस्ट्रीम होने के रूप में चिह्नित नहीं किया जा सकता है ।git pull remote branchgit pull origin source--unset-upstreamsource

एक अपस्ट्रीम होने की बात यह है कि विभिन्न ऑपरेशनों को अधिक सुविधाजनक बनाना है। उदाहरण के लिए, git fetchइसके बाद git mergeआम तौर पर "सही काम करेंगे" यदि अपस्ट्रीम को सही तरीके से सेट किया गया है, और इसके git statusबाद git fetchआपको बताएगा कि क्या आपका रेपो उस शाखा के लिए अपस्ट्रीम से मेल खाता है या नहीं।

यदि आप सुविधा चाहते हैं, तो अपस्ट्रीम को फिर से सेट करें।


1git pull का उपयोग करता है git fetch, और Git 1.8.4 के रूप में, यह (अंत में!) "रिमोट-ट्रैकिंग शाखा" जानकारी को भी अपडेट करता है। Git के पुराने संस्करणों में, अद्यतन git pullकेवल के साथ दूरस्थ-ट्रैकिंग शाखाओं में दर्ज नहीं किया गया था git fetch। चूंकि आपका Git कम से कम संस्करण 1.8.5 होना चाहिए, इसलिए यह आपके लिए कोई समस्या नहीं है।

2 ठीक है, यह प्लस एक कॉन्फ़िगरेशन लाइन है जिसे मैं जानबूझकर अनदेखा कर रहा हूं जो कि नीचे पाया गया है remote.origin.fetch। Git को "मर्ज" नाम मैप करना होगा ताकि यह पता चले कि रिमोट-ब्रांच के लिए पूरा स्थानीय नाम है refs/remotes/origin/master। मानचित्रण लगभग हमेशा इस तरह से काम करता है, हालांकि, यह अनुमान लगाने योग्य है कि यह किसके पास masterजाता है origin/master

3 या, के साथ git config। यदि आप केवल अपस्ट्रीम को origin/sourceकेवल उस हिस्से पर सेट करना चाहते हैं जिसे बदलना है branch.source.merge, और git config branch.source.merge refs/heads/source वह करेगा। लेकिन --set-upstream-toकहते हैं कि आप जो चाहते हैं, उसे करने के बजाय आप इसे स्वयं करते हैं, इसलिए यह "बेहतर तरीका" है।


3
+1 के लिए "यदि आप चाहें, तो आप स्थानीय शाखा का उपयोग कर सकते हैं - जो कि किसी भी अपस्ट्रीम में नहीं होने के कारण स्थानीय शाखा के रूप में चिह्नित है ।"
BeatriceThalo

157

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

मैंने git init --bareअपने एक सर्वर पर एक खाली (नया) रेपो बनाया है। तब मैंने git cloneइसे अपने पीसी पर एक स्थानीय कार्यक्षेत्र के लिए तैयार किया है।

स्थानीय रेपो पर एक ही संस्करण करने के बाद मुझे कॉल करने के बाद वह त्रुटि मिली git status

टॉर्क के उत्तर के बाद, मैं समझता हूं कि यह क्या हुआ है कि स्थानीय कामकाजी निर्देशिका रेपो "मास्टर" शाखा पर पहली प्रतिबद्ध है। लेकिन रिमोट रेपो (सर्वर पर) में कभी कुछ नहीं था, इसलिए एक "मास्टर" (रिमोट / मूल / मास्टर) शाखा भी नहीं थी।

git push origin masterस्थानीय रेपो से चलने के बाद अंत में रिमोट रेपो की एक मास्टर शाखा थी। इसने त्रुटि को प्रदर्शित होने से रोक दिया।

तो यह निष्कर्ष निकालने के लिए - किसी को शून्य के साथ एक नए नए रिमोट रेपो के लिए ऐसी त्रुटि मिल सकती है क्योंकि इसकी कोई शाखा नहीं है, जिसमें "मास्टर" भी शामिल है।


6
यह वर्तमान में इस त्रुटि संदेश के लिए nr 1 परिणाम है On branch source Your branch is based on 'origin/master', but the upstream is gone. (use "git branch --unset-upstream" to fixup)और व्यक्तिपरक होने के दौरान, यह एक वैकल्पिक उत्तर देने के लिए एक खाली भंडार को क्लोन करने के कारण होने की अधिक संभावना है।
बेला

2
मुझे लगता है कि क्यों यह हमेशा एक अच्छा विचार है कि आप अपनी नई रिपॉजिटरी को README.md फ़ाइल के साथ शुरू करें, भले ही यह एक खाली फाइल हो
अहमद हुसैन

8

इससे आपकी समस्या हल हो सकती है।

परिवर्तन करने के बाद आप इसे कर सकते हैं और फिर

git remote add origin https://(address of your repo) it can be https or ssh
then
git push -u origin master

आशा है कि यह आप के लिए काम करता है।

धन्यवाद


1
यह वास्तव में मदद करेगा - कारण मेरे जवाब में विस्तृत है (संक्षेप में - यह दूरस्थ रेपो में लापता मास्टर शाखा बनाता है)।
एलाज़रआर

7

मेरे लिए, .git/refs/origin/masterभ्रष्ट हो गया था।

मैंने निम्नलिखित कार्य किया, जिसने मेरे लिए समस्या को ठीक कर दिया।

rm .git/refs/remotes/origin/master
git fetch
git branch --set-upstream-to=origin/master

0

वास्तव में torek ने आपको पहले ही बता दिया था कि मैं कैसे कर पाऊंगा इससे बेहतर टूल का उपयोग करना है। हालाँकि, इस मामले में मुझे लगता है कि यदि आप http://octopress.org/docs/deploying/github/ के दिशा-निर्देशों का पालन करते हैं, तो कुछ अजीब बात करना महत्वपूर्ण है । अर्थात्, आपके सेटअप में कई गितुब रिपोजिटरी होंगे । निर्देशिका कहने के लिए अपनी वेबसाइट के सभी स्रोत कोड के साथ सबसे पहले $WEBSITE, और उसके बाद केवल स्थिर उत्पन्न फ़ाइलों के साथ एक $WEBSITE/_deploy। सेटअप की मज़ेदार बात यह है कि निर्देशिका .gitignoreमें एक फ़ाइल है $WEBSITEताकि यह सेटअप वास्तव में काम करे।

पर्याप्त परिचय। इस मामले में त्रुटि रिपॉजिटरी से भी आ सकती है _deploy

cd _deploy

git branch -a
* master
remotes/origin/master
remotes/origin/source

में .git/configआप सामान्य रूप से कुछ इस तरह खोजने की जरूरत होगी:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

लेकिन आपके मामले में शाखा मास्टर के पास रिमोट नहीं है।

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/origin/*

जिसे आप हल कर सकते हैं:

cd _deploy
git branch --set-upstream-to=origin/master

तो, सब कुछ उतना ही है जितना कि आपको बताया गया है, लेकिन यह बताना महत्वपूर्ण हो सकता है कि यह बहुत अच्छी तरह _deployसे आपकी वेबसाइट की जड़ के बजाय निर्देशिका की चिंता कर सकता है ।

पुनश्च: भविष्य में इस चीज़ को न काटने के लिए zshएक gitप्लगइन के साथ एक शेल का उपयोग करने के लायक हो सकता है । यह तुरंत दिखाएगा कि _deployएक अलग भंडार की चिंता है।


0

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

cat .git/refs/remotes/origin/feature/mybranch \
echo 1edf9668426de67ab764af138a98342787dc87fe \
>> .git/refs/remotes/origin/feature/mybranch

0

समस्या: आपकी शाखा 'मूल / मास्टर' पर आधारित है, लेकिन ऊपर की ओर चला गया है।

समाधान: गिट ब्रांच -सेट-अपस्ट्रीम


3
Stackoverflow में आपका स्वागत है। सवाल यह नहीं है कि त्रुटि कैसे तय की जा सकती है, वह जानना चाहता है कि यह त्रुटि क्यों उठाई गई है और अगर उसे इसके बारे में कुछ करना चाहिए। कृपया अपने उत्तर में इसे संबोधित करें।
क्रोनोइक

0

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

git branch -d branch_name

आप भी कर सकते हैं

git branch -D branch_name 

जो मूल रूप से डिलीट को बाध्य करता है (भले ही स्थानीय स्रोत में विलय न हो)

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