मैं रिमोट ट्रैकिंग ब्रांच से 'git fetch' और 'git मर्ज' कैसे करता हूं (जैसे 'git pull')


111

मैंने कुछ दूरस्थ ट्रैकिंग शाखाएँ git में स्थापित की हैं, लेकिन मुझे लगता है कि मैंने उन्हें 'git fetch' के साथ अपडेट करने के बाद कभी भी उन्हें स्थानीय शाखा में विलय नहीं किया।

उदाहरण के लिए, मान लीजिए कि मेरी दूरस्थ शाखा है, जिसे 'अन्य-शाखा' कहा जाता है। मैं स्थानीय स्तर पर एक ट्रैकिंग शाखा के रूप में उपयोग कर रहा हूँ

git branch --track an-other-branch origin/an-other-branch

अब तक सब ठीक है। लेकिन अगर वह शाखा अपडेट हो जाती है (आमतौर पर मेरे द्वारा चलती मशीन और उस मशीन से आने वाली), और मैं इसे मूल मशीन पर अपडेट करना चाहता हूं, तो मैं भ्रूण / मर्ज की समस्या में चल रहा हूं:

git fetch origin an-other-branch
git merge origin/an-other-branch

जब भी मैं ऐसा करता हूं, मुझे 'पहले से ही अद्यतित' संदेश मिलता है और कुछ भी विलय नहीं होता है।

हालाँकि, ए

git pull origin an-other-branch

हमेशा इसे अपडेट करें जैसे आप उम्मीद करेंगे।

साथ ही, रनिंग गिट भिन्न है

git diff origin/an-other-branch

दिखाता है कि मतभेद हैं, इसलिए मुझे लगता है कि मेरा वाक्यविन्यास गलत है।

मैं क्या गलत कर रहा हूं?

EDIT [2010-04-09]: मैंने एक दो बार चेक किया है, और मैं निश्चित रूप से एक अलग शाखा पर नहीं हूं। क्या मेरे 'गिट मर्च' के बाद 'गिट मर्ज' (जैसा कि ऊपर दिखाया गया है) ठीक उसी तरह से करना चाहिए जैसे कि गिट पुल? मुझे git स्टेटस आदि के परिणाम दिखाने वाले कुछ वर्कफ़्लो मिलेंगे।

जवाबों:


170

आप एक शाखा नहीं लाते, आप एक संपूर्ण रिमोट प्राप्त करते हैं:

git fetch origin
git merge origin/an-other-branch

8
अधिक विवरण: git fetch origin an-other-branchइसमें प्राप्त टिप को संग्रहीत करता है FETCH_HEAD, लेकिन नहीं origin/an-other-branch(यानी सामान्य 'रिमोट ट्रैकिंग शाखा')। तो, कोई भी ऐसा कर सकता है git fetch origin an-other-branch && git merge FETCH_HEAD, लेकिन @ गैरेथ कहते हैं कि ऐसा करना बेहतर है (या सिर्फ गिट पुल का उपयोग करें )।
क्रिस जॉन्सन

इसलिए यदि मूल में 1000 शाखाएँ हैं, तो आप उन सभी के लिए एक दूरस्थ शाखा हैं?
गौथियर

4
ज़रूर। मैं मेरा 1000 शाखाओं के साथ एक दूरस्थ रिपोजिटरी जोड़ दिया है, और मैं पूछता हूँ क्या शाखाओं दूरस्थ है, यह अच्छी तरह बेहतर मुझे सभी 1000 देना
गैरेथ

क्या उन सभी स्थानीय शाखाओं में git merge origin/an-other-branchविलय origin/an-other-branchहो जाएगा जो इसे ट्रैक करने के लिए निर्धारित हैं? मैं केवल एक स्थानीय शाखा में कैसे विलीन हो सकता हूं?
उभयलिंगी

1
तो क्या git pull(कोई तर्क के साथ) करता है - यह किस शाखा में विलय होता है? क्या यह दूरस्थ-ट्रैकिंग शाखा को वर्तमान शाखा के अनुरूप मर्ज करता है ?
लाल मटर

69

सिर्फ एक शाखा का चयन: fetch/ merge बनाम pull

लोग अक्सर आपको "मर्जिंग" को "मर्जिंग" से अलग करने की सलाह देते हैं। वे इसके बजाय कहते हैं:

    git pull remoteR branchB

यह करो:

    git fetch remoteR
    git merge remoteR branchB

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

    git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
    git branch -a  # to verify
    git branch -t branchB remoteR/branchB

बेशक, यह हास्यास्पद रूप से याद रखने में मुश्किल है, इसलिए यदि आप वास्तव में सभी शाखाओं को लाने से बचना चाहते हैं, तो यह बेहतर है .git/configकि आप अपने प्रोगिट में वर्णित बदलाव करें ।

है ना?

इस सब का सबसे अच्छा विवरण ProGit, Git Internals - The Refspec ( या github के माध्यम से ) के अध्याय 9-5 में है । यह Google के माध्यम से खोजने के लिए आश्चर्यजनक रूप से कठिन है।

सबसे पहले, हमें कुछ शब्दावली को स्पष्ट करने की आवश्यकता है। दूरस्थ-शाखा-ट्रैकिंग के लिए, आम तौर पर 3 अलग-अलग शाखाएँ होती हैं:

  1. रिमोट रेपो पर शाखा: refs/heads/branchBअन्य रेपो के अंदर
  2. आपका रिमोट ट्रैकिंग शाखा : refs/remotes/remoteR/branchBमें अपने रेपो
  3. अपनी खुद की शाखा: अपने रेपो के refs/heads/branchBअंदर

दूरस्थ-ट्रैकिंग शाखाएं (इन refs/remotes) केवल-पढ़ने के लिए हैं। आप उन लोगों को सीधे संशोधित नहीं करते हैं। आप अपनी स्वयं की शाखा को संशोधित करते हैं, और फिर आप दूरस्थ रेपो में संबंधित शाखा को धक्का देते हैं। refs/remotesजब तक एक उपयुक्त खींच या भ्रूण के बाद परिणाम आपके परिलक्षित नहीं होता है । यह अंतर मेरे लिए मुश्किल आदमी के पन्नों से समझना मुश्किल था, मुख्यतः क्योंकि स्थानीय शाखा ( refs/heads/branchB) को .git/configपरिभाषित करते समय रिमोट-ट्रैकिंग शाखा को "ट्रैक" करने के लिए कहा जाता है branch.branchB.remote = remoteR

C ++ पॉइंटर्स के रूप में 'refs' के बारे में सोचें। शारीरिक रूप से, वे SHA-digests युक्त फाइलें हैं, लेकिन मूल रूप से वे कमिट ट्री में केवल संकेत हैं। git fetchआपके कमेंट-ट्री में कई नोड्स जोड़ देगा, लेकिन यह कैसे तय करता है कि स्थानांतरित करने के लिए संकेत थोड़ा जटिल है।

जैसा कि एक अन्य उत्तर में बताया गया है , न तो

    git pull remoteR branchB

    git fetch remoteR branchB

कदम होगा refs/remotes/branches/branchB, और बाद निश्चित रूप से स्थानांतरित नहीं कर सकता refs/heads/branchB। हालाँकि, दोनों चलते हैं FETCH_HEAD। (आप catइनमें से किसी भी फाइल को अंदर .git/से देख सकते हैं कि वे कब बदलते हैं।) और सेटिंग करते समय , आदि काgit merge उल्लेख करेंगे FETCH_HEADMERGE_ORIG


1
क्या आप जानते हैं कि Git Internals का आपका लिंक इसी प्रश्न का लिंक है?
शाहबाज

9

क्या आप वाकई स्थानीय हैं an-other-branchजब आप विलय करते हैं?

git fetch origin an-other-branch
git checkout an-other-branch
git merge origin/an-other-branch

अन्य विवरण :

जिस शाखा में आप विलय करने का प्रयास कर रहे हैं, उसके सभी परिवर्तन पहले से मौजूद शाखा में विलय हो चुके हैं।
अधिक विशेष रूप से इसका मतलब है कि जिस शाखा को आप विलय करने की कोशिश कर रहे हैं वह आपकी वर्तमान शाखा का एक माता-पिता है

यदि आप रिमोट रेपो से एक कमिट से आगे हैं, तो यह रिमोट रेपो है जो आप से बाहर है, आप नहीं।

लेकिन आपके मामले में, अगर git pullकाम करता है , तो इसका मतलब है कि आप सही शाखा पर नहीं हैं।


3

Git पुल वास्तव में एक कॉम्बो टूल है: यह git fetch (बदलावों को प्राप्त करता है) और git मर्ज (उन्हें आपकी वर्तमान कॉपी के साथ मर्ज करता है) चलाता है

क्या आप वाकई सही शाखा पर हैं?


मुझे लगता है कि ओपी अंतर में है। शाखा, मेरे साथ होता है।
चकलादार असफाक आरिफ़

1

ये आदेश हैं:

git fetch origin
git merge origin/somebranch somebranch

यदि आप दूसरी पंक्ति में ऐसा करते हैं:

git merge origin somebranch

यह स्थानीय मास्टर को आपकी वर्तमान शाखा में विलय करने का प्रयास करेगा।

यह सवाल, जैसा कि मैंने समझा है, क्या आप पहले से ही स्थानीय रूप से प्रचलित थे और अब अपनी शाखा को उसी शाखा के नवीनतम में विलय करना चाहते हैं ।

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