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 branch
git pull origin source
--unset-upstream
source
एक अपस्ट्रीम होने की बात यह है कि विभिन्न ऑपरेशनों को अधिक सुविधाजनक बनाना है। उदाहरण के लिए, 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
कहते हैं कि आप जो चाहते हैं, उसे करने के बजाय आप इसे स्वयं करते हैं, इसलिए यह "बेहतर तरीका" है।