मुझे हर समय `परेशान-अपस्ट्रीम` करने की आवश्यकता क्यों है?


1464

मैं Git में एक नई शाखा बनाता हूं:

git branch my_branch

धक्का दो:

git push origin my_branch

अब कहते हैं कि किसी ने सर्वर पर कुछ बदलाव किए हैं और मैं इससे हटना चाहता हूं origin/my_branch। मैं करता हूँ:

git pull

लेकिन मुझे मिलता है:

You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "my_branch"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

मैंने सीखा कि मैं इसके साथ काम कर सकता हूं:

git branch --set-upstream my_branch origin/my_branch

लेकिन मेरे द्वारा बनाई गई प्रत्येक शाखा के लिए मुझे ऐसा करने की आवश्यकता क्यों है? यह स्पष्ट नहीं है कि अगर मैं धक्का my_branchमें origin/my_branch, तो मैं खींचने के लिए चाहते हो जाएगा origin/my_branchमें my_branch? मैं इसे डिफ़ॉल्ट व्यवहार कैसे बना सकता हूं?


21
डिफ़ॉल्ट के लिए branch.autosetupmergeइसका मतलब है कि एक नई शाखा के लिए अपस्ट्रीम कॉन्फ़िगरेशन केवल स्वचालित रूप से सेट किया जाता है जब एक रिमोट-ट्रैकिंग शाखा (जैसे <remote-name>/<branch-name>) से एक शाखा बनाते हैं (देखें git-config (1) )। आप शायद मौजूदा स्थानीय शाखाओं से अपनी शाखाएँ बना रहे हैं। यदि आप किसी दूरस्थ शाखा की नोक से (स्थानीय शाखा पर होने के बावजूद) प्रभावी रूप से शाखा कर रहे हैं, तो आप git branch my_branch <remote-name>/<branch-name>अपस्ट्रीम कॉन्फ़िगरेशन को स्वचालित रूप से सेटअप करने के लिए उपयोग कर सकते हैं ।
क्रिस जॉन्सन

20
FYI करें, --set-upstreamविकल्प को हटा दिया गया है। आपको उपयोग करना चाहिए --trackया --set-upstream-toइसके बजाय।
बीन

139
अगर --set-upstreamपदावनत किया जाता है, तो शायद git devों को इसे उस मदद संदेश से हटा देना चाहिए, जब आप git pushबिना किसी विकल्प के साथ चलते हैं और कोई अपस्ट्रीम सेट होने पर प्रदर्शित होता है?
क्रिस्टोफर हंटर

17
@ChristopherHunter आपकी टिप्पणी को एक वर्ष से अधिक हो गया है और यह अभी भी यही कहता है। क्या यह सिर्फ एक मैला प्रतिक्रिया है या शायद इसे रखने के लिए तकनीकी रूप से बुद्धिमान कारण है जिसके बारे में हम अनभिज्ञ हैं?
बजे कोनराड विन्टेरस्टेन

15
@ChristopherHunter git branch --set-upstreamपदावनत है। git push --set-upstreamनहीं है।
ब्रायन गॉर्डन

जवाबों:


1536

एक शॉर्टकट, जो git branch --set-upstream 1 के लिए वाक्यविन्यास को याद रखने पर निर्भर नहीं करता है:

git push -u origin my_branch

... पहली बार जब आप उस शाखा को धक्का देते हैं। या, वर्तमान शाखा को एक ही नाम की शाखा (एक उपनाम के लिए आसान) पर धकेलने के लिए:

git push -u origin HEAD

आपको केवल -uएक बार उपयोग करने की आवश्यकता है , और यह आपकी शाखा के बीच संबंध स्थापित करता है originऔर उसी तरह से git branch --set-upstreamकरता है जैसे कि करता है।

व्यक्तिगत रूप से, मुझे लगता है कि आपकी शाखा के बीच और दूरस्थ रूप से एक के बीच उस संबंध को स्थापित करना एक अच्छी बात है। यह सिर्फ एक शर्म की बात है कि नियम हैं है के लिए अलग git pushऔरgit pull


1 यह मूर्खतापूर्ण लग सकता है, लेकिन मैं अक्सर वर्तमान शाखा को निर्दिष्ट करना भूल जाता हूं, यह मानते हुए कि यह डिफ़ॉल्ट है - यह नहीं है, और परिणाम सबसे अधिक भ्रमित हैं :)

अपडेट 2012-10-11 : जाहिर तौर पर मैं अकेला व्यक्ति नहीं हूं जिसने गलत काम करना आसान पाया! VONC के लिए धन्यवाद कि यह बताने के लिए 1.8.0 अधिक स्पष्ट परिचय देता है git branch --set-upstream-to, जिसका उपयोग निम्नानुसार किया जा सकता है, यदि आप शाखा में हैं my_branch:

git branch --set-upstream-to origin/my_branch

... या छोटे विकल्प के साथ:

git branch -u origin/my_branch

यह परिवर्तन, और इसका तर्क, git 1.8.0 के रिलीज़ नोट में वर्णित है , उम्मीदवार को जारी करें 1 :

यह कहने के लिए आकर्षक था git branch --set-upstream origin/master, लेकिन यह बताता है कि origin/masterवर्तमान में चेक आउट की गई शाखा के साथ एकीकरण के लिए स्थानीय शाखा को व्यवस्थित करने के लिए , जो उपयोगकर्ता के लिए बहुत अधिक संभावना नहीं है। विकल्प को हटा दिया गया है; इसके बजाय नए --set-upstream-to(एक शॉर्ट-एंड-स्वीट -u) विकल्प का उपयोग करें।


95
इस बात पर भी ध्यान दें कि यदि आप -uपहली बार पुश करते समय भूल जाते हैं , तो आप पुश को फिर से उस झंडे के साथ चला सकते हैं और यह ट्रैकिंग शुरू कर देगा।
हेनरिक एन

70
इनमें से कोई भी तर्क के बिना गिट पुश के उपयोग के मामले को संतुष्ट नहीं करता है। यह रहता है कि मुझे पहली बार अपनी नई शाखा को रिमोट से स्थानांतरित करने के लिए अभी भी 'git push -u origin my-branch' याद रखना होगा।
बुतपरस्त कार्ल

19
मुझे उस वाक्यविन्यास को याद करने से भी नफरत है, इसलिए मैंने निम्नलिखित उपनाम बनाया:alias gpo="git push --set-upstream origin $(git branch | awk '/^\* / { print $2 }')"
लिलियालेक्सिस

99
यह सब ठीक है, लेकिन मुझे अभी भी लगता है कि ओपी की शिकायत वैध है। आप एक स्थानीय शाखा शुरू करते हैं, उस पर काम करते हैं, इसे साझा करने के लिए मूल पर धकेलते हैं (बिना आर्ग के); ऐसा क्यों नहीं होना चाहिए? क्या वास्तव में यह किसी कारण से वांछनीय है कि एक नई शाखा को रिमोट पर धकेलने के दौरान अपस्ट्रीम को सेट न किया जाए?
गैरीओ

23
पूरी तरह से देव समय के लायक नहीं है। ऐसा क्यों नहीं होता है?
सूदो

1346

कम टाइपिंग से आप ऐसा कर सकते हैं। सबसे पहले, अपने काम करने के तरीके को बदलें:

git config --global push.default current

इस origin my_branchभाग का अनुमान है , इस प्रकार आप कर सकते हैं:

git push -u

जो दोनों एक ही नाम से रिमोट ब्रांच बनाएंगे और उसे ट्रैक करेंगे।


4
नव निर्मित रिपॉजिटरी में नई बनाई गई शाखा के लिए originदौड़ने git push -uके दौरान अनुमान कैसे लगाया जा सकता है? क्या यह धारणा कि रिपॉजिटरी को क्लोन किया गया था, इस प्रकार वर्तमान शाखा का रिमोट सेट है origin?
पायोत्र डोब्रोगोस्ट

73
यह डिफ़ॉल्ट होना चाहिए। अगर यह सिर्फ बेहतर चूक के साथ भेज दिया गया तो git में कई चीजें अधिक उपयोगकर्ता के अनुकूल हो सकती हैं।
फ्राकहेड

13
ज्ञात हो कि 'करंट' समान कार्य करने के लिए 'सिंपल' का उपयोग करने की तुलना में थोड़ा अनिश्चित है, देखें stackoverflow.com/questions/23918062/…
Air

30
यह करता है, लेकिन तब जब आप करने की कोशिश करते हैं कि pullआपको कहां से निर्दिष्ट करना होगा। -uमूल और अपने स्थानीय रेपो के बीच शाखा ट्रैकिंग सेट अप करता।
ज़मिथ

7
जबकि मामूली सुविधाजनक, यह अभी भी अनिवार्य है कि पहले और केवल के लिए एक अलग कमांड चलाया जाए push- जो इस प्रश्न के पूरे बिंदु को हरा देता है। संक्षेप में, कोई अच्छा जवाब नहीं है। कि Git Developers इस Awkward User eXperience (AUX) को व्यापक सामुदायिक असंतोष के चेहरे पर बनाए रखने पर जोर देते हैं ... ज्ञानवर्धक है। और हतोत्साहित कर रहा है। (ज्यादातर हतोत्साहित करने वाला।)
सेसिल करी

87

आप बस कर सकते हैं

git checkout -b my-branch origin/whatever

पहली जगह में। यदि आप ( branch.autosetupmergeया branch.autosetuprebaseमेरा पसंदीदा) सेट always(डिफ़ॉल्ट true) है, my-branchतो स्वचालित रूप से ट्रैक करेंगे origin/whatever

देख लो git help config


5
यह "घातक: उत्पादन को अद्यतन करता है और एक ही समय में शाखा 'माय-ब्रांच' पर स्विच नहीं करता है।"
बुतपरस्त कार्ल

12
वैसे, मैं आमतौर पर बस git checkout -t origin/whatever, जो whateverनए शाखा-नाम के रूप में भी चुनता हूं । बहुत ही सुविधाजनक!
cdunn2001

2
@ LCDunn यह एक आदर्श है, लेकिन शायद ही संगत है। ध्वज को बुलाया जाना चाहिए -u/ --set-upstream
टोबू

1
git checkout -t origin/whateverएक नई शाखा बनाने की कोशिश करते समय मेरे लिए काम नहीं करता है:fatal: Cannot update paths and switch to branch 'whatever' at the same time.
समझदार

1
git checkout -b my-branch origin/whateverभी एक ही त्रुटि (मैं एक नई शाखा है कि स्थानीय या दूरदराज पर मौजूद नहीं है बनाने के लिए कोशिश कर रहा हूँ) है: fatal: Cannot update paths and switch to branch 'whatever' at the same time.
wisbucky

81

आप दो तरीकों से अपस्ट्रीम को सरल बना सकते हैं। शाखा बनाते समय सबसे पहले:

git branch -u origin/my-branch

या जब आप एक शाखा बना लेते हैं, तो आप इस कमांड का उपयोग कर सकते हैं।

git push -u origin my-branch

आप एकल कमांड में शाखा, चेक आउट और अपस्ट्रीम भी कर सकते हैं:

git checkout -b my-branch -t origin/my-branch

मेरी व्यक्तिगत प्राथमिकता दो-चरणीय कमांड में यह करना है:

git checkout -b my-branch
git push -u origin my-branch

1
बहुत बढ़िया जवाब! दोनों आम उपयोग के मामलों को संबोधित करता है। दौड़ने के बाद git branch -u origin/my-branchमैं git pullअपने परिवर्तनों को खींचने के लिए दौड़ सकता हूं।
बेंजामिन एटकिन

2
"git चेकआउट -b माय-ब्रांच -t ओरिजिन / माय-ब्रांच" यह काम नहीं करता है यदि 'मूल / my-ब्रांच' अभी तक मौजूद नहीं है।
स्पॉन्जमैन

1
आप वास्तव में बस के git checkout -t origin/my-branchबिना कर सकते हैं -b my-branch, यह सिर्फ my-branchस्थानीय शाखा के नाम के लिए स्वचालित रूप से अनुमान लगाएगा । हालाँकि, जैसा कि @Spongman ने उल्लेख किया है, यह कमांड काम नहीं करता है अगर origin/my-branchपहले मौजूद नहीं है।
वारबैंक

हाँ, काम करेंगे @wisbucky, -t काम करता है बस ठीक है। व्यक्तिगत रूप से, हालांकि, मेरे द्वारा लिखे जाने के दो साल बाद भी, हालांकि, मैं अभी भी चेकआउट-बी और पुश-यू के साथ दो लाइनों में विभाजित करना पसंद करता हूं। यह अधिक स्पष्ट है और चेकआउट-बी पर कोई त्रुटि नहीं है जब मेरे पास रिमोट नहीं है - जो प्रयोग करते समय बहुत बार होता है :)
Tzen

2
git push -u origin/my-branchमेरे साथ विफल रहता है fatal: 'origin/my-branch' does not appear to be a git repository। यह काम करता है:git push -u origin my-branch
स्टैस्टन

79

यह बकवास के लिए मेरा सबसे आम उपयोग है ।

$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

$ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

इसके अलावा, अपने टर्मिनल में शपथ शब्द टाइप करना मजेदार है।


इसलिए इसे विंडोज (या कम से कम गिट-बैश) में पोर्ट करना होगा।
ब्रायन एचवीबी

1
अच्छी तरह से इस छोटी सी खोज ने मेरा दिन बना दिया। धन्यवाद
इवान डर्स्ट

शानदार उपकरण, धन्यवाद!
यूरीआई

48

आप उपयोग कर सकते हैं:

git config --global Branch.autosetupmerge हमेशा

हर बार जब आप एक नई शाखा बनाते हैं या चेकआउट करते हैं तो अपस्ट्रीम शाखा से जुड़ जाएगा।

Https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/ देखें

यह भी साथ काम करता है branch.autosetuprebase, यदि आप अधिक रिजेक्टेड फ़ोकस किए गए वर्कफ़्लो का पालन करते हैं, लेकिन इसका उपयोग तब तक न करें जब तक आप यह नहीं जानते कि आप क्या कर रहे हैं, क्योंकि यह रिबेज़ के लिए आपके खींच व्यवहार को डिफ़ॉल्ट कर देगा, जिससे विषम परिणाम हो सकते हैं।


8
काम नहीं करता है, मुझे अभी भी --set-upstreamसंदेश मिलता है
डोरियन

2
@ डोरियन, आपको ब्रांच बनाने से पहले यह सेट करना होगा। देखें stackoverflow.com/a/9753268/263998
cdunn2001

8
लेकिन यह ट्रैकिंग शाखा को उसी शाखा के साथ रिमोट के रूप में सेट नहीं करता है, लेकिन वर्तमान स्थानीय शाखा को .. इसलिए जब आप पुश करते हैं तो यह LOCAL शाखा में धकेलने का प्रयास करेगा जो आप नई शाखा बनाने से पहले थे ..
अर्नोल्ड रोआ

1
यह डिफ़ॉल्ट से भी अजीब व्यवहार है। यदि आप किसी शाखा से काम करते हैं, तो यह वास्तव में अजीब तरह से कार्य करता है।
बीफस्टर

1
इस सेटिंग के साथ सावधान रहें !! इसे सेट करने के बाद, आपको यह व्यवहार मिलता है। 1. पर स्विच करें master। 2. भागो git checkout -b new_branch। 3. उस ब्रांच में एक कमिट जोड़ें। 4 git push origin new_branch.। यह धक्का देता है जो masterमूल पर शाखा के लिए प्रतिबद्ध है (बल्कि मूल पर एक नई शाखा के बजाय new_branch)।
1919 को

38

वैसे, वर्तमान शाखा को समान नाम के साथ दूरस्थ में धकेलने का शॉर्टकट:

$ git push -u origin HEAD

22

मैं व्यक्तिगत रूप से इन निम्नलिखित उपनाम का उपयोग बैश में करता हूं

~ / .gitconfig फ़ाइल में

[alias]
    pushup = "!git push --set-upstream origin $(git symbolic-ref --short HEAD)"

और ~ / .bashrc या ~ / .zshrc फ़ाइल में

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"

1
मुझे केवल .angeconfig hcange की आवश्यकता थी, तब मैं उस कमांड का उपयोग कर सकता था git pushupजो हमेशा वर्तमान शाखा को मूल में धकेलती है। मैं हमेशा से ही उपयोग कर सकते हैं git pushupके बजाय git push👍
thespacecamel

18

यदि नीचे काम नहीं करता है:

git config --global push.default current

आपको अपनी परियोजना के स्थानीय कॉन्फिगरेशन को भी अपडेट करना चाहिए, क्योंकि संभव है कि आपके प्रोजेक्ट में स्थानीय गिट कॉन्फ़िगरेशन हों:

git config --local push.default current

2
अधिक स्पष्टीकरण बहुत अच्छा होगा। पहली पंक्ति क्या करती है?
पैपिलोन

3
यह उत्तर वही है जो कानूनी लगता है। आलिया को प्रपोज करने वाले सभी गूंगे वर्कअराउंड हैं। और दूसरे जो लंबे कमांड अनुक्रम याद कर रहे हैं, वे पांडित्यपूर्ण हैं।
मार्कहु नोव 22'19

10

आप यह भी स्पष्ट रूप से बता सकते हैं कि कौन सी दूरस्थ शाखा को खींचना है (क्योंकि यह त्रुटि संदेश में उल्लेख है):

git pull <remote-name> <remote-branch>

इसके साथ सावधान रहें, हालांकि: यदि आप एक अलग शाखा पर हैं और एक स्पष्ट खींच करते हैं, तो आपके द्वारा खींची जाने वाली रिस्पेक्ट उस शाखा में विलीन हो जाएगी जिस पर आप हैं!


10

इसके लायक क्या है, अगर आप एक ऐसी शाखा को ट्रैक करने की कोशिश कर रहे हैं जो पहले से ही रिमोट पर मौजूद है (जैसे। मूल / somebranch) लेकिन स्थानीय स्तर पर अभी तक इसकी जाँच नहीं की है, तो आप कर सकते हैं:

$ git checkout --track origin/somebranch

नोट: '-t' '--track' विकल्प का छोटा संस्करण है।

यह बल्ले से उसी एसोसिएशन को सेट करता है।


5
आप वास्तव में शाखा को केवल चेकआउट कर सकते हैं। तो git checkout somebranchसमतुल्य है।
ज़मिथ

2
@Zamith क्या केवल git fetchपहले से बुलाए जाने के बाद ही काम नहीं करता है ?
वाल्टर रोमन

1
तुरंत नहीं, लेकिन हां, आपको अपने स्थानीय रेपो पर उस शाखा का संदर्भ देने की आवश्यकता है, जो जब भी आप कॉल करते हैं git fetchया होता है git pull। मैंने कभी नहीं पाया कि एक मुद्दा है, हालांकि।
ज़मिथ

10
git branch --set-upstream-to=origin/master<branch_name>

9

मैं हर बार Git से सुझाव कॉपी / पेस्ट करने के बजाय इस Git उपनाम का उपयोग करता हूं: https://gist.github.com/ekilah/88a880c84a50b73bd306

स्रोत की प्रतिलिपि नीचे दी गई है (इसे अपनी ~/.gitconfigफ़ाइल में जोड़ें ):

[alias]
  pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream"

7

आप एक बहुत अच्छा उपनाम सेट कर सकते हैं जो अत्यधिक क्रिया सिंटैक्स के बिना इसे संभाल सकता है।

मेरे पास निम्नलिखित उपनाम हैं ~/.gitconfig:

po = "!git push -u origin \"$(git rev-parse --abbrev-ref HEAD)\""

एक नई शाखा पर कमिट करने के बाद, आप केवल कमांड टाइप करके अपनी नई शाखा को आगे बढ़ा सकते हैं:

git po

क्यों po? push origin? यदि इसे कई बार चलाया जाए तो क्या होगा?
अर्नोल्ड रोआ

हां, जैसा कि धक्का मूल में है। कई बार चलने पर कुछ नहीं होता। मेरे पास एक git push -fउपनाम भी है git pf, इसलिए मैं उपयोग करता हूं कि एक बार मूल को पहले ही धकेल दिया गया है।
123

djanowski की टिप्पणी देखें , आप सीधे उपयोग कर सकते हैंHEAD
arhak

3

उनके साथ काम करने वाले एक उपनाम की तलाश करने वालों के लिए git pull, यह मेरा उपयोग है:

alias up="git branch | awk '/^\\* / { print \$2 }' | xargs -I {} git branch --set-upstream-to=origin/{} {}"

अब आपको जब भी मिलेगा:

$ git pull
There is no tracking information for the current branch.
...

बस दौडो:

$ up
Branch my_branch set up to track remote branch my_branch from origin.
$ git pull

और आप जाने के लिए अच्छे हैं


2

क्योंकि गिट में विभिन्न शाखाओं को विभिन्न "अपस्ट्रीम" रिपॉजिटरी में धकेलने / खींचने की ठंडी क्षमता होती है। आप एक ही शाखा पर - धक्का देने और खींचने के लिए अलग रिपॉजिटरी का भी उपयोग कर सकते हैं। यह एक वितरित, बहु-स्तरीय प्रवाह बना सकता है, मैं इसे लिनक्स कर्नेल जैसे प्रोजेक्ट पर उपयोगी देख सकता हूं। Git को मूल रूप से उस प्रोजेक्ट पर उपयोग करने के लिए बनाया गया था।

नतीजतन, यह इस बारे में धारणा नहीं बनाता है कि आपकी शाखा को कौन से रेपो पर नज़र रखना चाहिए।

दूसरी ओर, अधिकांश लोग इस तरह से गिट का उपयोग नहीं करते हैं, इसलिए यह एक डिफ़ॉल्ट विकल्प के लिए एक अच्छा मामला बना सकता है।

गिट आम ​​तौर पर बहुत कम स्तर का होता है और यह निराशाजनक हो सकता है। फिर भी GUI हैं और यदि आप अभी भी इसे शेल से उपयोग करना चाहते हैं तो सहायक स्क्रिप्ट लिखना आसान होना चाहिए।



0

मैं legitइस मुद्दे (ओएस एक्स केवल) के कारण फिर से खोजा गया । अब सभी का उपयोग मैं करता हूं जब शाखाएं ये दो आदेश हैं:

legit publish [<branch>] रिमोट के लिए निर्दिष्ट शाखा प्रकाशित करता है। (उर्फ: pub)

legit unpublish <branch> रिमोट से निर्दिष्ट शाखा को हटाता है। (उर्फ: unp)

SublimeGitlegit डिफ़ॉल्ट रूप से समर्थन के साथ आता है , जो Ctrl-b को दबाने के रूप में पूरे ब्रांचिंग रूटीन को आसान बनाता है।


0

हम phabricator का उपयोग करते हैं और git का उपयोग करके धक्का नहीं देते हैं। मुझे bash alias बनाना था जो Linux / mac पर काम करता है

vim ~/.bash_aliases

new_branch() {
    git checkout -b "$1"
    git branch --set-upstream-to=origin/master "$1"
}

सहेजें

source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull

0

यहां गिट पुश के लिए एक बैश उर्फ ​​है जो हर पुश के लिए सुरक्षित है और स्वचालित रूप से पहले पुश के लिए अपस्ट्रीम और फिर उसके बाद सामान्य पुश करने के बीच स्विच करेगा।

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'

मूल पोस्ट

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