मौजूदा गिट शाखा को एक दूरस्थ शाखा बनाएं?


3534

मुझे पता है कि एक नई शाखा कैसे बनाई जाती है जो दूरस्थ शाखाओं को ट्रैक करती है, लेकिन मैं एक मौजूदा शाखा को दूरस्थ शाखा कैसे बना सकता हूं?

मुझे पता है कि मैं .git/configफ़ाइल को संपादित कर सकता हूं , लेकिन ऐसा लगता है कि एक आसान तरीका होना चाहिए।


26
जैसा कि नीचे उल्लेख किया गया है, मौजूदा शाखा के लिए, आप उपयोग कर सकते हैं git push -u origin branch-name
ज़ैग्स

3
यदि स्थानीय शाखा वर्तमान शाखा है, और स्थानीय शाखा पहले से ही रिमोट को ट्रैक नहीं कर रही है, git pullतो अक्सर ट्रैकिंग जानकारी को सेट करने के लिए उपयुक्त कमांड के बारे में उपयोगी संदेश प्रदान करेगा
Billrichards 12

57
यह तब कष्टप्रद होता है जब कोई git सीख रहा होता है जिसे git प्रलेखन का लिंक दिखाया जाता है। यह दस्तावेज ऐसे लोगों के लिए लिखा गया है जो पहले से ही जानते हैं कि वे क्या कर रहे हैं।
फेलिप अल्वारेज

9
2.10 git branch --set-upstream-to origin/<branch>
गित के

2
--set-upstreamएक त्रुटि पैदा करता है: fatal: the '--set-upstream' option is no longer supported. Please use '--track' or '--set-upstream-to' instead.तो git branch --set-upstream-to origin/<branch name>वर्तमान कमांड है जो काम करता है।
सुपर जेड

जवाबों:


4266

शाखा fooऔर रिमोट को देखते हुए upstream:

Git 1.8.0 के अनुसार:

git branch -u upstream/foo

या, यदि स्थानीय शाखा fooवर्तमान शाखा नहीं है:

git branch -u upstream/foo foo

या, यदि आप लंबी कमांड टाइप करना चाहते हैं, तो ये उपरोक्त दो के बराबर हैं:

git branch --set-upstream-to=upstream/foo

git branch --set-upstream-to=upstream/foo foo

Git 1.7.0 के अनुसार:

git branch --set-upstream foo upstream/foo

टिप्पणियाँ:

  • उपरोक्त सभी कमांड स्थानीय शाखा fooको रिमोट fooसे दूरस्थ शाखा को ट्रैक करने का कारण बनेंगे upstream
  • पुराने (1.7.x) सिंटैक्स को नए (1.8+) सिंटैक्स के पक्ष में चित्रित किया जाता है। नए वाक्य-विन्यास को अधिक सहज और याद रखने में आसान बनाने का इरादा है।
  • अपस्ट्रीम शाखा को परिभाषित करने पर विफल हो जाएगा जब नव-निर्मित रीमोज़ के खिलाफ चलाया जाता है जो पहले से ही नहीं किया गया है। उस स्थिति में, git fetch upstreamपहले से चलाएं ।

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


124
क्या "अपस्ट्रीम" रिमोट का नाम है? यानी क्या ज्यादातर "मूल" को डिफ़ॉल्ट रूप से कहेंगे?
एंड्रयू विट

172
@ और: हाँ। git branch --set-upstream master origin/masterजब आप शुरू में एक रिपॉजिटरी को क्लोन कर लेते हैं तो उसके बराबर होता है।
दान मोल्डिंग

62
संबंधित नोट पर, इसे अपने gitconfig में जोड़ना भयानक है: "[पुश] डिफ़ॉल्ट = ट्रैकिंग" यह ऐसा बना देगा कि पुश उसी स्थान पर जाएगा जो खींचता है :) से आता है
jpswain

61
मुझे "घातक: नहीं एक मान्य वस्तु नाम: 'मूल / मास्टर' मिलता है।"
जोचिम


235

आप निम्नलिखित कर सकते हैं (यह मानते हुए कि आप मास्टर पर जाँच कर चुके हैं और किसी दूरस्थ शाखा मास्टर को धकेलना चाहते हैं):

यदि आपके पास पहले से यह नहीं है तो 'रिमोट' सेट करें

git remote add origin ssh://...

अब ट्रैक करने के लिए मास्टर को कॉन्फ़िगर करें:

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

और धक्का:

git push origin master

यह वास्तव में रिमोट और पुश में शाखा की आवश्यकता है? मेरा मतलब है, आपको केवल इसकी आवश्यकता है यदि आपकी चेक आउट शाखा वह नहीं है जिसे आप पुश करना चाहते हैं, है ना?
डोपेलगैंगर

5
हां - लेकिन मेमोरी से आपको पहले पुश के लिए स्पष्ट होने की आवश्यकता हो सकती है। आसानी से निश्चित रूप से परीक्षण किया जा सकता है ... :)
पॉल हैडरली

+1 यह उन विंडोज उपयोगकर्ताओं के लिए जवाब है, जो पूर्व 1.8 के msysgit "पूर्वावलोकन" से चिपके हुए हैं। उसके लिए धन्यवाद।
जॉन

3
यह एकमात्र उत्तर है जिसने मेरे लिए काम किया। जब मैंने एक मौजूदा शाखा के लिए अपस्ट्रीम रिमोट को सेट करने के लिए स्वीकृत उत्तर की कोशिश की, तो मुझे मिला error: the requested upstream branch 'upstream/master' does not exist:।
स्टीव के

4
@SteveK यह सबसे अधिक संभावना है क्योंकि आपके अपस्ट्रीम को कहा जाता है originऔर नहीं upstream
umläute

160

मैं -uविकल्प के साथ धक्का के साइड-इफेक्ट के रूप में ऐसा करता हूं

$ git push -u origin branch-name

बराबर लंबा विकल्प है --set-upstream

git-branchआदेश यह भी समझता है --set-upstream, लेकिन इसके उपयोग को भ्रमित किया जा सकता है। संस्करण 1.8.0 इंटरफ़ेस को संशोधित करता है।

git branch --set-upstreamवंचित है और अपेक्षाकृत दूर के भविष्य में हटाया जा सकता है। git branch [-u|--set-upstream-to]तर्कों के एक संक्षिप्त आदेश के साथ पेश किया गया है।

...

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

मान लें कि आपके पास एक स्थानीय fooशाखा है और यह चाहते हैं कि शाखा को उसके नाम के समान ही माना जाए। इस के साथ बनाओ

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

या केवल

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

1
यह एक बेहतर समाधान imo है
Nils_e

--set-upstream-to=...बस वही है जिसकी मुझे तलाश थी।
रिचर्ड

54

आपको git_remote_branchउपकरण उपयोगी लग सकता है। यह दूरस्थ शाखाओं को बनाने, प्रकाशित करने, हटाने, ट्रैकिंग और नाम बदलने के लिए सरल कमांड प्रदान करता है। एक अच्छी विशेषता यह है कि आप grbकमांड को यह समझाने के लिए पूछ सकते हैं कि यह किस कमांड को निष्पादित करेगा।

grb explain create my_branch github
# git_remote_branch version 0.3.0

# List of operations to do to create a new remote branch and track it locally:
git push github master:refs/heads/my_branch
git fetch github
git branch --track my_branch github/my_branch
git checkout my_branch

3
grb एक माणिक रत्न है जिसे उनके github
mcabrams

6
ओपी जीआईटी के बारे में ही सवाल पूछ रहा है। तो एक नया उपकरण शुरू न करें, शायद बेहतर होगा।
zeekvfu

grb मेरे macOS इंस्टालेशन पर git-rebase के लिए एक उपनाम है। मैंने ऐसा नहीं किया :)
बेन सिनक्लेयर

53

वास्तव में काम करने के लिए स्वीकृत जवाब के लिए:

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa

स्थानीय शाखा पहले से ही एक शाखा पर नज़र रख रही थी, इसलिए हम मान सकते हैं कि रिमोट रेपो पहले से ही जोड़ा गया था।
डॉपेलगैंगर

डॉप्लरगैंगर: स्वीकार किए गए उत्तर के लिए जॉचिम की टिप्पणी देखें। वैसे भी धारणाएं अलग-अलग हैं - यह चीजों को इतना दिलचस्प बनाती है;)
हेजहोग

44

मेरा मानना ​​है कि Git 1.5.x के रूप में आप इस तरह की एक स्थानीय शाखा को $BRANCHएक दूरस्थ शाखा ट्रैक कर सकते हैं origin/$BRANCH

कि यह देखते हुए $BRANCHऔर origin/$BRANCHमौजूद हैं, और आप अभी चेक आउट नहीं किया है $BRANCH(दूर करता है, तो आप स्विच), कार्य करें:

git branch -f --track $BRANCH origin/$BRANCH

यह $BRANCHएक ट्रैकिंग शाखा के रूप में फिर से बनाता है । -fशक्तियों के बावजूद निर्माण $BRANCHपहले से ही विद्यमान। --trackवैकल्पिक है अगर सामान्य चूक जगह पर हैं (जो कि, गिट-कॉन्फिगर पैरामीटर branch.autosetupmergeसत्य है)।

ध्यान दें, यदि origin/$BRANCHअभी तक मौजूद नहीं है, तो आप अपने स्थानीय $BRANCHको दूरस्थ रिपॉजिटरी में धकेल कर बना सकते हैं :

git push origin $BRANCH

एक ट्रैकिंग शाखा में स्थानीय शाखा को बढ़ावा देने के लिए पिछले आदेश का पालन किया।


1
git push origin $BRANCHवही था जिसकी मुझे तलाश थी।
उपयोगकर्ता

सभी प्रकार के समाधानों की कोशिश करने के बाद, ऊपर की स्थापना सहित, जैसा कि ऊपर वर्णित कुछ भी काम नहीं किया गया है। मैं जो करना चाहता था, वह एक रिमोट से मेरी स्थानीय शाखा में 1 नई कमिटि खींचना है और मैंने शुरू में ट्रैकिंग ट्रैकिंग नहीं की। आदेश git branch -f --track $BRANCH origin/$BRANCHचाल करता है।
डेमिट्री

38

1- अपने स्थानीय मेटा-डेटा का उपयोग करके अपडेट करें: git fetch --all

यहां छवि विवरण दर्ज करें

2- अपनी दूरस्थ और स्थानीय शाखाओं का उपयोग करके दिखाएं: git branch -a , निम्न स्क्रीनशॉट देखें

यहां छवि विवरण दर्ज करें

3- लक्ष्य शाखा पर स्विच करें, जिसे आप रिमोट से लिंक करना चाहते हैं: उपयोग करना

git चेकआउट शाखानाम

उदाहरण :

यहां छवि विवरण दर्ज करें

4- अपनी स्थानीय शाखा का उपयोग करके किसी दूरस्थ शाखा से लिंक करें:

git ब्रांच --सेट-अपस्ट्रीम-टू नाम nameOfRemoteBranch

NB: nameOfRemoteBranch : चरण 2 के उत्पादन से कॉपी करने के लिए "git Branch -r"

उपयोग का उदाहरण:

यहां छवि विवरण दर्ज करें


1
ज्यादातर आसान और सरल जवाब।
vibs2006

25

सुनिश्चित करें कि आप चलाते हैं:

git config push.default tracking

मुसीबत को मुक्त करने में सक्षम होने के लिए


1
यह सुविधाजनक हो सकता है। हालाँकि, हम यह नोट कर सकते हैं कि git-config(1)मैनुअल पेज के अनुसार , trackingइसका पर्यायवाची पर्यायवाची है upstream
FooF

23

संपादन .git/configशायद सबसे आसान और तेज़ तरीका है। वैसे भी दूरस्थ शाखाओं को संभालने के लिए Git कमांड क्या कर रहे हैं।

यदि आप फ़ाइल को हाथ से नहीं पकड़ना चाहते हैं (और यह करना उतना कठिन नहीं है), तो आप हमेशा git configइसे करने के लिए उपयोग कर सकते हैं ... लेकिन फिर, वह बस .git/configफ़ाइल को संपादित करने वाला है, वैसे भी।

बेशक, तरीके का उपयोग करके स्वचालित रूप से एक दूरस्थ शाखा को ट्रैक करते हैं git checkout( --trackउदाहरण के लिए, ध्वज को पारित करके ), लेकिन ये आदेश नई शाखाओं के साथ काम करते हैं, मौजूदा नहीं।


18

बहुत कम समय में

git branch --set-upstream yourLocalBranchName origin/develop

इससे आपका yourLocalBranchNameट्रैक रिमोट ब्रांच कहलाएगा develop


1
@ क्विंसी ग्रेग के उत्तर की जांच करें - इसके बजाय git push -u origin branch(या --set-upstream-to) का उपयोग करें
टोबियास किंजलर

@MadNik, के बीच अंतर क्या है --set-upstreamऔर --track? मुझे यह समझ में नहीं आया कि मुझे एक का उपयोग क्यों करना चाहिए।
एक्यूमेनस

15

1.6.x के लिए, इसे git_remote_branch टूल का उपयोग करके किया जा सकता है :

grb track foo upstream

यह Git को fooट्रैक बनाने का कारण बनेगा upstream/foo


12

मैं निम्नलिखित कमांड का उपयोग करता हूं (मान लीजिए कि आपकी स्थानीय शाखा का नाम "शाखा-नाम-स्थानीय" है और दूरस्थ शाखा का नाम "शाखा-नाम-दूरस्थ" है):

$ git branch --set-upstream-to=origin/branch-name-remote branch-name-local

यदि स्थानीय और दूरस्थ दोनों शाखाओं का एक ही नाम है, तो बस निम्नलिखित कार्य करें:

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

आपने कमांड लाइन पर "शाखा-नाम" और "मूल / शाखा-नाम" को उलट दिया। अपस्ट्रीम लोकल से पहले आती है।
maharvey67

@ maharvey67 आप सही हैं, धन्यवाद। उत्तर को संपादित किया।
yrazlik

यह सोना था, धन्यवाद, यह भी क्योंकि स्वीकृत उत्तर के भीतर कोई भी विकल्प ठीक नहीं है जब आपके पास शाखा नाम में स्लैश होता है
JBoy

8

यहाँ, का उपयोग कर githubऔर git version 2.1.4, बस:

$ git clone git@github.com:user/repo.git

और पुनरावृत्ति itelsef द्वारा आते हैं, भले ही स्थानीय रूप से जुड़ा न हो:

$ git remote show origin

* remote origin
  Fetch URL: git@github.com:user/repo.git
  Push  URL: git@github.com:user/repo.git
  HEAD branch: master
  Remote branches:
    develop tracked         <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    master  tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

लेकिन निश्चित रूप से, अभी भी कोई स्थानीय शाखा नहीं:

$ git branch
* master                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

देख? अब अगर आप सिर्फ डेवेलप चेक करते हैं, तो यह स्वचालित रूप से जादू करेगा:

$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'

इतना आसान!


सारांश। बस यह 2 कमांड चलाएं:

$ git clone git@github.com:user/repo.git
$ git checkout develop

1
मेरे समान उपयोग के मामले का एक उत्कृष्ट उदाहरण। स्थानीय 'विकसित' शाखा का कोई संकेत नहीं होने के बावजूद, जब मैंने 'विकसित' शाखा की जाँच की, जो शाखा प्रकट होती है और मूल रूप से दूरस्थ शाखा 'विकसित' को ट्रैक करने के लिए स्थापित की जाती है। मैं कदम से कदम उदाहरण और स्पष्टीकरण की सराहना करता हूं!
इलियट पेस्सिट


7

नई शाखा बनाने के लिए, हम निम्नलिखित कमांड का उपयोग कर सकते हैं

 git checkout - tra -b उदाहरण मूल / उदाहरण 
रिमोट के बीच लिंक बनाने के लिए पहले से ही बनाई गई शाखा के लिए फिर उस शाखा से कमांड के नीचे का उपयोग करें

 git शाखा -u मूल / दूरस्थ-शाखा-नाम


5

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

पुश.डफॉल्ट से सावधान रहें ।

पुराने गिट संस्करणों के साथ, डिफ़ॉल्ट मिलान कर रहा था , जो आपके लिए बहुत ही अवांछनीय व्यवहार का कारण होगा, उदाहरण के लिए:

स्थानीय शाखा "मास्टर" मूल / मास्टर के लिए ट्रैकिंग

दूरस्थ शाखा "अपस्ट्रीम" अपस्ट्रीम / मास्टर के लिए ट्रैकिंग

यदि आप "अपस्ट्रीम" शाखा पर "पुश पुश" करने की कोशिश करते हैं, तो पुश के साथ। ओवरलोड मिलान गिट स्वचालित रूप से स्थानीय शाखा "मास्टर" को "अपस्ट्रीम / मास्टर" में विलय करने की कोशिश करेगा, जिससे पूरी तरह से अराजकता पैदा होगी।

यह अधिक व्यवहार व्यवहार देता है:

git config --global push.default upstream


आपने इसे व्यर्थ नहीं छोड़ा। धन्यवाद।
स्टेफगोसलीन

4

किसी तरह से संबंधित तरीके से मैं एक मौजूदा शाखा में एक दूरस्थ ट्रैकिंग शाखा को जोड़ने की कोशिश कर रहा था, लेकिन उस रिमोट रिपॉजिटरी तक उस सिस्टम तक पहुंच नहीं थी जहां मैं उस रिमोट ट्रैकिंग शाखा को जोड़ना चाहता था (क्योंकि मैं अक्सर इस की एक प्रति निर्यात करता हूं रेपोइनेट के माध्यम से रेपो उस सिस्टम पर पहुंच सकता है जिसमें उस रिमोट को पुश करने की सुविधा है)। मैंने पाया कि स्थानीय पर एक दूरस्थ शाखा को जोड़ने का कोई तरीका नहीं था जिसे अभी तक नहीं लाया गया था (इसलिए स्थानीय को यह नहीं पता था कि शाखा रिमोट पर मौजूद थी और मुझे त्रुटि मिलेगी:) the requested upstream branch 'origin/remotebranchname' does not exist

अंत में मैं एक नई हेड फाइल को जोड़कर नई, पहले की अज्ञात रिमोट शाखा (लाने के बिना) में जुड़ने में कामयाब रहा .git/refs/remotes/origin/remotebranchnameऔर फिर रेफरी की नकल करते हुए (आईबॉलिंग तेज थी, लंगड़ा कर दिया; क्योंकि सिस्टम से उद्गम तक पहुंच;; कार्य केंद्र के लिए रेपो (स्थानीय रेपो के साथ जहां मैं दूरस्थ शाखा को जोड़ रहा था)।

एक बार जो हो गया, मैं तब उपयोग कर सकता था git branch --set-upstream-to=origin/remotebranchname


3

या बस द्वारा:

यदि आप पहले से ही इसमें नहीं हैं तो शाखा में जाएँ:

[za]$ git checkout branch_name

Daud

[za]$ git branch --set-upstream origin branch_name
Branch origin set up to track local branch brnach_name by rebasing.

और आप इसके लिए तैयार हैं:

 [za]$ git push origin branch_name

आप अल्फ़ाज़ फ़ाइल को देखकर देख सकते हैं कि क्या चल रहा है उसे ट्रैक कर रहा है:

 [za]$ git config -e

यह जानकर भी अच्छा लगा, यह दर्शाता है कि कौन सी शाखाएं ट्रैक की जाती हैं और कौन सी नहीं हैं। :

  [za]$ git remote show origin 

0

मेरे जैसे किसी के लिए, बस अपने स्थानीय शाखा के नाम को दूरस्थ शाखा के नाम के साथ सिंक करना चाहते हैं, यहाँ एक आसान कमांड है:

git branch -u origin/$(git rev-parse --abbrev-ref HEAD)

0

संदेश प्राप्त करने के लिए हर बार आपको क्या करना चाहिए, यह याद रखने से बचने के लिए:

कृपया निर्दिष्ट करें कि आप किस शाखा के साथ विलय करना चाहते हैं।
विवरण के लिए गिट-पुल (1) देखें।
.....

आप निम्न स्क्रिप्ट का उपयोग कर सकते हैं जो मूल उस धारा के लिए मूल रूप से सेट करता है जो आप में हैं।

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

#!/bin/bash
# scriptname: git-branch-set-originupstream
current_branch="$(git branch | grep -oP '(?<=^\* )(.*)$')"
upstream="origin/$current_branch"
git branch -u "$upstream"

-1

यह भी काम करेगा

git branch --set-upstream-to=/< remote>/< branch> < localbranch>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.