रिमोट के साथ स्थानीय गिट रिपॉजिटरी को सिंक्रनाइज़ करना


297

मैं अपने स्थानीय रिपॉजिटरी को रिमोट से सिंक्रोनाइज़ करना चाहता हूं, ताकि मेरी लोकल रिपॉजिटरी रिमोट वन की 100% कॉपी बन जाए - इसका मतलब है कि अगर इन रिपॉजिटरी में कुछ फाइलें अलग हैं, तो हम रिमोट वाले लोगों के साथ ओवरराइड करते हैं, और अगर है तो स्थानीय रिपॉजिटरी में फाइलें जो रिमोट में मौजूद नहीं होती हैं, लोकल फाइल्स हट जाती हैं।

क्या दूरस्थ रिपॉजिटरी का एक ताजा क्लोन करने के अलावा अन्य को प्राप्त करने का कोई तरीका है?

स्थानीय शॉट / कमिट को छोड़ने वाले एक शॉट में रिमोट के साथ सिंक गैट रेपो के समान प्रश्न ।


4
हमेशा जब मैं यहां आता हूं, तो मैं कांटा छांट
मार्टिन थोमा

जवाबों:


342
git fetch --prune

-p, --prune
लाने के बाद, किसी भी दूरस्थ ट्रैकिंग शाखा को हटा दें जो अब रिमोट पर मौजूद नहीं है। prune विकल्प


6
यही तो मैं ढूंढ रहा था! PS अगली बार मैं
स्टैकओवरफ़्लो को

5
हां, git pull -pक्या ऐसा ही है - 'git पुल दिए गए मापदंडों के साथ git fetch चलाता है और git मर्ज को वर्तमान ब्रांच के हेड को वर्तमान ब्रांच में मर्ज करने के लिए कहता है' - git-scm.com/docs/git-pull
jobwit

2
उपयोग करें git fetch <remote> --prune, यदि किसी को केवल --pruneविशिष्ट रिमोट की आवश्यकता है । जैसे। git fetch upstream --prune
फेरी वार्डियंतो

git fetch origin --pruneएक upstreamपरियोजना के अपने कांटे के साथ आप स्थानीय रेपो को सिंक करने के लिए
स्टुअर्ट कार्डाल

2
@SergiySokolenko कि हम सब क्या कहते हैं, लेकिन गहराई से हम जानते हैं कि SO अधिक सुविधाजनक हो गया है कि आदमी पेज :-P
मार्सेलो रोमानी

144

ये कदम यह करेंगे:

git reset --hard HEAD
git clean -f -x -d -n

तब बिना -n

इसमें सभी स्थानीय परिवर्तनों का ध्यान रखा जाएगा। अब करता है ...

git status

और लाइन को नोट करें जैसे:

Your branch is ahead of 'xxxx' by N commits.

अब 'एन' संख्या पर ध्यान दें:

git reset --hard HEAD~N
git pull

और अंत में:

git status

जोड़ने / प्रतिबद्ध करने के लिए कुछ भी नहीं दिखाना चाहिए। सब साफ।

हालांकि, एक ताजा क्लोन वही कर सकता है (लेकिन बहुत धीमा है)।

=== अपडेट किया गया ===

जैसा कि समय के साथ मेरे ज्ञान में थोड़ा सुधार हुआ है, मैं ऐसा करने के लिए एक और सरल तरीका लेकर आया हूं। यहां बताया गया है कि (# व्याख्या) कैसे है। आपकी कार्य शाखा में:

git fetch # This updates 'remote' portion of local repo. 
git reset --hard origin/<your-working-branch>
# this will sync your local copy with remote content, discarding any committed
# or uncommitted changes.

यद्यपि आपके स्थानीय कमिट और परिवर्तन दृष्टि से गायब हो जाएंगे, इसके बाद, यदि आवश्यक हो, तो प्रतिबद्ध परिवर्तनों को पुनर्प्राप्त करना संभव है।


1
अद्यतन के लिए बहुत बहुत धन्यवाद github और bitbucket के साथ पूरी तरह से ठीक काम करता है :)
CommonSenseCode

यह उत्तर मेरे लिए यहाँ समाधानों में से सबसे विश्वसनीय है।
एलन

95

आपको यह समझने की आवश्यकता है कि एक जीआईटी रिपॉजिटरी केवल निर्देशिकाओं और फाइलों का एक पेड़ नहीं है, बल्कि उन पेड़ों के इतिहास को भी संग्रहीत करता है - जिनमें शाखाएं और मर्ज हो सकते हैं।

जब एक भंडार से लाते हैं, तो आप सभी या कुछ शाखाओं को अपने भंडार में कॉपी करेंगे। ये तब आपकी रिपॉजिटरी में "रिमोट ट्रैकिंग ब्रांच" के रूप में होते हैं, उदाहरण के लिए जैसे remotes/origin/masterया जैसे शाखाएं ।

दूरस्थ रिपॉजिटरी से नए आने से आपके स्थानीय कामकाजी कॉपी के बारे में कुछ भी नहीं बदलेगा।

आपकी वर्किंग कॉपी में आम तौर पर एक कमिटेड चेक आउट होता है, जिसे कॉल किया जाता है HEAD। यह प्रतिबद्धता आमतौर पर आपकी स्थानीय शाखाओं में से एक की नोक है।

मुझे लगता है कि आप अपनी स्थानीय शाखा (या शायद सभी स्थानीय शाखाओं?) को संबंधित दूरस्थ शाखा में अद्यतन करना चाहते हैं, और फिर नवीनतम शाखा देखें।

अपनी कार्य प्रतिलिपि (जिसमें स्थानीय परिवर्तन हो सकते हैं) के साथ किसी भी टकराव से बचने के लिए, आप पहले सब कुछ साफ़ करते हैं जो कि संस्करण (उपयोग नहीं git clean) है। फिर आप जिस दूरस्थ शाखा को अद्यतन करना चाहते हैं, उसके अनुरूप स्थानीय शाखा की जाँच करें और उसे दूरस्थ दूरस्थ शाखा में git resetबदलने के लिए उपयोग करें। ( git pullआपके स्थानीय एक में दूरस्थ शाखा के सभी अपडेट शामिल होंगे, जो ऐसा ही कर सकते हैं, या स्थानीय कमिट होने पर मर्ज कमिट बना सकते हैं।)

(लेकिन तब आप वास्तव में किसी भी स्थानीय परिवर्तन को खो देंगे - दोनों काम की प्रतिलिपि और स्थानीय कमिट में। सुनिश्चित करें कि आप वास्तव में यह चाहते हैं - अन्यथा बेहतर है कि एक नई शाखा का उपयोग करें, यह आपके स्थानीय कमिट को बचाता है। और उन git stashपरिवर्तनों को बचाने के लिए उपयोग करें जो अभी तक प्रतिबद्ध नहीं हैं। ।)


संपादित करें: यदि आपके पास केवल एक स्थानीय शाखा है और एक दूरस्थ शाखा को ट्रैक कर रहे हैं, तो आपको केवल इतना करना है

git pull

काम कर रहे निर्देशिका के अंदर से।

यह सभी ट्रैक की गई दूरस्थ शाखाओं के वर्तमान संस्करण को लाएगा और वर्तमान शाखा (और वर्किंग डायरेक्टरी) को ट्रैक कर रहे रिमोट ब्रांच के वर्तमान संस्करण को अपडेट करेगा।


अगर मैं अपने स्थानीय रिपॉजिटरी में कुछ भी नहीं बदल रहा हूं, तो केवल a।) रिमोट से हर चीज की एक कॉपी चाहता है, और b।) एक संभावना दिखाना चाहता है कि संस्करणों के बीच अंतर हो। इसलिए मैं कमिट नहीं कर रहा हूं, कुछ भी नहीं बदल रहा है = कोई स्थानीय अपडेट / बदलाव नहीं। उपरोक्त दो कार्यक्षमताओं को प्राप्त करने के लिए मुझे समय-समय पर (जैसे हर हफ्ते या इसके बाद) किन आदेशों का उपयोग करना चाहिए? कृपया, इस सवाल का जवाब KISS (यह सरल बेवकूफ रखें) - मैं एक Git noob भी हूँ, और ऑप्टिकल फाइबर केबल RTFM होगा - लेकिन शुरुआत की जरूरत है मदद के लिए। ;)
कोबनामे

आपके साधारण मामले में git pullपर्याप्त होना चाहिए, मुझे लगता है। (मैंने जवाब अपडेट किया।)
पाओलो एबरमन

क्या होगा अगर मेरे पास कुछ स्थानीय परिवर्तन हैं जो मैं नहीं करना चाहता हूं अब जब मैं एक पुल करता हूं तो यह कहता है कि मैं उन्हें कमिट करूं या उन्हें स्टैश करूं। तो इस मामले में मैं उन लोगों को ओवरराइड करने और खींचने के लिए कैसे बता सकता हूं?
हर्षाना

89

आप करना चाहते हैं

git fetch --prune origin
git reset --hard origin/master
git clean -f -d

यह आपके स्थानीय रेपो को बिल्कुल आपके रिमोट रेपो की तरह बनाता है।

मूल और मास्टर को रिमोट और शाखा से बदलना याद रखें जिसे आप सिंक्रनाइज़ करना चाहते हैं।


2
यह भी npm स्थापित और बोवर स्थापित से सभी निर्देशिकाओं को हटा देता है, अनुशंसित नहीं है जब तक कि आप सभी निर्भरता को फिर से स्थापित नहीं करना चाहते हैं जो
.itignore

यह मेरी नहीं हटा node_modules, यह ठीक वैसा ही काम करता है जैसा मैं चाहता हूं।
वाहिद अमीरी

चेतावनी: यह अनटैक की गई फ़ाइलों को हटा देता है
अमित यादव

मैंने इस कोड का उपयोग करके अपना सारा डेटा खो दिया है, मैंने अपने स्थानीय रिपॉजिटरी को गिट रिपॉजिटरी के साथ सिंक्रनाइज़ करने का प्रयास किया। लेकिन इसने मेरी वैश्विक रिपॉजिटरी को मेरे स्थानीय रिपॉजिटरी के साथ सिंक्रनाइज़ कर दिया।
जाहिद खान

10

दूरस्थ शाखा के साथ स्थानीय रिपॉजिटरी को रीसेट और सिंक करें

कमांड: मूल और मास्टर को रिमोट और शाखा से बदलना याद रखें जिसे आप सिंक्रनाइज़ करना चाहते हैं।

git fetch origin && git reset --hard origin/master && git clean -f -d

या चरण-दर-चरण:

git fetch origin
git reset --hard origin/master
git clean -f -d

आपकी स्थानीय शाखा अब दूरस्थ शाखा की एक सटीक प्रति (कमिट और सभी) है।

कमांड आउटपुट:

यहां फोर्ज ए गिट रिपॉजिटरी के एक स्थानीय क्लोन पर कमांड चलाने का एक उदाहरण है।

sharkbook:forge lbaxter$ git fetch origin && git reset --hard origin/master && git clean -f -d
HEAD is now at 356cd85 FORGE-680
Removing forge-example-plugin/
Removing plugin-container-api/
Removing plugin-container/
Removing shell/.forge_settings
sharkbook:forge lbaxter$

4

(यह जानकारी Git यूजर मैनुअल से है )

मैं भी सीख रहा हूं, इसलिए यह सवाल का जवाब नहीं हो सकता है लेकिन यह किसी की मदद कर सकता है:

  1. जब एक दूरस्थ रिपॉजिटरी शुरू में सभी शाखाओं की क्लोन की हुई प्रतियां आपके स्थानीय भंडार में जमा हो जाती हैं (उन्हें देखें git branch -r)
  2. इन प्रतियों को अद्यतन करने और उन्हें चालू करने के लिए (यानी उन्हें दूरस्थ शाखा के साथ सिंक करें) उपयोग करें git fetch। यह आपके किसी भी मौजूदा, कस्टम निर्मित शाखाओं को प्रभावित नहीं करेगा।
  3. अपनी स्थानीय शाखा को ओवरराइड करने के लिए, जिस भी शाखा पर आप काम कर रहे हैं, उसका एक नया संस्करण देखें (मान लें कि आपने पहले ही निष्पादित कर दिया है git add origin /path/to/repository) git checkout origin/branch_name, यह शाखा पर आपके स्थानीय परिवर्तन को ओवरराइड करेगा।branch_name

3

लगता है जैसे आप दूरस्थ रिपोजिटरी का दर्पण चाहते हैं:

git clone --mirror url://to/remote.git local.git

वह आदेश एक नंगे भंडार का निर्माण करता है। यदि आप नंगे भंडार नहीं चाहते हैं, तो चीजें अधिक जटिल हो जाती हैं।


3

अगर आप कांटे वाले रेपो को सिंक करने की बात कर रहे हैं तो आप इन चरणों का पालन कर सकते हैं।

कैसे एक कांटा रिपॉजिटरी को गिट से सिंक करने के लिए

  1. अपने वर्तमान गिट शाखा की जाँच करें

    git branch

  2. यदि आप मास्टर में नहीं हैं तो मास्टर को चेकआउट करें

    git checkout master

  3. यदि आपके पास सही एक्सेस अधिकार हैं, तो अपस्ट्रीम रिपॉजिटरी लाएं

    git fetch upstream

  4. यदि आपको नीचे त्रुटि हो रही है तो चलाएं

    git remote add upstream git@github.com:upstream_clone_repo_url/xyz.git

    fatal: 'upstream/master' does not appear to be a git repository  
    fatal: Could not read from remote repository.
    Please make sure you have the correct access rights and the repository exists.
    
  5. अब निचे कमांड को रन करे।

    git fetch upstream

  6. अब अगर आप मास्टर हैं तो अपस्ट्रीम / मास्टर को मास्टर ब्रांच में मर्ज कर दें

    git merge upstream/master

    बस!!

    git remoteकमांड के माध्यम से क्रॉसचेक , अधिक विशिष्टgit remote -v

    यदि मेरे पास अपस्ट्रीम रेपो के लिए भी अधिकार हैं, तो मैं एक स्थानीय अपस्ट्रीम शाखा बना सकता हूं और वह काम करूंगा जो वहां ऊपर की तरफ जाएगा।


जब मैं पहले से ही तीसरे चरण में एक त्रुटि प्राप्त करता हूं, तो मुझे 5. अग्निपरीक्षा क्यों लेनी चाहिए?
एमडी सिफातुल इस्लाम

-2

आप इसके लिए गिट हुक का उपयोग कर सकते हैं । बस एक हुक बनाएं जो अपडेट के बाद बदलकर दूसरे रेपो में बदल जाए।

बेशक आप मर्ज संघर्ष हो सकते हैं ताकि आपको यह पता लगाना है कि उनके साथ कैसे व्यवहार किया जाए।

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