वास्तव में "यू" क्या करता है? "गिट पुश-ओ ओरिजिनल मास्टर" बनाम "गिट पुश ओरिजिन मास्टर"


334

मैं इसे समझने के अपने सर्वश्रेष्ठ प्रयासों के बावजूद, स्पष्ट रूप से गिट का उपयोग करने में भयानक हूं।

इसके लिए kernel.org से git push:

-u

--set-नदी के ऊपर

प्रत्येक शाखा के लिए जो अद्यतित है या सफलतापूर्वक धकेल दी गई है, अपस्ट्रीम (ट्रैकिंग) संदर्भ जोड़ें, जिसका उपयोग तर्क-कम गिट-पुल (1) और अन्य कमांड द्वारा किया जाता है। अधिक जानकारी के लिए, branch.<name>.mergegit-config (1) देखें।

यहाँ branch.<name>.mergeसे है git config:

branch.<name>.merge

परिभाषित करता है, साथ में branch.<name>.remote, दी गई शाखा के लिए अपस्ट्रीम शाखा। यह गिट भ्रूण / गिट पुल को बताता है कि किस शाखा को विलय करना है और यह गिट पुश को भी प्रभावित कर सकता है (पुश.डफॉल्ट देखें)। जब शाखा में होता है <name>, तो यह बताता है कि FETCH_HEAD में विलय के लिए डिफ़ॉल्ट रीस्पेक चिह्नित किया जाना चाहिए। मान को किसी refspec के दूरस्थ भाग की तरह संभाला जाता है, और उस रेफ से मेल खाना चाहिए जो कि दिए गए रिमोट से प्राप्त होता है "branch.<name>.remote"। मर्ज की जानकारी का उपयोग गिट पुल द्वारा किया जाता है (जो पहली बार git fetch कहलाता है) विलय के लिए डिफ़ॉल्ट शाखा देखने के लिए। इस विकल्प के बिना, git पुल चूक को पहले refspec प्राप्त करने के लिए मिलाया जाता है। ऑक्टोपस मर्ज प्राप्त करने के लिए कई मान निर्दिष्ट करें। यदि आप गिट पुल को सेटअप करना चाहते हैं ताकि यह <name>स्थानीय रिपॉजिटरी में किसी अन्य शाखा से विलय हो जाए , तो आप इंगित कर सकते हैंbranch.<name>.mergeवांछित शाखा में, और विशेष सेटिंग का उपयोग करें। (एक अवधि) के लिए branch.<name>.remote

मैंने सफलतापूर्वक गितुब के साथ एक रिमोट रिपॉजिटरी स्थापित की, और मैंने सफलतापूर्वक इसके साथ अपनी पहली प्रतिबद्धता को आगे बढ़ाया:

git push -u origin master

फिर, मैंने अनजाने में अपने रिमोट रिपॉजिटरी का उपयोग करके अपनी दूसरी प्रतिबद्धता को सफलतापूर्वक धकेल दिया:

git commit -m '[...]'

हालांकि, गलत तरीके से सोच रहा करने के लिए फिर से पुश करने के लिए होता है originसे master, मैं भाग गया:

# note: no -u
git push origin master

ऐसा क्या किया? ऐसा बिल्कुल भी नहीं लगता था। क्या मैंने "पूर्ववत" किया था git push -u origin master?


44
I'm apparently terrible at using git, despite my best attempts to understand it.- मैंने कभी किसी को इतना अच्छा नहीं बनाया।
dgo

जवाबों:


335

कुंजी "तर्क-कम गिट-पुल" है। जब आप git pullकिसी शाखा से करते हैं , तो किसी स्रोत या शाखा को निर्दिष्ट किए बिना, git branch.<name>.mergeसेटिंग को यह जानने के लिए देखता है कि कहां से खींचना है। git push -uआप जिस शाखा को आगे बढ़ा रहे हैं, उसके लिए यह जानकारी सेट करता है।

अंतर देखने के लिए, आइए एक नई खाली शाखा का उपयोग करें:

$ git checkout -b test

सबसे पहले, हम बिना धक्का देते हैं -u:

$ git push origin test
$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.test.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 "test"]
    remote = <nickname>
    merge = <remote-ref>

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

See git-config(1) for details.

अब अगर हम जोड़ते हैं -u:

$ git push -u origin test
Branch test set up to track remote branch test from origin.
Everything up-to-date
$ git pull
Already up-to-date.

ध्यान दें कि ट्रैकिंग जानकारी सेट की गई है ताकि git pullरिमोट या शाखा को निर्दिष्ट किए बिना अपेक्षित रूप से काम किया जा सके।

अद्यतन: बोनस युक्तियाँ:

  • जैसा कि एक टिप्पणी में मार्क का उल्लेख है, git pullइस सेटिंग के अलावा भी डिफ़ॉल्ट व्यवहार को प्रभावित करता है git push। यदि आप -uरिमोट ब्रांच को ट्रैक करने के लिए उपयोग करने की आदत डालते हैं, तो मैं आपको अपने push.defaultकॉन्फ़िगरेशन मान को सेट करने की सलाह देता हूं upstream
  • git push -u <remote> HEADवर्तमान शाखा को उसी नाम की एक शाखा पर धकेल देगा <remote>(और ट्रैकिंग भी सेट कर सकता है ताकि आप git pushउसके बाद कर सकें )।

4
git push <remote> <branch>चीजों को अस्पष्ट बनाता है । यदि आप दूरस्थ या शाखा छोड़ते हैं तो शाखा विन्यास सेटिंग्स पर वापस आ जाता है, जो आपके लिए निर्धारित हैं git push -u
dahlbyk

2
@dahlbyk मैंने आगे बढ़कर आपको उत्तर के रूप में चिह्नित किया है, लेकिन यह टिप्पणी मुझे कुछ भ्रमित करती है। आपके उत्तर में, आपने यह दिखाया कि गिट के बाद उलझन थीgit push origin test (जो नहीं है -u)। फिर आपने दिखाया कि अस्पष्टता git push -u origin test को दूर करता है। क्या कोई टाइपो है, या मैं बस फिर से घना हो रहा हूं?
क्लोज कॉउबॉय

1
मुझे लगता है कि हम एक-दूसरे से बात कर रहे हैं। :) जब मैं कहता हूं कि git push <remote> <branch>असंदिग्ध है, तो मेरा मतलब है कि सापेक्ष git pushजो शाखा विन्यास पर निर्भर करता है। इसी प्रकार, git pull <remote> <branch>असंदिग्ध है और git pullशाखा विन्यास पर निर्भर करता है। एक बार जब आप के साथ आगे बढ़ाया है जो -u, दोनों git pushऔर git pullअपेक्षा के अनुरूप काम करेंगे।
डेहल्बिक

10
@ डाहलबीक: आपका उत्तर ठीक है, लेकिन ऊपर की टिप्पणियों में आप एक सामान्य गलत धारणा को दोहराते हैं git push- जब तक आप push.defaultखुद को सेट नहीं करते हैं, git pushकेवल अपस्ट्रीम ब्रांच कॉन्फ़िगरेशन का उपयोग करके यह तय करता है कि किस रिमोट को पुश करना है, अपडेट करने के लिए रिमोट ब्रांच नहीं।
मार्क लोंगेयर

1
Git के लिए सबसे अच्छा अभ्यास है git push origin masterऔर दूसरी तरफ IE के समान है। git pull origin master.. तो अगर लगता है कि शाखा में परिवर्तन होता है, तो आप कर सकते हैं git push origin branch_nameऔर दूसरी तरफ IE के लिए भी। git pull origin branch_name
अर्पित वैष्णव

87
git push -u origin master

… के समान है:

git push origin master ; git branch --set-upstream master origin/master

यदि आप भूल जाते हैं, तो अंतिम वक्तव्य दें -u!

या आप इसे मजबूर कर सकते हैं:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

यदि आप कमांड को आपके लिए करते हैं, तो यह आपकी गलतियों को उठाएगा जैसे कि आपने एक गैर-मौजूद शाखा टाइप की या आपने नहीं किया git remote add; हालांकि वह हो सकता है कि आप क्या चाहते हैं। :)


1
BTW masterसिर्फ एक उदाहरण है :)
sabgenton

ठीक है दूसरा बिट अब नए संस्करणों में इसके लिए git branch master -u origin/master
ह्रासमान है

2
यदि आप -uविकल्प का उपयोग करना भूल जाते हैं , तो git push -uतुरंत टाइप करें ठीक है।
zeekvfu

1
गिट के नए संस्करणों से संकेत मिलता है कि --setup-upstreamपदावनत हो जाएगा: The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
बिल होग

-सेट-अपस्ट्रीम को अपदस्थ किया गया है, अब यह काम करता है:git branch --set-upstream-to=origin/master master
अल्बर्टो पेरेज़

43

अधिक सरल शब्दों में:

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

यहां जो महत्वपूर्ण है वह यह है कि इससे आप git pullबिना किसी और तर्क के आपूर्ति कर सकते हैं । उदाहरण के लिए, एक बार जब आप एक कर लेते हैं git push -u origin master, तो आप बाद में कॉल कर सकते हैं git pullऔर यह जान पाएंगे कि आपका वास्तव में मतलब है git pull origin master

अन्यथा, आपको पूरी कमांड टाइप करनी होगी।


1
इसलिए अगर मैं हर अगले पुल पर -uझंडा लगाऊंगा तो orgin masterइसका जिक्र करूंगा। और अगर मैं उस git pullव्यवहार को बदलना चाहता हूं जिसे मुझे चलाना चाहिए git push -u origin some_other_branchऔर git pullअब संदर्भित करेगा some_other_branch? धन्यवाद!
टॉम टॉमोव

1
क्या हम "गिट पुश ओरिजिन मास्टर" के बजाय "गिट पुश" का उपयोग कर सकते हैं?
सीगप्रकाश

हां, आप @cegprakash कर सकते हैं। हालाँकि, आपने शुरू मेंgit push -u origin master
Adépùjú Olúwáségun

-11

Gitub में धकेलने और खींचने के लिए सभी आवश्यक गिट बैश आदेश:

git status 
git pull
git add filefullpath

git commit -m "comments for checkin file" 
git push origin branch/master
git remote -v 
git log -2 

यदि आप किसी फ़ाइल को संपादित करना चाहते हैं तो:

edit filename.* 

सभी शाखाओं और उनके आवागमन को देखने के लिए:

git show-branch

4
मुझे लगता है कि आपने प्रश्न के दायरे से बाहर उत्तर दिया।
Adép Febjù Olúwáségun
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.