Git खींचो जबकि स्थानीय परिवर्तन की अनदेखी?


489

क्या ऐसा करने का कोई तरीका है git pullजो निर्देशिका को उड़ाने और प्रदर्शन करने के बिना किसी भी स्थानीय फ़ाइल परिवर्तनों को अनदेखा करता है git clone?


17
"उपेक्षा" करके क्या आपका मतलब है "ओवरराइट"?
कैस्केबेल

@ कैस्केबेल का अर्थ है सभी स्थानीय परिवर्तनों को वापस करना, सभी स्थानीय कमानों को अनसुना करना, सभी स्थानीय नई फ़ाइलों और निर्देशिकाओं को हटाना, सभी स्थानीय रूप से हटाई गई फ़ाइलों और निर्देशिकाओं को हटाना, आदि। संक्षेप में, जैसे ही एक कमांड चलाते हैं rm -rf local_repo && git clone remote_url
विक्टर

जवाबों:


820

यदि आप चाहते हैं कि आप स्थानीय परिवर्तनों को अधिलेखित करना चाहते हैं, तो मर्ज कर रहे हैं जैसे कि काम करने वाले पेड़ साफ थे, अच्छी तरह से, काम करने वाले पेड़ को साफ करें:

git reset --hard
git pull

अगर वहाँ अनियंत्रित स्थानीय फ़ाइलें आप git cleanउन्हें हटाने के लिए उपयोग कर सकते हैं। का प्रयोग करें git clean -fट्रैक न किए गए फ़ाइलें निकालने के लिए, -dfट्रैक न किए गए फ़ाइलों और निर्देशिकाओं को हटाने के लिए, और-xdf को हटाने के लिए अनट्रेक्ड या इग्नोरड फाइल्स या डाइरेक्टरीज़ ।

यदि दूसरी ओर आप स्थानीय संशोधनों को किसी भी तरह रखना चाहते हैं, तो आप खींचने से पहले उन्हें छिपाने के लिए छिपाने की जगह का उपयोग करेंगे, फिर उन्हें आगे की ओर फिर से लगाएँ:

git stash
git pull
git stash pop

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


4
यदि git resetआपकी फ़ाइलें अभी भी रिमोट से भिन्न हैं, तो stackoverflow.com/questions/1257592/…
कर्नल पैनिक

3
गिट कभी भी सबसे अजीब चीज है। Git रीसेट --हार्ड किया गया। फिर git स्टेटस: आपकी शाखा 2 कमिट द्वारा आगे है।
शैलेन

21
@shailenTJ "स्थानीय परिवर्तन" का अर्थ है स्थानीय परिवर्तन, न कि स्थानीय परिवर्तन। git reset --hardपूर्व को प्रभावित करता है, बाद को नहीं। यदि आप रिमोट की स्थिति में पूरी तरह से रीसेट करना चाहते हैं, git reset --hard origin/<branch>- लेकिन अक्सर और इस मामले में, वे दो काम करते हैं जो आप मूल से आगे हैं जो आपके द्वारा किए गए काम हैं, न कि कुछ जिसे आप फेंकना चाहते हैं।
Cascabel

2
तो यह स्थानीय रिपॉजिटरी को नष्ट करने और फिर से डाउनलोड करने के समान है, है ना? मैं बस सुविधा के लिए परिवर्तन को बाध्य करने और परिवर्तन को अधिलेखित करने में सक्षम होना चाहता हूं। 99% समय मुझे यह त्रुटि संदेश मिलता है जब मैंने गलती से स्थानीय रूप से कुछ गड़बड़ कर दी है और केवल रेपो से शुरू करना चाहता हूं।
सूडो

क्या होगा यदि आप संभवतः सिर बनाम एक स्थानीय परिवर्तन नहीं कर सकते हैं? उदाहरण के लिए, रेपो एक केस सेंसिटिव फाइल सिस्टम पर बनाया गया था और इसे एक केस असंवेदनशील फाइल सिस्टम पर क्लोन किया गया है और एक ही नाम के साथ 2 फाइल अलग केसिंग है?
xster

305

मेरे लिए निम्नलिखित काम किया:

(1) पहले सभी परिवर्तन लाएँ:

$ git fetch --all

(२) फिर गुरु को रीसेट करें:

$ git reset --hard origin/master

(3) खींच / अद्यतन:

$ git pull

22
शीर्ष जवाब के साथ बहुत परेशानी होने पर मेरे लिए बहुत अच्छा काम किया। धन्यवाद!
0x0

6
यह तब भी काम करता है जब यू ने उर स्थानीय परिवर्तन किए हैं, लेकिन फिर भी आप वापस करना चाहते हैं
agsachin

16
यह शीर्ष उत्तर होना चाहिए :)
Purus

5
@ मार्को सेर्वेटो: आप सबसे पहले अपने सभी बदलावों को प्राप्त करते हैं, लेकिन उन्हें अभी तक लागू नहीं करते हैं। फिर आप मास्टर को अंतिम स्थिति (अपडेट) में रीसेट कर देते हैं। यदि आप पहला चरण छोड़ते हैं, तो आप पुराने मास्टर (स्थानीय) में परिवर्तन वापस कर देंगे। मेरे अनुभव से, मैंने जिस तरह से इसका वर्णन किया है, वह कभी भी समस्याओं का कारण नहीं बनता है। अन्य सभी प्रयास अंत में करते हैं।
अर्तुर बरसेघन

1
इसने मेरे लिए काम किया, मैं अपने सभी स्थानीय परिवर्तनों को हटा देना चाहता था जिसमें हटाए गए फाइलों को पुनर्प्राप्त करना शामिल था
नेरी

28

आप बस एक कमांड चाहते हैं जो ठीक वैसा ही परिणाम दे rm -rf local_repo && git clone remote_url, जैसा सही है? मुझे भी यह सुविधा चाहिए। मुझे आश्चर्य है कि git ऐसी कमांड (जैसे git recloneया git sync) प्रदान नहीं करता है, न ही svn इस तरह की कमांड (जैसे svn recheckoutया svn sync) प्रदान करता है ।

निम्नलिखित कमांड आज़माएं:

git reset --hard origin/master
git clean -fxd
git pull

यह वास्तव में काम करता है, तब भी जब आपके पास पहले से ही स्थानीय कमिट हैं जिन्हें आप हटाना चाहते हैं।
यूरी घेंसेव

5
चेतावनी दोस्तों !! git clean -fxdफ़ाइलों को .gitignoreभी हटाता है ।
रमेश नवी

@ रामेश्वरी श्योर यह वही है जो चाहता है। जो चाहता है, उसे फिर से क्लोन करने का एक तेज़ तरीका है, यानी पूरे स्थानीय रेपो को हटाना और फिर इसे क्लोन करना।
विक्टर

27

कमांड बलो हमेशा काम नहीं करेगा । यदि आप बस करते हैं:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

और इसी तरह...

करने के लिए वास्तव में , से शुरू thebranch डाउनलोड करने और अपने सभी स्थानीय को ओवरराइट करते, बस कार्य करें:


$ git checkout thebranch
$ git reset --hard origin/thebranch

यह ठीक काम करेगा।

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'

4
हाँ। यह वही है जो मुझे एक परम के लिए आवश्यक था "स्थानीय क्या है" के बारे में एक एफ नहीं देते। धन्यवाद। :)
अदम्बियन


8

पर देखो Git गुप्त कोष में पिछले प्रतिबद्ध करने के लिए एक "गुप्त कोष में फाइल" और वापस लाएं में अपने स्थानीय परिवर्तन के सभी डाल करने के लिए। उस बिंदु पर, आप अपने अटके हुए परिवर्तन लागू कर सकते हैं, या उन्हें छोड़ सकते हैं।


8

यदि आप लिनक्स पर हैं:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

फॉर लूप उन सभी ट्रैक की गई फ़ाइलों को हटा देगा जो स्थानीय रेपो में बदली जाती हैं, इसलिए git pullबिना किसी समस्या के काम करेंगी।
इसके बारे में सबसे अच्छी बात यह है कि केवल ट्रैक की गई फाइलें ही रेपो की फाइलों से अधिलेखित हो जाएंगी, अन्य सभी फाइलें अछूती रह जाएंगी।


मुझे लगता है कि आपका मतलब "ट्रैक की गई फाइलें" है जो वास्तव में मेरी ज़रूरत है, धन्यवाद।
अली

Powershell के लिए कोई समकक्ष?
इयरली

8

सबसे छोटा तरीका यह है:

git pull --rebase --autostash

--autostashपहले के बारे में पता नहीं था , धन्यवाद!
शेरो

7

यह मेरे लिए काम किया

git fetch --all
git reset --hard origin/master
git pull origin master

स्वीकृत उत्तर के साथ मुझे संघर्ष संबंधी त्रुटियां मिलती हैं


यह Artur Barseghyan के 2015 के उत्तर के समान है ... लेकिन मैं अभी भी जानना चाहूंगा कि तीसरे कमांड का उद्देश्य क्या है: 2 डी कमांड के बाद काम करने वाली फाइलें बदल गई हैं, और तीसरा कमांड कहता है "पहले से ही अद्यतित "
माइक

यह एकमात्र संयोजन है जो मेरे पर्यावरण पर काम करता है, शायद आप एक अलग चीज देख रहे हैं, मेरे लिए, मुझे तीन आज्ञाओं की आवश्यकता थी
पाब्लो पज़ोस

दिलचस्प। एक संस्करण बात हो सकती है। मैं 2.7.4 पर हूं। लेकिन मैंने अभी-अभी आर्टूर बरसेघन की एक नई टिप्पणी भी देखी है: "अन्यथा आप खुद को गलती से आउटडेटेड मास्टर पर काम करते हुए पा सकते हैं।"
माइक कृंतक

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


2

यह वर्तमान शाखा को प्राप्त करेगा और मास्टर को तेजी से आगे बढ़ाने का प्रयास करेगा:

git fetch && git merge --ff-only origin/master

0

.gitignore

"अवांछित फ़ाइलों को जोड़ने से .itignore तब तक काम करता है जब तक कि आपने शुरू में उन्हें किसी भी शाखा के लिए प्रतिबद्ध नहीं किया है।"

इसके अलावा आप चला सकते हैं:

git update-index --assume-unchanged filename

https://chamindac.blogspot.com/2017/07/ignoring-visual-studio-2017-created.html

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