मुझे नई शाखा को स्पष्ट रूप से धकेलने की आवश्यकता क्यों है?


180

में नया हूँ gitऔर अभ्यास कर रहा हूँ। मैंने एक स्थानीय शाखा बनाई, लेकिन मैंने देखा कि जब मैंने git pushअपनी शाखा को रिपॉजिटरी में अपलोड नहीं किया था। मुझे वास्तव में करना था git push -u origin --all:।
ऐसा क्यों है? क्या कोई शाखा डिफ़ॉल्ट रूप से धकेले जाने वाला एक नया परिवर्तन नहीं है? मुझे दूसरी कमांड चलाने की आवश्यकता क्यों है?


15
ध्यान दें कि यह कॉन्फ़िगर करने योग्य है (सेटिंग push.default, देखें man git-config)। यदि आप करते हैं git config --add push.default current, तो git pushयदि आवश्यक हो तो स्वचालित रूप से दूरस्थ रेपो में शाखा का निर्माण करेंगे। यह डिफ़ॉल्ट क्यों नहीं है उत्तर में बताया गया है।
sleske

@ स्लेस्के मैं सहमत हूँ। अन्य नीतियों ' current' और ' upstream' के लिए, मेरे पुराने उत्तर stackoverflow.com/a/13751847/6309 देखें
वॉन

जवाब क्यों नहीं स्वीकार करते?
laike9m

जवाबों:


225

वास्तविक कारण यह है कि, एक नए रेपो (git init) में, कोई शाखा नहीं है (नहीं master, कोई शाखा बिल्कुल नहीं, शून्य)

इसलिए जब आप पहली बार किसी खाली अपस्ट्रीम रेपो (आमतौर पर नंगे वाले ) पर जोर दे रहे होते हैं , तो उस अपस्ट्रीम रेपो में उसी नाम की कोई शाखा नहीं होती है।

तथा:

दोनों मामलों में, चूंकि अपस्ट्रीम खाली रेपो की कोई शाखा नहीं है:

  • अभी तक मिलान नाम की कोई शाखा नहीं है
  • कोई भी अपस्ट्रीम ब्रांच नहीं है (एक ही नाम के साथ या उसके बिना! ट्रैकिंग या नहीं)

इसका मतलब है कि आपके स्थानीय पहले धक्का का कोई पता नहीं है:

  • कहाँ धक्का देना है
  • क्या धक्का है (क्योंकि यह किसी भी अपस्ट्रीम शाखा को रिमोट ट्रैकिंग शाखा के रूप में दर्ज नहीं किया जा सकता है, और / या एक ही नाम है)

तो आपको कम से कम करने की आवश्यकता है:

git push origin master

लेकिन अगर आप केवल वही करते हैं, तो आप:

  • masterअपस्ट्रीम (अब गैर-खाली रेपो) पर एक अपस्ट्रीम शाखा बनाएगा : अच्छा।
  • यह रिकॉर्ड नहीं करेगा कि स्थानीय शाखा ' master' को अपस्ट्रीम ( origin) ' master' (अपस्ट्रीम शाखा) पर धकेलने की जरूरत है : खराब।

यही कारण है कि यह सिफारिश की जाती है, पहले धक्का के लिए:

git push -u origin master

यह origin/masterएक दूरस्थ ट्रैकिंग शाखा के रूप में रिकॉर्ड करेगा , और अगले पुश को स्वचालित रूप से पुश masterकरने में सक्षम करेगा origin/master

git checkout master
git push

और वह भी पुश नीतियों ' current' या ' upstream' के साथ काम करेगा ।
प्रत्येक मामले में, प्रारंभिक के बाद git push -u origin master, एक साधारण गिट धक्का मास्टर को सही अपस्ट्रीम शाखा में पुश करने के लिए जारी रखने के लिए पर्याप्त होगा।


2
इस बिंदु के बाद, अगले को git pushयह भी उम्मीद है कि शाखा पहले से मौजूद है?
क्रेटाइलस

2
हाँ। यह उस शाखा के अपस्ट्रीम रिपॉजिटरी में किसी भी अपडेट को आगे बढ़ाएगा।
रयपेक

@Cratylus हाँ, क्योंकि नई डिफ़ॉल्ट पुश नीति ' simple': किसी भी रिकॉर्ड की गई अपस्ट्रीम शाखा को धक्का, अगर उस अपस्ट्रीम शाखा का स्थानीय नाम समान हो। एक सरल git pushपर्याप्त होगा।
वॉन

1
@ButtleButkus धन्यवाद। मैंने लिंक को पुनर्स्थापित कर दिया है।
VonC

3
एक नई शाखा 'new_branch' के प्रश्नकर्ता के अधिक सामान्य मामले के लिए, आप उपयोग करेंगे git push --set-upstream origin new_branchया git push -u origin new_branchसंक्षिप्त रूप से। -allकि प्रश्नकर्ता सभी शाखाओं को शामिल करके एक विशिष्ट नई शाखा नामकरण को नजरअंदाज करते थे। यह उनके उत्तर में + क्लास मेलबर्न द्वारा कवर किया गया है।
पॉल मासरी-स्टोन

106

आप नीचे नहीं देखें

मुझे यह 'सुविधा' अधिक परेशान करने वाली लगती है क्योंकि मैं चंद्रमा पर रॉकेट लॉन्च करने की कोशिश नहीं कर रहा हूं, बस अपनी लानत शाखा को धक्का दे रहा हूं। आप भी शायद करते हैं वरना आप यहाँ नहीं होते!

यहां यह तय है: यदि आप चाहते हैं कि यह वर्तमान शाखा के लिए निहित रूप से धक्का दे, भले ही वह शाखा मूल पर मौजूद हो, बस एक बार इस आदेश को जारी करें और आपको फिर कभी कहीं भी नहीं होना चाहिए:

git config --global push.default current

तो अगर आप इस तरह की शाखाएँ बनाते हैं:

git checkout -b my-new-branch

और फिर कुछ कमिट करें और फिर ए करें

git push -u

उन्हें मूल (उस शाखा पर) होने के लिए बाहर निकालने के लिए और यह आपके लिए उक्त शाखा का निर्माण करेगा यदि यह मौजूद नहीं है।

ध्यान दें -u बिट सुनिश्चित करता है कि वे जुड़े हुए हैं यदि आप बाद में कहा शाखा से खींचने के लिए थे। यदि आपके पास बाद में शाखा खींचने की कोई योजना नहीं है (या यदि आप करते हैं तो एक दूसरे लाइनर के साथ ठीक हैं) -u आवश्यक नहीं है।


3
जब मैं ऐसा करता हूं, अगर मैं एक गिट पुल करता हूं, इसके तुरंत बाद - दो शाखाएं लिंक नहीं होती हैं। :(
एलिसो

यह एकमात्र उत्तर है जिसने मेरी समस्या को ठीक कर दिया है।
रेमंड चेनन

2
उन्हें लिंक करने के लिए, उपयोग करेंgit push -u
बेन क्रीसी

धन्यवाद! इस उत्तर को त्वरित और 'तीस' समाधान के रूप में स्वीकार किया जाना चाहिए। मुझे पूरा यकीन है कि यह ओपी के इरादे के सबसे करीब है।
यंगर्रर

3
> मैं चंद्रमा पर रॉकेट लॉन्च करने की कोशिश नहीं कर रहा हूं। -- हाँ।
VCavallo

39

git pushएक नई शाखा को आगे बढ़ाने पर आउटपुट

> git checkout -b new_branch
Switched to a new branch 'new_branch'
> git push
fatal: The current branch new_branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin new_branch

एक साधारण git pushमानता है कि पहले से ही एक दूरस्थ शाखा मौजूद है जो वर्तमान स्थानीय शाखा ट्रैक कर रही है। यदि ऐसी कोई दूरस्थ शाखा मौजूद नहीं है, और आप इसे बनाना चाहते हैं, तो आपको यह निर्दिष्ट करना होगा कि -u(संक्षिप्त रूप --set-upstream) ध्वज का उपयोग करना ।

ऐसा क्यों है? मुझे लगता है कि कार्यान्वयनकर्ताओं ने महसूस किया कि रिमोट पर एक शाखा बनाना एक ऐसी बड़ी कार्रवाई है जिसे गलती से करना मुश्किल है। git pushकुछ ऐसा है जो आप हर समय करते हैं।

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

आप प्रो Git पुस्तक के दूरस्थ शाखाओं अध्याय में ट्रैकिंग शाखाओं के बारे में अधिक पढ़ सकते हैं ।


मुझे नहीं मिला, fatalलेकिन मैंने पहले ही शाखा में एक प्रतिबद्ध किया था। क्या यह मामला है?
क्रेटाइलस

@ कैरेटाइलस कोई फर्क नहीं पड़ता। यह कमेटी आपकी रिपॉजिटरी में सुरक्षित है, और git push -u originइसे रिमोट रिपॉजिटरी में कॉपी किया गया है।
क्लैस मेलबोरन

नहीं, मुझे इस तथ्य से कोई मतलब नहीं है कि मुझे उस fatalतरह का एक संदेश नहीं मिला , जिसका आप उत्तर में उल्लेख करते हैं। क्या यह अंतर इस तथ्य पर निर्भर करता है कि मैंने शाखा में कुछ किया है?
क्रेटाइलस

@Cratylus मुझे नहीं पता कि आपको fatalसंदेश क्यों नहीं मिला । मुझे लगता है कि अंतर वास्तव में किस कार्यान्वयन पर आप उपयोग कर रहे हैं पर निर्भर करता है। मेरा आउटपुट 1.8.1.msysgit.1 से विंडोज 8 पर चल रहा है।
क्लेस मेलबर्न

मेरे पास एक ही संस्करण है लेकिन विस्टा पर
क्रैटाइलस

4

मैं मूल डेवलपर्स द्वारा इसे जल्दी से एक तर्क नहीं पा सका, लेकिन मैं आपको कुछ वर्षों के गिट अनुभव के आधार पर एक शिक्षित अनुमान दे सकता हूं।

नहीं, हर शाखा ऐसी चीज नहीं है जिसे आप बाहरी दुनिया में धकेलना चाहते हैं। यह एक निजी प्रयोग का प्रतिनिधित्व कर सकता है।

इसके अलावा, git pushसभी शाखाओं को कहां भेजना चाहिए ? Git कई रीमोट के साथ काम कर सकता है और आप प्रत्येक पर अलग-अलग शाखाओं के सेट करना चाहते हैं। जैसे एक केंद्रीय परियोजना GitHub रेपो में रिलीज शाखाएं हो सकती हैं; GitHub कांटा में समीक्षा के लिए विषय शाखाएं हो सकती हैं; और एक स्थानीय Git सर्वर में स्थानीय कॉन्फ़िगरेशन वाली शाखाएँ हो सकती हैं। यदि git pushसभी शाखाओं को रिमोट पर धकेल दिया जाएगा जो कि वर्तमान शाखा को ट्रैक करती है, तो इस तरह की योजना को पेंच करना आसान होगा।


1)। It might represent a private experimentलेकिन क्या बड़ी बात है? "मुख्य" शाखा जो हर कोई काम कर रही है अर्थात masterप्रभावित नहीं है। जब तक आप स्रोत कोड को छिपाए रखने का मतलब है 2) git push, without a remote, pushes to the current branch's remoteमैं आपको यहाँ खो गया :(
Cratylus

@Cratylus: 1) दर्जनों डेवलपर्स के साथ एक प्रोजेक्ट में, जो सभी ब्रांच ऐड लिब वाले हैं, आपको बहुत गन्दा रेपो मिलने वाला है। मैं इस तरह की परियोजनाओं पर काम करता हूं, और मैं git fetchहर बार सैकड़ों काम करने वाली शाखाओं को नहीं चाहूंगा । 2) मैं git pushडिफ़ॉल्ट व्यवहार का उल्लेख कर रहा हूँ । यह रिमोट को धक्का देता है कि वर्तमान शाखा ट्रैकिंग कर रही है, यदि कोई हो।
फ्रेड फू

3

HEAD करंट ब्रांच के लिए छोटा है इसलिए git push -u origin HEAD काम करता है। अब इस टाइपिंग से बचने के लिए हर बार मैं उपनाम का उपयोग करता हूं:

git config --global alias.pp 'पुश -यू मूल HEAD'

इसके बाद, हर बार मैं git -b शाखा के माध्यम से बनाई गई शाखा को धकेलना चाहता हूं जिसे मैं इसका उपयोग करके धक्का दे सकता हूं:

git पीपी

आशा है कि यह किसी के लिए समय बचाता है!


2

पहले जांच कराएं

स्टेप -1: git remote -v
// अगर git इनिशियलाइज़ हो तो स्टेप -2 को हटा दें या छोड़ दें

चरण -2: git remote rm origin
// फिर विश्व स्तर पर अपने ईमेल पते को कॉन्फ़िगर करें

चरण 3: git config --global user.email "youremail@example.com"

चरण 4: git initial

स्टेप -5: git commit -m "Initial Project"
// अगर पहले से ही प्रोजेक्ट रेपो जोड़ें तो स्टेप -6 छोड़ें

चरण -6: git remote add origin %repo link from bitbucket.org%

चरण -7: git push -u origin master


1

मैंने अभी इस मुद्दे का एक और क्रमांकन अनुभव किया है।

मेरे पास एक शाखा का नाम था feat/XYZ-1234-some-descriptionक्योंकि मैं जीरा मुद्दे पर 1234 पर काम कर रहा था। काम के दौरान मैंने एक छोटा सा काम ट्रैक करने के लिए एक नया जीरा मुद्दा बनाया, और जब मुझे धक्का लगा तो मैंने इस नए अंक संख्या के साथ एक शाखा के नाम पर धक्का देने का फैसला किया में:

git push -u origin feat/XYZ-5678-a-different-description # failed

इससे मुझे इस SO थ्रेड पर चर्चा करने में त्रुटि हुई। लेकिन जब से मैं अपनी वर्तमान शाखा से एक अलग शाखा के नाम को आगे बढ़ाने की कोशिश कर रहा था , मेरी समस्या यहाँ वर्णित एक से अलग थी। इससे पहले कि मैं इसे धकेल पाऊं, मैंने अपनी स्थानीय शाखा का नाम बदल दिया।

git branch -m feat/XYZ-1234-some-description feat/XYZ-5678-a-different-description
git push -u origin feat/XYZ-5678-a-different-description # now works

थोड़ा और पढ़ने के बाद मुझे एहसास हुआ कि मैं वर्तमान शाखा के नाम पर, या बस उपयुक्त होने srcपर सेट कर सकता हूं :git pushHEAD

git push -u origin feat/XYZ-1234-some-description:feat/XYZ-5678-a-different-description # also works

-1

यदि आप पहली बार अपनी नई शाखा से नए बदलाव लाने में सक्षम हैं। और नीचे त्रुटि हो रही है:

*git push -f
fatal: The current branch Coding_Preparation has no upstream branch.

वर्तमान शाखा को पुश करने के लिए और रिमोट को अपस्ट्रीम के रूप में सेट करें, उपयोग करें

git push -u origin new_branch_name


** Successful Result:** 
 git push -u origin Coding_Preparation
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 599 bytes | 599.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'Coding_Preparation' on GitHub by visiting: ...
 * [new branch]      Coding_Preparation -> Coding_Preparation
Branch 'Coding_Preparation' set up to track remote branch 'Coding_Preparation' from 'origin'.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.