सरल शब्दों में, यदि आप किसी भी इंटरनेट कनेक्शन के बिना एक विमान पर चढ़ने वाले थे ... प्रस्थान करने से पहले आप बस कर सकते थे git fetch origin <master> । यह आपके कंप्यूटर के सभी परिवर्तनों को प्राप्त कर लेगा, लेकिन इसे आपके स्थानीय विकास / कार्यक्षेत्र से अलग रखेगा।
विमान पर, आप अपने स्थानीय कार्यक्षेत्र में परिवर्तन कर सकते हैं और फिर इसे अपने साथ मिला सकते हैं जो आपने प्राप्त किया है और इंटरनेट के कनेक्शन के बिना संभावित मर्ज संघर्ष को हल करता है। और जब तक किसी ने दूरस्थ रिपॉजिटरी में नए परस्पर विरोधी परिवर्तन नहीं किए थे, तब एक बार जब आप गंतव्य पर पहुंच git push origin <branch>जाते हैं तो आप अपनी कॉफी प्राप्त कर लेते हैं।
इस भयानक एटलसियन ट्यूटोरियल से :
git fetchआदेश डाउनलोड कमिट, फाइल और refs अपने स्थानीय भंडार में एक दूरस्थ रिपोजिटरी से।
फ़ेचिंग वह है जो आप तब करते हैं जब आप यह देखना चाहते हैं कि बाकी सभी लोग किस पर काम कर रहे हैं। यह एसवीएन अपडेट के समान है, यह आपको यह देखने की सुविधा देता है कि केंद्रीय इतिहास कैसे आगे बढ़ा है, लेकिन यह आपको वास्तव में अपने रिपॉजिटरी में परिवर्तनों को मर्ज करने के लिए मजबूर नहीं करता है। Git मौजूदा स्थानीय सामग्री के रूप में भ्रूण की सामग्री को अलग करती है , इसका आपके स्थानीय विकास कार्यों पर बिल्कुल
कोई प्रभाव नहीं पड़ता है । प्राप्त सामग्री का उपयोग करके स्पष्ट रूप से जाँच की जानी हैgit checkout कमांड । यह आपके स्थानीय रिपॉजिटरी के साथ एकीकरण करने से पहले कमिट की समीक्षा करने का एक सुरक्षित तरीका लाती है।
दूरस्थ रिपॉजिटरी से सामग्री डाउनलोड करते समय, git pullऔर git fetchकमांड कार्य को पूरा करने के लिए उपलब्ध हैं। आप git fetchदो आदेशों के 'सुरक्षित' संस्करण पर विचार कर सकते हैं
। यह दूरस्थ सामग्री को डाउनलोड करेगा, लेकिन आपके वर्तमान कार्यशील स्थिति को छोड़कर, अपने स्थानीय भंडार की कार्यशील स्थिति को अद्यतन नहीं करेगा। git pullअधिक आक्रामक विकल्प है, यह सक्रिय स्थानीय शाखा के लिए दूरस्थ सामग्री को डाउनलोड करेगा और git mergeनई दूरस्थ सामग्री के लिए मर्ज कमिट बनाने के लिए तुरंत निष्पादित करेगा। यदि आपके पास प्रगति में लंबित परिवर्तन हैं, तो यह संघर्ष का कारण बनेगा और मर्ज संघर्ष रिज़ॉल्यूशन प्रवाह को किकऑफ़ करेगा।
के साथ git pull:
- आपको कोई अलगाव नहीं मिलता है।
- यह आपके स्थानीय विकास को प्रभावित करता है।
- इसे स्पष्ट रूप से जांचने की आवश्यकता नहीं है। क्योंकि यह निहित रूप से एक है
git merge।
- यह मूल रूप से सुरक्षित नहीं है। यह आक्रामक है।
- इसके विपरीत
git fetchजहां यह केवल आपके को प्रभावित करता है .git/refs/remotes, गिट पुल आपके और दोनों को प्रभावित करेगा.git/refs/remotes .git/refs/heads/
हम्मम ... इसलिए अगर मैं साथ काम की कॉपी अपडेट नहीं कर रहा हूं git fetch, तो मैं कहां बदलाव कर रहा हूं? Git लाने के लिए नए कमिट कहाँ से लाएँ?
बड़ा सवाल है। यह कहीं न कहीं इसे आपकी वर्किंग कॉपी से अलग कर देता है। लेकिन फिर कहां? चलो पता करते हैं।
अपनी परियोजना निर्देशिका में (यानी, जहाँ आप अपनी gitआज्ञाएँ करते हैं) करते हैं:
ls। यह फाइलों और निर्देशिकाओं को दिखाएगा। कुछ भी नहीं, मुझे पता है।
अब करते हैं ls -a। यह दिखा देंगे डॉट फ़ाइलें , यानी, के साथ शुरुआत फ़ाइलों .इसके बाद आप नाम के एक निर्देशिका देखने के लिए सक्षम हो जाएगा: .git।
- करते हैं
cd .git। यह स्पष्ट रूप से आपकी निर्देशिका को बदल देगा।
- अब मज़े वाला हिस्सा आया; करते हैं
ls। आपको निर्देशिकाओं की एक सूची दिखाई देगी। हम ढूंढ रहे हैं refs। करते हैं cd refs।
- यह देखना दिलचस्प है कि सभी निर्देशिकाओं के अंदर क्या है, लेकिन आइए उनमें से दो पर ध्यान केंद्रित करें।
headsऔर remotes। cdउनके अंदर भी जांच करने के लिए उपयोग करें ।
- जो भी
git fetch आप करते हैं वह /.git/refs/remotesनिर्देशिका में आइटम को अपडेट करेगा । यह /.git/refs/headsनिर्देशिका में कुछ भी अद्यतन नहीं करेगा ।
- कोई भी
git pull पहले डायरेक्टरी करेगा, डायरेक्टरी git fetchमें आइटम अपडेट करेगा /.git/refs/remotes, फिर अपने लोकल में मर्ज करेगा और फिर /.git/refs/headsडायरेक्ट्री के अंदर हेड को बदल देगा ।
एक बहुत अच्छा संबंधित जवाब यह भी पाया जा सकता है कि 'गिट भ्रूण' कहाँ पर है? ।
इसके अलावा, Git शाखा के नामकरण सम्मेलनों के बाद "स्लैश नोटेशन" देखें । यह आपको बेहतर तरीके से समझने में मदद करता है कि Git विभिन्न निर्देशिकाओं में चीजों को कैसे रखता है।
वास्तविक अंतर देखने के लिए
बस करो:
git fetch origin master
git checkout master
यदि दूरस्थ मास्टर अपडेट किया गया था, तो आपको इस तरह एक संदेश मिलेगा:
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
यदि आपने नहीं किया fetchऔर अभी-अभी किया है git checkout masterतो आपके स्थानीय git को यह नहीं पता होगा कि 2 कमिट जोड़े गए हैं। और यह सिर्फ कहना होगा:
Already on 'master'
Your branch is up to date with 'origin/master'.
लेकिन यह पुराना और गलत है। ऐसा इसलिए है क्योंकि git आपको पूरी तरह से फीडबैक देगा कि यह क्या जानता है। यह नया है कि यह अभी तक नीचे नहीं खींचा है के लिए बेखबर है ...
क्या स्थानीय रूप से शाखा पर काम करते समय रिमोट में किए गए नए परिवर्तनों को देखने का कोई तरीका है?
कुछ IDE (जैसे Xcode) सुपर स्मार्ट होते हैं और परिणाम का उपयोग करते हैं git fetchऔर कोड की उन पंक्तियों को एनोटेट कर सकते हैं जिन्हें आपकी वर्तमान कार्यशील शाखा के दूरस्थ शाखा में बदल दिया गया है। यदि उस लाइन को स्थानीय परिवर्तन और दूरस्थ शाखा दोनों द्वारा बदल दिया गया है, तो वह रेखा लाल रंग से एनोटेट हो जाती है। यह मर्ज संघर्ष नहीं है। यह एक संभावित मर्ज संघर्ष है। यह एक हेडअप है जिसका उपयोग आप git pullदूरस्थ शाखा से करने से पहले भविष्य में मर्ज संघर्ष को हल करने के लिए कर सकते हैं ।

मज़ा टिप:
यदि आपने एक दूरस्थ शाखा प्राप्त की है जैसे कि:
git fetch origin feature/123
फिर यह आपके रीमोट डायरेक्टरी में जाएगा। यह अभी भी आपके स्थानीय निर्देशिका के लिए उपलब्ध नहीं है। हालाँकि, यह DWIM द्वारा उस दूरस्थ शाखा में आपके चेकआउट को सरल बनाता है (मेरा क्या मतलब है):
git checkout feature/123
अब आपको ऐसा करने की आवश्यकता नहीं है:
git checkout -b feature/123 origin/feature/123
उस पर और अधिक के लिए यहां पढ़ें