मूल से खींचते समय "गिट पुल" कमांड के बीच अंतर?


82

इन आदेशों में क्या अंतर हैं ?:

# 1
git pull
# 2
git pull origin
# 3
git pull origin master
# 4
git pull origin/master
# 5
git pull origin HEAD:master

वैसे, मैन पेज पढ़ने के बाद भी, यह सभी मामलों में स्पष्ट नहीं है कि वास्तव में क्या होता है। उदाहरण के लिए: git pullकॉन्फ़िगर अपस्ट्रीम के बिना क्या अर्थ है ? (मैन पेज केवल कॉन्फ़िगर अपस्ट्रीम होने के लिए डिफ़ॉल्ट बताता है।)
michas

संक्षेप में: 1. वर्तमान शाखा के लिए एक कॉन्फ़िगरेशन के बिना विफल हो जाएगा और अन्यथा जैसा होगा 2. दूरस्थ नाम के साथ। 2. दिए गए दूरस्थ (और पहले वाले को मर्ज करने के लिए) डिफॉल्ट फ़्रेच कॉन्फ़िगरेशन का उपयोग करेगा, जबकि 3. में आप निर्दिष्ट करते हैं कि क्या लाना है और मर्ज करना है। 4. अमान्य है, इमो। 5. (यदि यह काम करता है), दूरस्थ HEAD को refs / remotes / मूल / मास्टर में डाल देगा और विलय करेगा।
andi5

2
इस प्रश्न को फिर से खोलने की कोशिश करना, क्योंकि दुर्भाग्य से, यह खोज परिणामों में से एक है site:stackoverflow.com git Difference "git pull" "git pull origin master"

जवाबों:


81

git pullएक सुविधा कमांड है, जो एक ही समय में अलग-अलग चीजें कर रहा है। मूल रूप से यह केवल एक संयोजन है git fetch, जो दूरस्थ रिपॉजिटरी से जुड़ता है और नए कमिट लाता है, और git merge(या git rebase) जो आपके स्थानीय ब्रांच में नए कमिट को शामिल करता है। दो अलग-अलग आदेशों की वजह से अर्थ git pullहमेशा स्पष्ट नहीं होता है।

आप एक स्थानीय शाखा के लिए एक अपस्ट्रीम कॉन्फ़िगर कर सकते हैं। एक ताजा क्लोन के बाद आपके पास एक स्थानीय शाखा "मास्टर" होगी, एक दूरस्थ "मूल" और आपकी मास्टर शाखा में "मूल / मास्टर" अपस्ट्रीम होगा। मैं नीचे इस सेटअप मान। (आप अपने अपस्ट्रीम कॉन्फ़िगरेशन git branch -vvको .git / config को देखकर या उसके साथ देख सकते हैं ।)

अब आपके सवालों के लिए:

  1. git pull= git fetch origin+ git merge origin/master(या जो भी आपका अपस्ट्रीम है)
  2. git pull origin= git pull(जब तक मूल आपके अपस्ट्रीम रिमोट है)
  3. git pull origin master= git fetch origin master+git merge FETCH_HEAD
  4. git pull origin/master : अमान्य जब तक कि आपके पास "मूल / मास्टर" नामक रिमोट न हो
  5. git pull origin HEAD:master: जो भी उत्पत्ति को इंगित करता है, आपको स्थानीय मास्टर को सीधे रीसेट करने की कोशिश करता है। (यह मत करो।)

2
क्यों git pull origin HEAD:masterएक बुरे विचार को क्रियान्वित कर रहा है?
रियान एडवर्ड्स

2
दाईं ओर एक दूरस्थ शाखा माना जाता है। मैन पेज में चेतावनी देखें। सुनिश्चित करें कि आप जानते हैं कि यदि आप इसका उपयोग कर रहे हैं तो आप क्या कर रहे हैं।
23

अगर मैं किसी तरह की शाखा में था, तो git pullउस शाखा या मास्टर को खींच
लेगा

1
@aWebDeveloper: पूर्णता के लिए: git pull origin HEAD:masterअनिवार्य रूप से (शाब्दिक रूप से जब तक स्क्रिप्ट को Git 2.6 में C को फिर से नहीं लिखा गया था) उस HEAD:masterहिस्से को पास करता है git fetch, इसलिए यह git fetchउस कदम के लिए क्या करता है; उसके बाद विलय या विद्रोह करने के लिए प्रतिबद्ध git fetchकदम का उपयोग कर दिया है । Refspecs स्रोत हैं: भाग्य , इसलिए HEADअन्य Git को अनुवाद करने के लिए दिया गया है। तो यह अन्य Git तक है - लेकिन आमतौर पर दूसरे Git का HEADनाम इसके लिए है master। यदि आप अपने दम पर नहीं हैं master, तो मर्ज-या-रिबास आपके फ़िंच-अपडेटेड master( डेस्ट ) (जब तक fetchविफल नहीं होता है) का उपयोग करता है।
torek

1
एक और बात के बारे में सावधान रहना: कभी नहीं git pull origin br1 br2। यह दिखता है और ऐसा लगता है git checkout br1; git pull origin; git checkout br2; git pull origin- लेकिन यह नहीं होना चाहिए ! इसके बजाय, वास्तव में, यह करता है:, git fetch origin && git merge origin/br1 origin/br2जो आपके वर्तमान शाखा में दोनों परिणाम प्राप्त करता है , कुछ गिट एक ऑक्टोपस मर्ज कहता है । यह कभी किसी को नहीं चाहिए। संभवतः कमांड को पूरी तरह से अस्वीकार कर देना चाहिए (जो कोई भी वास्तव में यह चाहता है कि वह पहले ला सकता है, फिर मर्ज कर सकता है)। git pull
torek

18

A pullमूल रूप से एक है fetch(जो कि रिमोट में भंडार से कुछ कमिट और संबंधित वस्तुएं प्राप्त करता है) और फिर एक ऑपरेशन जो इनको आपकी वर्किंग कॉपी में "लागू करता है"। दूसरा चरण डिफ़ॉल्ट रूप से होता है, mergeलेकिन इसका उपयोग करके आप pull.rebaseचर को सेट कर सकते हैं trueऔर फिर इसके बजाय इसे रीबेस कर सकते हैं।

दो प्रश्न हैं जो pullकमांड के साथ पॉप अप करते हैं । पहला है, वास्तव में क्या मिलता है? और दूसरा यह है कि यह मेरी कार्य प्रति में इन परिवर्तनों को कैसे लागू करता है? पहले से शुरू करते हैं। कमांड का फुल फॉर्म है

git pull [options] [repository] [<refspec>...]

optionsझंडे कि नियंत्रण व्यवहार (जैसे --rebase बनाने के लिए कर रहे हैं pullएक के रूप में काम fetch+ rebaseभले ही pull.rebaseहै false)।

repository से लाने के लिए रिमोट का नाम (या URL) है।

refspecs निर्दिष्ट करने का एक सुसंगत तरीका है कि आप रिमोट पर कौन से संदर्भ लाना चाहते हैं और आप उन्हें अपनी वर्तमान कार्य प्रतिलिपि में कहां रखना चाहते हैं।

सबसे पहले स्पष्ट रूप लेते हैं।

 git pull origin branch1:branch2

यह मूल रूप से कहता है, branch1दूरस्थ नाम के संदर्भ में परिवर्तन को खींचें originऔर फिर उन्हें स्थानीय शाखा में मर्ज (या रिबेस) करें branch2। यदि मैं, उदाहरण के लिए, कहूं git pull origin master:dev, तो मुझे एक स्थानीय शाखा मिल जाएगी, devजो उसी तरह की प्रतिबद्धता की ओर इशारा करेगी master। कैसे refspecs निर्दिष्ट करने के विवरण यहाँ हैं । आप एक *से अधिक Refspecs को इंगित करने के लिए उपयोग कर सकते हैं । उदाहरण के लिए, git pull origin refs/heads/*:refs/heads/*सभी शाखाओं को ( headsस्थानीय में) भंडार में रखा जाएगा और उन्हें उसी नाम से स्थानीय शाखाओं में मिला दिया जाएगा।

अब, डिफ़ॉल्ट रूप से कैसे काम करते हैं, इस पर चर्चा करने के लिए एक-एक करके तर्कों को हटा दें। सबसे पहले, हम अपने रिफस्पेक से गंतव्य को हटा सकते हैं और बस कह सकते हैं git pull origin branch1। यह आपके स्थानीय भंडार में fetchसबसे पहले दूरस्थ शाखा होगी branch1। यह एक अस्थायी संदर्भ के रूप में उपलब्ध होगा जिसे कहा जाता है FETCH_HEAD। उसके बाद, यह चलेगा git merge FETCH_HEADजो इस शाखा को आपकी वर्तमान सक्रिय शाखा (यानी HEAD) में विलय कर देगा । ऐसा अक्सर तब होता है जब आप किसी स्थानीय शाखा में होते हैं और उस शाखा में दूरस्थ से परिवर्तन लाना चाहते हैं।

अब, चलो branch1पूरी तरह से और बस कहते हैं git pull origin। अब, गिट कहाँ से लाने के लिए जानता है ( origin) लेकिन पता नहीं है कि क्या लाने के लिए। इसके लिए कुछ चूक हैं। सबसे अधिक परिदृश्य तब होता है जब आपकी कॉन्फ़िग फ़ाइल में एक branch.<name>.mergeविकल्प होता है (यह एक प्रविष्टि है जिसे mergeअनुभाग के अंदर कहा जाता है [branch "master"])। यदि हां, तो यह ऑपरेशन के लिए वहां के रीस्पेक का उपयोग करेगा।

यदि हम originपूरी तरह से छोड़ देते हैं और बस कहते हैं git pull, तो यह देखने के लिए कॉन्फ़िगर करेगा कि क्या कोई branch.<name>.remoteनिर्दिष्ट करता है कि किस रिमोट से खींचना है। कि ऊपर के साथ आपको बताता है कि क्या खींचना है।

आपके अंक # 4 और # 5 सामान्य उपयोग के मामले नहीं हैं। यदि आपके पास एक रिमोट है, जिसे पहले बुलाया जाता है origin/master, तो यह संभव नहीं है। origin/masterहै आम तौर पर एक स्थानीय संदर्भ कि पटरियों masterरिमोट पर शाखा origin। दूसरा HEADदूरस्थ (डिफ़ॉल्ट शाखा जो आमतौर पर है master) पर परिवर्तन लाने की कोशिश करेगा और फिर उन्हें आपके स्थानीय में विलय कर देगा master। हालांकि यह कुछ ऐसा हो सकता है जिसे आप नियमित रूप से करना चाहते हैं, कमांड काफी अपरंपरागत है और कुछ ऐसा नहीं है जो मैंने अक्सर देखा है।

मैंने कुछ विवरणों को छोड़ दिया है, लेकिन ये आपके दैनिक कार्य में आपको सुरक्षित और आरामदायक रखने के लिए पर्याप्त होना चाहिए। सभी गोरी विवरणों के लिए, आप मैन्युअल पृष्ठ की जांच कर सकते हैं git pull


"यदि मैं, उदाहरण के लिए, गिट पुल ओरिजिनल मास्टर कहता हूं: देव, मुझे एक स्थानीय शाखा मिलेगी, जिसे देव कहा जाता है, जो गुरु के समान वचन को इंगित करेगा।" तो आप देव नामक एक नई शाखा डाउनलोड करेंगे और यह मास्टर को इंगित करेगा?
user33276346

नहीं, आपको masterरिमोट से शाखा मिलेगी लेकिन इसे devस्थानीय स्तर पर कहा जाएगा ।
नौफाल इब्राहिम

git pull origin refs/heads/*:refs/heads/*मेरे लिए काम नहीं किया, और मुझे मिल गया no matches found: refs/heads/*:refs/heads/*। मैंने भी कोशिश की git pull origin refs/remotes/origin/*:refs/heads/*, लेकिन वह भी काम नहीं किया। मुझे नहीं लगता कि एक कमांड में रिमोट पर सभी शाखाओं को खींचना संभव है, और न ही इन सभी शाखाओं को उनके बाद की स्थानीय शाखाओं में विलय / रिबासिंग करना है।
बेन बटरवर्थ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.