मैं स्थानीय फ़ाइलों को अधिलेखित किए बिना दूरस्थ से फ़ाइलों को कैसे खींच सकता हूं?


112

मैं पहले से मौजूद रिमोट रेपो में एक नया git रेपो सेट करने का प्रयास कर रहा हूं।

मैं चाहता हूं कि मेरी स्थानीय फाइलें दूरस्थ रेपो को अधिलेखित कर दें, लेकिन गिट का कहना है कि मुझे पहली बार उन दूरस्थ फाइलों को अंदर खींचना होगा और उन्हें मर्ज करना होगा।

क्या खींचने का कोई तरीका है लेकिन यह सुनिश्चित करें कि स्थानीय फाइलें रिमोट द्वारा ओवरराइट नहीं की गई हैं?

जवाबों:


181

खैर, हां, और नहीं ...

मैं समझता हूं कि आप चाहते हैं कि आपकी स्थानीय प्रतियां "ओवरराइड" करें कि रिमोट में क्या है, लेकिन, ओह, यार, अगर किसी ने रिमोट रेपो में फ़ाइलों को कुछ अलग तरीके से संशोधित किया है , और आप बस उनके परिवर्तनों को अनदेखा करते हैं और "बल" करने की कोशिश करते हैं अपने स्वयं के परिवर्तन भी बिना देख संभव संघर्ष में, ठीक है, मैं तुम्हें (और अपने सहकर्मियों) के लिए रोने ;-)

जैसा कि कहा गया है, हालांकि, यह है वास्तव में क्या करने के लिए आसान "सही बात ..."

चरण 1:

git stash

अपने स्थानीय रेपो में। यह आपके स्थानीय अपडेट्स को स्टैश में जाने से बचाएगा, फिर अपनी संशोधित फ़ाइलों को उनके प्री-एडिट अवस्था में वापस कर देगा।

चरण 2:

git pull

किसी भी संशोधित संस्करण प्राप्त करने के लिए। अब, उम्मीद है, कि आप के बारे में चिंतित हैं फ़ाइलों का कोई नया संस्करण नहीं मिलेगा। यदि ऐसा नहीं होता है, तो अगला कदम सुचारू रूप से काम करेगा। यदि ऐसा होता है , तो आपको कुछ काम करना है, और आपको खुशी होगी कि आपने किया।

चरण 3:

git stash pop

यह आपके संशोधित संस्करणों को मर्ज कर देगा जिन्हें आपने स्टेप 1 में हटा दिया था, जिन स्टेप्स को आपने अभी स्टेप 2 में खींचा है। यदि सब कुछ सुचारू रूप से चलता है, तो आप सभी सेट हो जाएंगे!

यदि, दूसरी ओर, चरण 2 में आपके द्वारा खींचे गए और आपके संशोधनों (अंतरिम में किसी और के संपादन के कारण) के बीच वास्तविक संघर्ष थे , तो आपको पता चल जाएगा और उन्हें हल करने के लिए कहा जाएगा। कर दो।

चीजें इस तरह से बहुत बेहतर काम करेंगी - यह संभवतः आपके हिस्से पर बिना किसी वास्तविक काम के आपके बदलावों को बनाए रखेगा, जबकि आपको गंभीर, गंभीर मुद्दों से सावधान करता है।


5
सिर्फ git commitस्थानीय परिवर्तन ही क्यों नहीं git pull?
डॉन चीडल

10
कभी-कभी मैं एक ऐसी स्थिति में होता हूं जहां मैं कोड को कमिट नहीं करना चाहता, लेकिन मैं इसे अपने स्थानीय मशीन में रखना चाहूंगा, ये सेट ऑफ कमांड वास्तव में इसके लिए मददगार हैं।
11

3
यह उपयोगी नहीं है यदि आपके पास कई फाइलें हैं, तो कुछ जिन्हें आप अधिलेखित करना चाहते हैं और कुछ जिन्हें आप अधिलेखित नहीं करना चाहते हैं। क्या जीआईटी को पुल पर फाइलों को अनदेखा करने का कोई तरीका नहीं है? .गतिग्नोर केवल पुश करने के लिए काम क्यों करता है, मैं उस डिज़ाइन के निर्णय को बिल्कुल भी नहीं समझता ...
बोबाक हाशमी

25

आप पहले अपने स्थानीय परिवर्तनों को रोक सकते हैं, फिर खींच सकते हैं, फिर स्टैश को पॉप कर सकते हैं।

git stash
git pull origin master
git stash pop

कुछ भी जो रिमोट से परिवर्तनों को ओवरराइड करता है, उसमें संघर्ष होंगे जो आपको मैन्युअल रूप से हल करने होंगे।


4
मैंने इन परिवर्तनों को स्थानीय रूप से पहले ही कर दिया है ताकि यह कहे कि "बचाने के लिए कोई स्थानीय परिवर्तन नहीं हैं"
जो इसाकसन

मुझे लगता है, यह सबसे अच्छी रणनीति है।
जिमी ओबोनियो अबोर

13

इसलिए आपने अपने स्थानीय रिपॉजिटरी में अपने स्थानीय परिवर्तन किए हैं। फिर अपने स्थानीय फ़ाइलों में परिवर्तन किए बिना अपने स्थानीय भंडार में दूरस्थ परिवर्तन प्राप्त करने के लिए, आप उपयोग कर सकते हैं git fetch। वास्तव git pullमें एक दो कदम ऑपरेशन है: एक गैर विनाशकारी git fetchद्वारा पीछा किया git merge। देखें 'गिट पुल' और 'गिट लाने' में क्या अंतर है? अधिक चर्चा के लिए।

विस्तृत उदाहरण:

मान लीजिए कि आपका भंडार इस तरह है (आपने बदलाव किए हैं test2:

* ed0bcb2 - (HEAD, master) test2
* 4942854 - (origin/master, origin/HEAD) first

और originभंडार इस तरह है (किसी और ने प्रतिबद्ध है test1):

* 5437ca5 - (HEAD, master) test1
* 4942854 - first

इस समय, git शिकायत करेगा और आपको सबसे पहले खींचने के लिए कहेगा यदि आप अपने test2दूरस्थ रिपॉजिटरी में धकेलने का प्रयास करते हैं । यदि आप देखना चाहते हैं कि आपके स्थानीय भंडार को संशोधित किए बिना test1 क्या है, तो इसे चलाएं:

$ git fetch

आपका परिणाम स्थानीय रिपॉजिटरी इस तरह होगा:

* ed0bcb2 - (HEAD, master) test2 
| * 5437ca5 - (origin/master, origin/HEAD) test1 
|/  
* 4942854 - first 

अब आपके पास एक अन्य शाखा में दूरस्थ परिवर्तन हैं, और आप अपनी स्थानीय फ़ाइलों को बरकरार रखते हैं।

फिर आगे क्या है? आप एक कर सकते हैं git merge, जो git pull(पिछले के साथ संयुक्त git fetch) के रूप में एक ही प्रभाव होगा , या, जैसा कि मैं पसंद करूंगा, git rebase origin/masterअपने शीर्ष पर अपने परिवर्तन को लागू करने के लिए origin/master, जो आपको एक क्लीनर इतिहास देता है।


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