GitHub से Git एक निश्चित शाखा खींचती है


630

मेरे पास कई शाखाओं के साथ एक परियोजना है। मैं उन्हें GitHub पर धकेल रहा हूं , और अब जब कोई और उस परियोजना पर काम कर रहा है जिसे मुझे GitHub से अपनी शाखाएं खींचने की जरूरत है। यह मास्टर में ठीक काम करता है। लेकिन कहते हैं कि किसी ने एक शाखा बनाई xyz। मैं xyzGitHub से शाखा कैसे खींच सकता हूं और इसे xyzमेरी शाखा में विलय कर सकता हूं localhost?

मेरा वास्तव में यहाँ मेरा जवाब है: Git में शाखाओं को धक्का और खींचें

लेकिन मुझे एक त्रुटि मिलती है "[खारिज]" और "नॉन फास्ट फॉरवर्ड" के बारे में कुछ।

कोई सुझाव?


3
वह वास्तविक कमांड क्या है जिसे आप चला रहे हैं?
एलेक्स एन।

1
यह 'गैर-फास्ट फ़ॉरवर्ड' संदेश के साथ विफल हो सकता है। क्या आपने रिमोट-ट्रैकिंग शाखा (मूल / xyz) को संशोधित किया था, या दूरस्थ रिपॉजिटरी में शाखा को फिर से लिखा / फिर से लिखा गया था? Youmight को " git fetch origin --force" उपयोग करने की आवश्यकता है , लेकिन कृपया इसे करने से पहले प्रलेखन पढ़ें।
याकूब नारबस्की

जवाबों:


755

लेकिन मुझे एक त्रुटि मिलती है "[खारिज]" और "नॉन फास्ट फॉरवर्ड" के बारे में कुछ

ऐसा इसलिए है क्योंकि Git शाखाओं से परिवर्तन को आपके वर्तमान मास्टर में विलय नहीं कर सकता है। मान लीजिए कि आपने शाखा की जाँच कर ली है master, और आप दूरस्थ शाखा में विलय करना चाहते हैं other-branch। जब आप ऐसा करते हैं:

$ git pull origin other-branch

Git मूल रूप से यह कर रहा है:

$ git fetch origin other-branch && git merge other-branch

यही है, एक pullबस एक के fetchबाद एक है merge। हालाँकि, जब-जब pull, Git तभी विलीन होगा other-branch यदि यह तेजी से अग्रेषित मर्ज कर सकता है। एक तेज़-फ़ॉर- मर्ज एक मर्ज है जिसमें जिस शाखा का आप विलय करने का प्रयास कर रहे हैं उसका प्रमुख उस शाखा के प्रमुख का प्रत्यक्ष वंशज है जिसे आप मर्ज करना चाहते हैं। उदाहरण के लिए, यदि आपके पास यह इतिहास का पेड़ है, तो विलय के other-branchपरिणामस्वरूप तेजी से आगे विलय होगा:

O-O-O-O-O-O
^         ^
master    other-branch

हालाँकि, यह तेजी से आगे बढ़ने वाला मर्ज नहीं होगा :

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

अपनी समस्या को हल करने के लिए, पहले लाने दूरदराज के शाखा:

$ git fetch origin other-branch

फिर इसे अपनी वर्तमान शाखा में मर्ज करें (मैं मान लूंगा master), और किसी भी मर्ज टकराव को ठीक करें:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!

नहीं, समस्या मर्जिंग के साथ है, मर्ज स्टेप के साथ नहीं।
याकूब नारबस्की 22

3
आम तौर पर, रीमोट ऐसे सेट किए जाते हैं कि भ्रूण को मजबूर किया जाता है, भले ही वे एक फास्ट-फॉरवर्ड कमिट में परिणाम न करें, इसलिए यह तब तक नहीं होना चाहिए जब तक कि ओपी सामान्य कॉन्फ़िगरेशन के साथ कुछ बदल न जाए। फास्ट-फ़ॉरवर्ड समस्या भ्रूण या मर्ज के दौरान हो सकती है । आप क्या कहते हैं कि समस्या निश्चित रूप से लाने में है, न कि विलय में?
मियादी

मैं इन चरणों (भ्रूण, मर्ज) का पालन करता हूं। Git बताता है कि मुझे कुछ नहीं करना है। जब मैं कमिट करने की कोशिश करता हूं, तो वह तेजी से आगे की ओर कराहती है।
जीन जोर्डन

1
@mipadi मेरे पास जीन के रूप में एक ही मुद्दा था और जब तक मैं यह नहीं कह सकता कि रिमोट गैर-डिफ़ॉल्ट तरीके से सेटअप है जिसका आपने उल्लेख किया है मैं कह सकता हूं कि git fetch -fमेरे मुद्दे को तय कर दिया है! धन्यवाद!
cregox

1
यह दूरस्थ शाखा xzyको स्थानीय शाखा masterमें मिला देता है, जो कि मूल प्रश्न से निहित नहीं है; "मैं गिटहब से शाखा xyz को कैसे खींच सकता हूं और इसे मेरे स्थानीयहोस्ट पर शाखा xyz में विलय कर सकता हूं?"
उपयोगकर्ता 5359531 21

301

बस अपनी दूरस्थ शाखाओं को स्पष्ट रूप से ट्रैक करें और एक सरल git pullवही करें जो आप चाहते हैं:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

उत्तरार्द्ध एक स्थानीय ऑपरेशन है।

या फोर्किंग पर GitHub प्रलेखन के साथ और भी अधिक फिटिंग :

git branch -f new_local_branch_name upstream/remote_branch_name

39
यदि आपको 'वैध वस्तु का नाम नहीं:' मूल / Remote_branch_name 'मिलता है, तो पहले' git fetch origin 'करें।
मार्टिन कोनिसक

130

आप निम्न आदेशों के साथ एक शाखा को एक शाखा खींच सकते हैं।

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

जब आप मास्टर ब्रांच पर होते हैं तो आप पहले एक ब्रांच चेकआउट कर सकते हैं जैसे:

git checkout -b xyz

यह मास्टर से एक नई शाखा, "xyz" बनाता है, और सीधे इसकी जांच करता है।

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

git pull origin xyz

यह नई शाखा को आपकी स्थानीय xyzशाखा तक खींचता है ।


1
उत्तम! मुझे अभी यह नहीं पता था कि वाक्य रचना: git pull {repo} {remotebranchname}: {localbranchname}। प्रश्न, अगर वह पुल काम नहीं करता है (हो सकता है कि किसी ने शाखा को अपडेट किया हो और मर्ज का टकराव होगा) मेरे विकल्प क्या हैं?
कोस्टा

7
मैं इसे नीचा दिखा रहा हूं क्योंकि यह दूरस्थ शाखा को आपकी वर्तमान शाखा (जैसे मास्टर) में विलय करने का प्रयास करता है। यह वह नहीं है जो ज्यादातर लोग करना चाहते हैं, और यह वह नहीं है जो ओपी ने पूछा है। @Mohit द्वारा उत्तर सही विकल्प है।
फोग्ज

1
फ्रॉग्ज - इस व्यवहार को गिट के हाल के संस्करणों में बदला हुआ लगता है। मैंने पहले भी इसका इस्तेमाल किया था और इसने पूरी तरह से काम किया है।
पवन

88

सबसे अच्छा तरीका है:

git checkout -b <new_branch> <remote repo name>/<new_branch>

1
गिटहब पर एक नई "देव" शाखा बनाने के बाद, और ऊपर की कोशिश करने पर, मुझे निम्नलिखित त्रुटि संदेश मिला: "घातक: मूल / देव एक प्रतिबद्ध नहीं है और एक शाखा 'देव' इससे नहीं बनाई जा सकती है" समाधान "करने के लिए था नीचे ब्रैडली फ्लड के समाधान के अनुसार, और फिर मोहित के उत्तर को फिर से चलाएं।
टॉमबर्ड

46

git fetch शाखाओं की नवीनतम सूची हड़प लेंगे।

अब आप कर सकते हैं git checkout MyNewBranch

किया हुआ :)


अधिक जानकारी के लिए डॉक्स देखें: git fetch


37

मुझे यकीन नहीं है कि मैं पूरी तरह से समस्या को समझता हूं, लेकिन एक मौजूदा शाखा को खींचना इस तरह से किया जाता है (कम से कम यह मेरे लिए काम करता है :)

git pull origin BRANCH

यह मानकर चल रहा है कि आपकी स्थानीय शाखा उत्पत्ति / शाखा से बनी है।



8

सीधे शब्दों में कहें, यदि आप शाखा GitHub से खींचना चाहते हैं the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want

3
git pull <gitreponame> <branchname>

आमतौर पर यदि आपने केवल अपने कोड को रेपो सौंपा है तो gitreponame मूल होगा।

यदि आप दो रेपो पर काम कर रहे हैं जैसे एक स्थानीय है और दूसरा रिमोट के लिए जैसे आप रीटो की सूची git रिमोट -v से देख सकते हैं । यह दिखाता है कि कितने रेपो आपके वर्तमान कोड को असाइन किए गए हैं।

BranchName संगत gitreponame में मौजूद होना चाहिए।

रेपो को हटाने या हटाने के लिए आप दो आदेशों का उपयोग कर सकते हैं

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>

2

आप भी कर सकते हैं

git pull -r origin master

यदि कोई हो, तो मर्ज संघर्ष को ठीक करें

git rebase --continue

-r रिबास के लिए है। यह आपको शाखा संरचना बना देगा

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

सेवा

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

यह एक क्लीनर इतिहास का नेतृत्व करेगा। नोट: यदि आपने अपनी दूसरी-शाखा को मूल (या किसी अन्य दूरस्थ) पर धकेल दिया है, तो आपको अपनी शाखा को बलवा के बाद धकेलना पड़ सकता है।

git push -f origin other-branch

1

मैंने किया

git branch -f new_local_branch_name origin/remote_branch_name

के बजाय

git branch -f new_local_branch_name upstream/remote_branch_name

जैसा कि @innaM द्वारा सुझाया गया है। जब मैंने अपस्ट्रीम संस्करण का उपयोग किया, तो उसने कहा 'घातक: मान्य वस्तु का नाम नहीं:' अपस्ट्रीम / Remote_branch_name ''। मैंने git fetch originसुझाए गए एक टिप्पणी के रूप में नहीं किया , लेकिन इसके बजाय बस के upstreamसाथ बदल दिया origin। मुझे लगता है कि वे समान हैं।


0

GitHub से शाखा खींचने के लिए आप उपयोग कर सकते हैं

git checkout --track origin/the-branch-name

सुनिश्चित करें कि शाखा का नाम बिल्कुल समान है।

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