गिट रिमोट अपडेट और लाने के बीच अंतर?


जवाबों:


112

अद्यतन: अधिक जानकारी!

मुझे शुरू से ही ऐसा करना चाहिए था: मैंने गिट के गिट रेपो (इसलिए मेटा!) में जीआईटी रिलीज़ नोट्स को हटा दिया।

grep --color=always -R -C30 fetch Documentation/RelNotes/* | less

तब मैंने एक lessखोज की --all, और यह मुझे Git संस्करण 1.6.6 के रिलीज़ नोट्स के तहत मिला :

git fetchसीखा --allऔर --multipleविकल्प, कई रिपोजिटरी से लाने के लिए, और --pruneबासी चले गए दूरस्थ ट्रैकिंग शाखाओं को हटाने का विकल्प। ये बनाते हैं git remote updateऔर git remote pruneकम आवश्यक होते हैं ( remote updateन ही हटाने की कोई योजना है remote prune, हालांकि)।

संस्करण 1.6.6 को 23 दिसंबर 2009 तक जारी नहीं किया गया था , और मूल पोस्टर ने 6 दिसंबर 2009 को अपना प्रश्न पूछा था।

तो जैसा कि आप जारी नोटों से देख सकते हैं, गिट के लेखकों को इस तथ्य के बारे में पता git remote updateथा कि कमांड कार्यक्षमता को कुछ हद तक दोहराया जा रहा था git fetch, लेकिन उन्होंने इसे हटाने का फैसला किया, शायद मौजूदा स्क्रिप्ट और कार्यक्रमों के साथ पिछड़े संगतता के लिए, या शायद इसलिए। यह बहुत अधिक काम है और उच्च प्राथमिकता वाले आइटम हैं।


अधिक विवरण के साथ मूल उत्तर

xenoterracide का उत्तर अभी 3.5 साल पुराना है, और Git तब से कई संस्करणों से गुजरा है (यह इस लेखन के रूप में v1.6.5.5 से v1.8.3.2 तक चला गया है ), और इसके लिए वर्तमान प्रलेखन को देखते हुए, git remote updateऔर git fetchयह दिखता है जैसे वे दोनों सही विकल्पों और तर्कों को देखते हुए, कई रीमेक से नए तरीके से आने का मूल रूप से एक ही कार्य कर सकते हैं

सभी अवशेष प्राप्त करना

--allध्वज के साथ कई उपाय करने का एक तरीका है :

git fetch --all

यह आपके सभी कॉन्फ़िगर किए गए रीमेक से प्राप्त होगा, यह मानते हुए कि आपने remote.<name>.skipFetchAllउनके लिए सेट नहीं किया है:

यदि सही है, तो यह रिमोट git-fetch (1) या git- रिमोट (1) के अपडेट उपकमांड का उपयोग करते समय डिफ़ॉल्ट रूप से छोड़ दिया जाएगा । - गिट-कॉन्फिग डॉक्यूमेंटेशन

यह उपयोग करने के बराबर होगा

git remote update

किसी भी दूरस्थ समूह को लाने के लिए निर्दिष्ट किए बिना, और remotes.defaultआपके रेपो कॉन्फ़िगरेशन में सेट नहीं होने के बावजूद , और यह भी कि आपके किसी भी रिमूव remote.<name>.skipDefaultUpdateको सही नहीं बनाया गया है।

Git के विन्यास के लिए वर्तमान 1.8.3.2 प्रलेखन का उल्लेख नहीं करता remotes.defaultसेटिंग है, लेकिन मैं इसके बारे में सर्वशक्तिमान गूगल से सलाह ली और से इस उपयोगी स्पष्टीकरण पाया Mislav Marohnić :

$ git config remotes.default 'origin mislav staging'
$ git remote update

# fetches remotes "origin", "mislav", and "staging"

आप remote updateकमांड द्वारा प्राप्त किए जाने वाले रीमोट्स की डिफ़ॉल्ट सूची को परिभाषित कर सकते हैं । ये आपके टीम के साथी, किसी ओपनसोर्स प्रोजेक्ट या इसी तरह के विश्वसनीय समुदाय के सदस्यों से प्राप्त किए जा सकते हैं।

तो शायद, अगर आपने remotes.defaultसेट किया है, और आपके सभी रिमोट इसमें सूचीबद्ध git remote updateनहीं हैं , तो सभी रीमेक नहीं लाएंगे कि आपका रेपो "जागरूक" है।

के रूप में remote.<name>.skipDefaultUpdateस्थापना, Git डॉक्स यह thusly व्याख्या करते हैं:

यदि सही है, तो यह रिमोट git-fetch (1) या git- रिमोट (1) के अपडेट उपकमांड का उपयोग करते समय डिफ़ॉल्ट रूप से छोड़ दिया जाएगा ।

रिमोट के एक निर्दिष्ट समूह को लाना

सभी रिमोट प्राप्त करने में कठिनाई के बजाय, दोनों fetchऔर remote updateआप एक से अधिक रिमोट और रिमोट लाने के लिए के समूह निर्दिष्ट करने के लिए अनुमति देते हैं:

git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]

git fetch [<options>] <group>आपको कई रिमूव लाने की अनुमति देता है जो एक समूह का हिस्सा हैं ( मिस्लाव से एक और उदाहरण उधार लेने के लिए ):

$ git config remotes.mygroup 'remote1 remote2 ...'
$ git fetch mygroup

git fetch --multipleआपको कई रिपॉजिटरी और रिपोजिटरी समूहों को एक बार ( डॉक्स से ) लाने की अनुमति देता है :

कई <repository>और <group>तर्कों को निर्दिष्ट करने की अनुमति दें । <refspec>sनिर्दिष्ट नहीं किया जा सकता है।

git remote updateप्रलेखन में अस्पष्टता

के लिए सारgit remote update निर्दिष्ट कमांड वाक्य रचना इस प्रकार है कि:

git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]

अंतिम भाग पर ध्यान दें, [(<group> | <remote>)…]? अनुगामी डॉट्स का ...अर्थ है कि आप कई समूहों को निर्दिष्ट कर सकते हैं और कमांड के साथ रिमॉट कर सकते हैं, जिसका अर्थ है कि यह उसी तरह से व्यवहार करेगा जैसे git fetch --multiple... देखें कि दोनों के बीच का सिंटैक्स समान कैसे है?

हालाँकि, एक ही दस्तावेज़ में, updateकमांड के लिए स्पष्टीकरण कई समूह और दूरस्थ तर्कों को निर्दिष्ट करने के बारे में कुछ नहीं कहता है, केवल यह

के रूप में परिभाषित द्वारा भंडार में एक नामित सेट के लिए अपडेट [एस] लायें remotes.<group>

यह स्पष्ट नहीं है कि अगर कई व्यक्तिगत रीमोट और कई दूरस्थ समूहों को निर्दिष्ट git remote updateकरने git fetch --multipleके संबंध में पहचान के साथ काम करता है ।

एक ही रिमोट लाना

अंत में, हर कोई एक ही रिमोट लाने का सरल मामला जानता है:

git fetch <remote>

यह मामला हो सकता है कि आप भी उपयोग कर सकते हैं

git remote update <remote>

एक ही काम करने के लिए, लेकिन जैसा कि मैंने पिछले अनुभाग में उल्लेख किया है, इस git remote updateबारे में अस्पष्ट है कि क्या कमांड के साथ एकल समूह के अलावा कुछ भी प्राप्त करना संभव है ।

लपेटें

जैसा कि मैंने समझाया है, git fetchऔर git remote updateकई रीमेक से प्राप्त करने के संबंध में समान व्यवहार करता हूं । वे समान वाक्यविन्यास और तर्क साझा करते हैं, हालांकि git fetchकम है, इसलिए लोग संभवतः टाइप करना और उपयोग करना आसान समझते हैं।

यह ऐसा मामला हो सकता git remote updateहै जिसका उपयोग केवल एक रिमोट की तरह करने के लिए नहीं किया जा सकता है git fetch, लेकिन जैसा कि मैंने बताया है, प्रलेखन यह स्पष्ट नहीं करता है।

अलग

Git चीनी मिट्टी के बरतन आदेश, द्वारा उदाहरण के बीच कार्यक्षमता में दोहराव git fetchऔर git remote updateइसके बाद के संस्करण, अद्वितीय नहीं है। मैंने इसी तरह की स्थिति पर ध्यान दिया है git rebase --ontoऔर इसमें git cherry-pick, दोनों एक नए बेस कमिट पर पैच करने के लिए कई प्रकार के कमिट ले सकते हैं।

मेरा अनुमान है कि जैसे-जैसे गित वर्षों में विकसित हुई है, कुछ कार्यक्षमता (अनिवार्य रूप से?) दोहराई गई, शायद कभी-कभी एंड-यूज़र्स के लिए एक सुविधा के रूप में (उदाहरण के लिए, एक सीमा से cherry-pickअधिक, एक से अधिक प्रतिबद्ध पास करने की तुलना में यह आसान है। एक सीमा लेने के लिए)। जाहिरा तौर पर cherry-pickहमेशा हिट की एक सीमा को स्वीकार नहीं किया, जैसा कि v1.7.2 रिलीज नोट्स में बताया गया है :

git cherry-pickकई प्रकार के कमिट (जैसे cherry-pick A..Bऔर cherry-pick --stdin) लेने के लिए सीखा , ऐसा किया git revert; rebase [-i]हालांकि, नेक्सस अनुक्रमण नियंत्रण का समर्थन नहीं करता है ।


4
FYI करें: git rebaseपसंद है mvऔर git cherry-pickपसंद है cp--ontoस्विच है कि नहीं बदलता है। git rebaseयदि आप SHA1 मान निर्दिष्ट करते हैं, तो आप केवल एक कॉपी-प्रभाव प्राप्त कर सकते हैं , अन्यथा आपकी शाखा स्थानांतरित हो जाएगी!
रॉबर्ट सीमर

141

हां और ना। git remote updateकेवल एक ही नहीं, सभी रीमोट से प्राप्त होते हैं।

कोड को देखने के बिना यह देखने के लिए कि क्या remote updateयह केवल एक शेल स्क्रिप्ट (संभव) है, मूल रूप से, प्रत्येक रिमोट के लिए चलता है। git fetchबहुत अधिक दानेदार हो सकता है।


3
आप कॉन्फ़िगर कर सकते हैं जो दौड़ते समय लाने के लिए git remote update, गिट-रिमोट मैनपेज देखें।
जकुब नारबस्की

संयोग से, git remoteएक शेल स्क्रिप्ट नहीं है, लेकिन यह git fetchएक के दौरान पैदा होता है remote update
मिपाड़ी

1
वहाँ एक के git fetchलिए एक समान आदेश विकल्प है git remote update?
ट्यूलर

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