आप हमेशा एक विशिष्ट शाखा से कैसे खींच सकते हैं?


485

मैं एक गिट मास्टर नहीं हूं, लेकिन मैं इसके साथ कुछ समय के लिए काम कर रहा हूं, कई अलग-अलग परियोजनाओं के साथ। प्रत्येक परियोजना में, मैं हमेशा git clone [repository]और उस बिंदु से, हमेशा कर सकता git pullहूं, जब तक कि मेरे पास बकाया परिवर्तन न हों, निश्चित रूप से।

हाल ही में, मुझे पिछली शाखा में वापस जाना पड़ा, और इसके साथ ऐसा किया git checkout 4f82a29। जब मैं फिर से खींचने के लिए तैयार था, तो मैंने पाया कि मुझे अपनी शाखा को वापस मास्टर में स्थापित करना है। अब, मैं एक सीधे का उपयोग करके नहीं खींच सकता, git pullबल्कि निर्दिष्ट करना होगा git pull origin master, जो कष्टप्रद है, और मुझे इंगित करता है कि मैं पूरी तरह से समझ नहीं पा रहा हूं कि क्या चल रहा है।

वह क्या बदल गया है जो मुझे git pullमूल गुरु को निर्दिष्ट किए बिना सीधे करने की अनुमति नहीं देता है , और मैं इसे वापस कैसे बदल सकता हूं?

अपडेट करें:

-bash-3.1$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[branch "master"]
[remote "origin"]
    url = git@github.com:user/project.git
    fetch = refs/heads/*:refs/remotes/origin/*

अद्यतन 2: स्पष्ट होने के लिए, मैं समझता हूं कि मेरा मूल तरीका गलत हो सकता है, लेकिन मुझे इस रेपो को ठीक करने की आवश्यकता है ताकि मैं बस git pullफिर से उपयोग कर सकूं । वर्तमान में, गिट पुल के परिणाम:

-bash-3.1$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull  ').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.master.remote = 
    branch.master.merge = 
    remote..url = 
    remote..fetch = 

See git-config(1) for details.

मैं बता सकता हूं कि git pullकिस शाखा को विलय करना है, और यह सही तरीके से काम करता है, लेकिन यह काम git pullनहीं करता है क्योंकि यह मूल रूप से मेरे सामने आया था git checkout


आपका .it / config कैसा दिखता है? आपने उस कमिट की जाँच करने के बाद क्या किया?
रयान ग्राहम

क्या आपने 4f82a29 के शीर्ष पर किया था?
पैट नॉटज

पैट, मैंने इसके ऊपर कोई भी कमिट नहीं किया। यह एक सर्वर पर है, और हमारे द्वारा बनाए गए बग को छिपाने के लिए हमें एक स्थिर संस्करण में वापस रोल करने की आवश्यकता है। यह प्रणाली विकास के उद्देश्यों के लिए नहीं है, इसलिए मैं बस वापस रोल करना चाहता था, जबकि हमने बग को ठीक किया था, तब प्रतीक्षा करें और फिर सिर संस्करण पर वापस खींचें।
डेविड स्मिथ

2
रयान, मैंने .git / config शामिल करने के लिए अद्यतन किया है। चेकआउट के बाद, मैंने कुछ नहीं किया। यह कंप्यूटर एक सर्वर है, विकास के लिए नहीं।
डेविड स्मिथ

जवाबों:


730

के तहत [branch "master"], रेपो के Git config फाइल में निम्नलिखित को जोड़ने का प्रयास करें ( .git/config):

[branch "master"]
    remote = origin
    merge = refs/heads/master

यह Git 2 चीजों को बताता है:

  1. जब आप मास्टर शाखा पर होते हैं, तो डिफ़ॉल्ट रिमोट की उत्पत्ति होती है।
  2. git pullमास्टर शाखा पर उपयोग करते समय , कोई दूरस्थ और शाखा निर्दिष्ट नहीं होने पर, डिफ़ॉल्ट रिमोट (मूल) का उपयोग करें और दूरस्थ मास्टर शाखा से परिवर्तनों में विलय करें।

मुझे यकीन नहीं है कि यह सेटअप आपके कॉन्फ़िगरेशन से क्यों हटा दिया गया है, हालांकि। आपको उन सुझावों का पालन करना पड़ सकता है जो अन्य लोगों ने भी पोस्ट किए हैं, लेकिन यह काम कर सकता है (या कम से कम मदद)।

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

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

2
इसने मेरे लिए भी काम किया, मैंने एक प्रोजेक्ट गिथब से देखा था। मैं OS X 10.4
सैम बरनम

बहुत बहुत धन्यवाद - यह मेरे लिए एक "डेवलपर" रिपॉजिटरी और दो कंप्यूटरों के साथ एक एकल डेवलपर प्रोजेक्ट पर हुआ (जिसे मैं गड़बड़ के पहले किसी भी मुद्दे के साथ अक्सर पुश / पुल करता था), पता नहीं क्यों, लेकिन फिक्स ने काम किया ठीक!
chesterbr

1
अंडर [ब्रांच "मास्टर"] से आपका क्या मतलब है
ianj

3
@ianj: Git config फाइल में (रेपो रूट से .git/config)।
मियादी

1
@ianj: कमांड लाइन से, आप हमेशा इसके $ git config branch.master.remote origin ; git config branch.master.merge refs/heads/masterबजाय कर सकते हैं ।
मिपाड़ी

139

यदि आप चाहें, तो आप इन विकल्पों को कमैंड लाइन (कॉन्फिग फ़ाइल को संपादित करने के बजाय) के माध्यम से सेट कर सकते हैं:

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

या, यदि आप मेरे जैसे हैं, और चाहते हैं कि यह आपकी सभी परियोजनाओं में डिफ़ॉल्ट हो, जिनमें आप भविष्य में काम कर सकते हैं, तो इसे वैश्विक कॉन्फ़िगरेशन सेटिंग के रूप में जोड़ें:

  $ git config --global branch.master.remote origin
  $ git config --global branch.master.merge refs/heads/master

12
जादू शब्द "रेफ / हेड / मास्टर" जानने के लिए +1। मुझे यह पता लगाने में कोई परेशानी नहीं थी कि चर को कैसे सेट किया जाए, लेकिन इसका कोई सुराग नहीं था कि इसे क्या सेट किया जाए , और मैन पेजों की कोई मदद नहीं की गई। अंततः मुझे यह उत्तर मिलने के बाद डॉक्स में सही जगह मिली। जिज्ञासु के लिए: जादू शब्द एक फ़ाइल पथ को संदर्भित करता है .gitजिसमें git हैश masterकमिट के कोड को रखने के लिए प्रकट होता है ।
मोकस

84
git branch --set-upstream master origin/master

यह आपकी configफ़ाइल में निम्न जानकारी जोड़ेगा :

[branch "master"]
    remote = origin
    merge = refs/heads/master

यदि आपके पास है branch.autosetuprebase = alwaysतो यह भी जोड़ देगा:

    rebase = true

1
मुझे यह सबसे आसान तरीका लगता है जैसे कि git को व्यवहार करने के लिए कहा जाता है, खासकर अगर अधिक शाखाएं हैं, न कि सिर्फ रिमोट (भले ही आपको हर शाखा के लिए ऐसा करना पड़े, यह प्रति शाखा एक बार होता है)
s3v3n

2
मैंने बस यह कोशिश की, और मुझे एक दूरस्थ रिमोट होने के fatal: Not a valid object name: 'origin/master'.बावजूद त्रुटि मिलती originहै, और masterहमेशा की तरह, दोनों रिपॉज में मौजूद है।
केन विलियम्स

2
केन, आपको दूरस्थ शाखा के नाम प्राप्त करने के लिए सबसे पहले "git fetch origin" करने की आवश्यकता है।
एरिक ली

14
नए git का उपयोग करना चाहते हैं git branch --set-upstream-to=origin/master master
१be:

52

मुझे मीपडी और केसी के जवाबों के रूप में सटीक git configया git branchतर्कों को याद रखना मुश्किल है, इसलिए मैं इन 2 आदेशों का उपयोग अपस्ट्रीम संदर्भ को जोड़ने के लिए करता हूं:

git pull origin master
git push -u origin master

यह आपके .it / config में समान जानकारी जोड़ेगा, लेकिन मुझे याद रखना आसान है।


1
मैं सहमत हूँ। यह सबसे अच्छा सरलतम उत्तर होना चाहिए।
लिनबिनक्सियाकाओ

2
आपके उत्तर में यह शामिल होना चाहिए कि यह क्यों काम करता है और डॉक्स में अनुभाग का संदर्भ देता है जो बताता है कि क्यों।
vfclists

24

गिट पुल दो क्रियाओं को जोड़ती है - ट्रैक की गई शाखाओं में दूरस्थ रिपॉजिटरी से नए कमेंट लाना और फिर उन्हें अपनी वर्तमान शाखा में मर्ज करना।

जब आपने एक विशेष कमिट की जाँच की, तो आपके पास एक वर्तमान शाखा नहीं है, आपके पास केवल आपके द्वारा किए गए अंतिम कमेंट की ओर इशारा है। इसलिए git pullइसके सभी पैरामीटर निर्दिष्ट नहीं हैं। इसलिए यह काम नहीं किया।

आपकी अपडेट की गई जानकारी के आधार पर, आप जो करने की कोशिश कर रहे हैं, वह आपके रिमोट रेपो को वापस कर देगा। यदि आप बग को पेश करने वाली कमिट को जानते हैं, तो इसे संभालने का सबसे आसान तरीका है, git revertजिसके साथ एक नया कमिट दर्ज होता है जो निर्दिष्ट बग्गी को खोल देता है:

$ git checkout master
$ git reflog            #to find the SHA1 of buggy commit, say  b12345
$ git revert b12345
$ git pull
$ git push

चूंकि यह आपका सर्वर है जिसे आप बदलना चाहते हैं, इसलिए मैं मान लूंगा कि आपको छोटी-मोटी प्रतिबद्धताओं को छिपाने के लिए इतिहास को फिर से लिखने की आवश्यकता नहीं है।

यदि बग को मर्ज कमिट में पेश किया गया था, तो यह प्रक्रिया काम नहीं करेगी। देखें कैसे करने के लिए वापस लाएं एक दोषपूर्ण मर्ज


आप मुझे यहां कुछ बेहतरीन शिक्षा दे रहे हैं, जिसकी मैं सराहना करता हूं, लेकिन मैं अपनी स्थिति का बहुत अच्छी तरह से वर्णन नहीं कर सकता हूं, इसलिए यह मेरे वर्कफ़्लो के लिए एक सटीक मैच नहीं है। मैं सम्भवत: एक और प्रश्न पोस्ट करूंगा। धन्यवाद, पॉल! आप को सर।
डेविड स्मिथ

मैंने आपकी स्थिति को गलत बताया है। मुझे खुशी है कि आपको आवश्यक उत्तर मिला।
पॉल

12

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

वर्तमान कार्य निर्देशिका के ऊपर अगले भंडार के लिए:

git config branch.autosetupmerge true

सभी Git रिपॉजिटरी के लिए, जो अन्यथा कॉन्फ़िगर नहीं हैं:

git config --global branch.autosetupmerge true

जादू की तरह है, IMHO लेकिन मामलों में इस पराक्रम मदद जहां विशिष्ट शाखा है हमेशा वर्तमान शाखा

जब आपने पहली बार किसी शाखा में branch.autosetupmergeजाना trueऔर जांचना शुरू किया है, तो Git आपको संबंधित दूरस्थ शाखा को ट्रैक करने के बारे में बताएगा:

(master)$ git checkout gh-pages
Branch gh-pages set up to track remote branch gh-pages from origin.
Switched to a new branch 'gh-pages'

Git उसके बाद स्वचालित रूप से उस संबंधित शाखा को धक्का देगा:

(gh-pages)$ git push
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 1003 bytes, done.
Total 6 (delta 2), reused 0 (delta 0)
To git@github.com:bigben87/webbit.git
   1bf578c..268fb60  gh-pages -> gh-pages

10

मैं अपने git config फाइल को संपादित नहीं करना चाहता था, मैंने @ mipadi के पोस्ट में जानकारी का पालन किया और उसका उपयोग किया:

$ git pull origin master

13
बिंदु यह निर्दिष्ट करने के बजाय स्वचालित रूप से करने के लिए था।
एरिक

4

यह कैसे खींच मास्टर बनाने के लिए के अपने तत्काल सवाल, आप इसे क्या कहते हैं करने की जरूरत है। अपनी शाखा कॉन्फिग में से रिस्पेक को खींचने के लिए निर्दिष्ट करें।

[branch "master"]
    merge = refs/heads/master

कि "रेफरी / सिर / मास्टर" नहीं होना चाहिए? Git-pull (1) के अनुसार, यह रिमोट साइट पर शाखा का नाम है जो डिफ़ॉल्ट रूप से मर्ज किया जाता है।
एडम मोनसेन

हां, आप सही हैं। जिस रेपो से मैंने अपना उदाहरण लिया वह एक विशेष मामला है। सही किया।
रयान ग्राहम

0

बस कुछ जानकारी जोड़ना चाहते थे, हम इस जानकारी की जांच कर सकते हैं कि क्या git pullस्वचालित रूप से किसी शाखा को संदर्भित करता है या नहीं।

यदि आप कमांड चलाते हैं git remote show origin, (मूल को रिमोट के लिए संक्षिप्त नाम मानते हैं), git इस जानकारी को दिखाता है, कि क्या कोई डिफ़ॉल्ट संदर्भ मौजूद है git pullया नहीं।

नीचे एक नमूना आउटपुट है। (गिट प्रलेखन से लिया गया)।

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           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 pullको संदर्भित करेगाgit pull origin master

प्रारंभ में, यदि आपने रिपॉजिटरी को क्लोन किया है, तो git क्लोन का उपयोग करते हुए, इन बातों का स्वतः ध्यान रखा जाता है। लेकिन अगर आपने git रिमोट ऐड का उपयोग करके मैन्युअल रूप से रिमोट जोड़ा है, तो ये git config से गायब हैं। अगर ऐसा है, तो वह हिस्सा जहां यह दिखाता है "लोकल ब्रांच को 'गिट पुल' के लिए कॉन्फ़िगर किया गया है:", आउटपुट से गायब होगाgit remote show origin

यदि कोई कॉन्फ़िगरेशन मौजूद नहीं है git pull, तो पालन ​​करने के लिए अगले चरण पहले से ही अन्य उत्तरों द्वारा समझाया गया है।

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