2016-05-20 11 views
5

मैं इस प्रश्न का स्पष्ट उत्तर कभी प्राप्त नहीं कर पाया।गिट: पुल बनाम fetch → खींचें

एक लंबे समय के लिए

, और एक सहकर्मी के advisement में, मैं यह कर दिया गया है:

git fetch origin 
git pull origin <mybranch> 

मुझे बताया गया है (और देखा है) कि git pull उसी तरह अगर व्यवहार न करे आप पहले git fetch नहीं करते हैं। आपको कोई रिमोट बदलाव नहीं मिलता है।

लेकिन मैं ऑनलाइन देखता हूं कि git pullgit fetch के समतुल्य git merge के बराबर है। यदि यह सच था, git pull में git fetch शामिल होगा, और मुझे पहले एक स्पष्ट git fetch की आवश्यकता नहीं होगी, है ना? लेकिन ऐसा लगता है कि यह मामला नहीं है।

तो जो कुछ मैं ढूंढ रहा हूं वह कुछ स्पष्ट दस्तावेज है जो git pull के मनाए गए व्यवहार का वर्णन करता है। (मैं मैं शायद यह भी → git mergegit fetch करने के लिए स्विच करने के लिए सलाह भी बहुत कुछ मिलेगा जानते हो, वह भी ठीक है, लेकिन मैं वास्तव में git pull में दिलचस्पी रखता हूँ।)

+1

[आधिकारिक दस्तावेज़ीकरण] (https://git-scm.com/docs/git-pull): रिमोट रिपोजिटरी से वर्तमान शाखा में परिवर्तन शामिल करता है। अपने डिफ़ॉल्ट मोड में, 'गिट पुल' 'गिट फ़ेच' के लिए शॉर्टेंड है और उसके बाद 'गिट विलय FETCH_HEAD' है। – PetSerAl

+0

अपने स्थानीय भंडार पर लागू होने से पहले नए बदलाव देखने के लिए प्राप्त करना अच्छा है। – SeinopSys

उत्तर

9

हम शायद डुप्लीकेट के रूप में यह बंद हो जाना चाहिए, लेकिन इससे पहले ऐसा होता है, मुझे देखने अगर मैं इस निचोड़ कर सकते हैं है।

जबकि git pull वास्तव में git fetchgit merge (या git rebase) द्वारा पीछा किया, सटीक अंतर में निहित है कैसेgit pull रन git fetch

विशेष रूप से:

$ git pull

या:

$ git pull remote-name branch-name

(या विभिन्न समान वेरिएंट), सादे git fetch नहीं, नहीं git fetch remote-name, लेकिन git fetch remote-name branch-name चलाता है।

इस की तुलना में यह है कि संस्करण से पहले किया था Git version 1.8.4 के बाद से, कम अंतर है,:

  • git fetch origin mastergit fetch origin विपरीत या git fetch refs/remotes/origin/master अद्यतन नहीं किया; इस एक प्रारंभिक डिज़ाइन निर्णय रिमोट ट्रैकिंग शाखाओं उम्मीद के मुताबिक की अद्यतन रखने के लिए था, लेकिन व्यवहार में यह पता चला है कि लोगों को खोजने के लिए इसे और अधिक opportunistically उन्हें अद्यतन करने के लिए जब भी हम एक मौका है, और हम उन्हें अद्यतन करने की है जब हम सुविधाजनक git push चलाएं जो वैसे भी मूल "भविष्यवाणी" को तोड़ देता है।

दूसरे शब्दों में, अगर git pullgit fetch origin master भागने का फैसला किया, इस अद्यतन करेगा में origin/master अपने भंडार-लेकिन केवल यदि आप इस तरह के कुछ अनाम लिनक्स वितरण में शामिल उन लोगों के रूप Git के प्राचीन संस्करणों नहीं चल रहे हैं।

आप git fetch origin चलाते हैं, तो आप सभी रिमोट ट्रैकिंग शाखाओं अद्यतन (बशर्ते आप एक उचित विन्यास, जो डिफ़ॉल्ट है भी में Git के प्राचीन संस्करणों कहा है) मिल जाएगा। यदि आप git fetch origin master चलाते हैं, तो आपको केवल origin/master अपडेट किया जाएगा, और फिर केवल तभी होगा जब आपका गिट बहुत हास्यास्पद रूप से पुराना न हो। चूंकि git pull चार-शब्द संस्करण चलाता है, यह केवल एक, या यहां तक ​​कि नहीं, रिमोट-ट्रैकिंग शाखाओं को अपडेट करता है।

+0

यह हो सकता है। मेरे पास अभी तक गहन परीक्षण करने के लिए मानसिक स्थान नहीं है, लेकिन यह पहली प्रतिक्रिया है जो किसी प्रकार का अंतर स्वीकार करती है। –

0

Git पुल एक एक Git मर्ज के बाद प्राप्त करना हो जाता है। (या आप --rebase विकल्प के साथ बदले में पुन: प्रयास कर सकते हैं)। तो कोई आप एक 'Git पुल'

प्रकार 'Git मदद लाने' और 'Git मदद पुल' विवरण

Git लाने के लिए पहले 'Git लाने' क्या करने की जरूरत नहीं है नामित भंडार करने के लिए चला जाता है, हो जाता है ऑब्जेक्ट जिसे संदर्भित किया जाता है (आमतौर पर एक प्रतिबद्ध), इसे और उसके सभी निर्भर वस्तुओं को प्राप्त करता है, और इसे नामित दूरस्थ ट्रैकिंग शाखा में संग्रहीत करता है। फिर आप वहां से मर्ज या रीबेस कर सकते हैं। 'Git विलय मूल/मास्टर' या तो आप सिर्फ 'Git चेकआउट मूल/मास्टर'

2

साथ यह भी देख सकते हैं मुझे बताया गया है (और देखा है) अगर तुम नहीं है कि Git पुल ही तरह से व्यवहार नहीं कर रहा है पहले गिट fetch करते हैं। आपको कोई रिमोट बदलाव नहीं मिलता है।

आमतौर पर, यह सच नहीं है, और गिट खींच राज्य को रिमोट से खींचती है।

लेकिन मैं ऑनलाइन देखता हूं कि गिट पुल गिट विलय के बराबर है, इसके बाद गिट विलय होता है। यदि यह सच था,

यह है!

वर्तमान शाखा में एक दूरस्थ रिपोजिटरी से परिवर्तन शामिल हैं:

git-pull के मैनुअल पृष्ठ का उल्लेख करते हुए। अपने डिफ़ॉल्ट मोड में, गिट पुल गिट फ़ेच के लिए शॉर्टेंड होता है जिसके बाद गिट विलय FETCH_HEAD होता है।

मुझे लगता है कि यह सुलझता है।

तो क्या मैं के लिए देख रहा हूँ कुछ स्पष्ट प्रलेखन

$ git help pull 
+0

हां, देखें, लेकिन यह _does_ अलग तरीके से व्यवहार करता है। मैं इसे पूरे दिन डुप्लिकेट कर सकता हूं। यही मैं उलझन में हूँ। –

+0

यह अलग तरीके से कैसे व्यवहार करता है? – Gregg

+0

@ जॉन एलेक्सेंडर आपके ट्रैकिंग सेटअप की तरह क्या है? 'गिट शाखा -avv' आपको दिखाएगा। हो सकता है कि आपके ट्रैकिंग रिश्ते इस तरह दिखें कि लोग यहां क्या उम्मीद कर रहे हैं। –

संबंधित मुद्दे