सवाल मैं स्थानीय फाइलों को ओवरराइट करने के लिए "गिट पुल" को कैसे मजबूर करूं?


मैं स्थानीय फ़ाइलों की एक ओवरराइट को कैसे बल दूं? git pull?

परिदृश्य निम्नलिखित है:

  • एक टीम सदस्य उस वेबसाइट के लिए टेम्पलेट्स को संशोधित कर रहा है जिस पर हम काम कर रहे हैं
  • वे छवियों निर्देशिका में कुछ छवियां जोड़ रहे हैं (लेकिन उन्हें स्रोत नियंत्रण में जोड़ने के लिए भूल जाते हैं)
  • वे मेल द्वारा छवियों को बाद में मेरे पास भेज रहे हैं
  • मैं स्रोत नियंत्रण के तहत छवियों को जोड़ रहा हूं और उन्हें अन्य परिवर्तनों के साथ गिटहब में धक्का दे रहा हूं
  • वे गिटहब से अपडेट नहीं खींच सकते हैं क्योंकि गिट अपनी फाइलों को ओवरराइट नहीं करना चाहता है।

यह वह त्रुटि है जो मुझे मिल रही है:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

मैं गिट को उनको ओवरराइट करने के लिए कैसे मजबूर करूं? व्यक्ति एक डिजाइनर है - आमतौर पर मैं हाथ से सभी संघर्षों को हल करता हूं, इसलिए सर्वर का सबसे हालिया संस्करण है जिसे उन्हें अपने कंप्यूटर पर अपडेट करने की आवश्यकता है।


5217
2017-07-14 14:58


मूल


कोई भी जो इसे सोचता है कि वे फाइलें खो सकते हैं, मैं इस स्थिति में रहा हूं और पाया कि सब्लिमे टेक्स्ट के बफर ने मुझे बचा लिया है - अगर मैं कुछ पर काम कर रहा हूं, तो गलती से इस तरह की समस्या को हल करने की कोशिश करके सबकुछ हटाएं इस सवाल पर एक जवाब है और फाइलें सब्लिमे में खुली हैं (जिनके पास एक अच्छा मौका है) तो फाइलें अभी भी वहां होंगी, या तो वहां, या पूर्ववत इतिहास में - Toni Leigh
git reset --hard origin/branch_to_overwrite - Andrew Atkinson


जवाब:


महत्वपूर्ण: यदि आपके पास कोई स्थानीय परिवर्तन है, तो वे खो जाएंगे। के साथ या बिना --hard विकल्प, किसी भी स्थानीय काम को धक्का नहीं दिया गया है।[*]

यदि आपके पास कोई भी फाइल है जो हैं नहीं गिट द्वारा ट्रैक किया गया (उदा। अपलोड की गई उपयोगकर्ता सामग्री), ये फ़ाइलें प्रभावित नहीं होंगी।


मुझे लगता है कि यह सही तरीका है:

git fetch --all

फिर, आपके पास दो विकल्प हैं:

git reset --hard origin/master

या यदि आप किसी अन्य शाखा पर हैं:

git reset --hard origin/<branch_name>

स्पष्टीकरण:

git fetch कुछ भी विलय या पुन: प्रयास करने की कोशिश किए बिना रिमोट से नवीनतम डाउनलोड करता है।

फिर git reset मास्टर शाखा को जो भी आपने अभी लाया है उसे रीसेट करता है। --hard विकल्प फाइलों से मेल खाने के लिए आपके काम करने वाले पेड़ की सभी फाइलों को बदल देता है origin/master


वर्तमान स्थानीय प्रतिबद्धता बनाए रखें

[*]: यह ध्यान देने योग्य है कि शाखा बनाने से वर्तमान स्थानीय प्रतिबद्धताओं को बनाए रखना संभव है master रीसेट करने से पहले:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

इसके बाद, सभी पुराने कामों को रखा जाएगा new-branch-to-save-current-commits

असामान्य परिवर्तन

असामान्य परिवर्तन, हालांकि (यहां तक ​​कि मंचित) खो जाएंगे। आपको जो भी चाहिए उसे छिपाने और प्रतिबद्ध करने के लिए सुनिश्चित करें। इसके लिए आप निम्नलिखित चला सकते हैं:

git stash

और फिर इन असामान्य परिवर्तनों को फिर से लागू करने के लिए:

git stash pop

7301
2018-01-17 00:02



ध्यान रहे! यदि आपके पास स्थानीय अप्रकाशित काम करता है तो यह उन्हें आपकी शाखा से हटा देगा! यह समाधान अनचाहे फ़ाइलों को भंडार में बरकरार रखता है, लेकिन बाकी सब कुछ ओवरराइट करता है। - Matthijs P
यह एक लोकप्रिय सवाल है, इसलिए मैं यहां शीर्ष टिप्पणी पर स्पष्टीकरण देना चाहता हूं। मैंने अभी इस आदेश में वर्णित आदेशों को निष्पादित किया है और इसने सभी स्थानीय फ़ाइलों को नहीं हटाया है। केवल दूरस्थ रूप से ट्रैक की गई फ़ाइलों को अधिलेखित किया गया था, और यहां मौजूद प्रत्येक स्थानीय फ़ाइल को छूटा नहीं गया था। - Red
यह मेरे लिए काम करता था और मेरी स्थानीय फाइलें हटाई नहीं गई थीं। - Tastybrownies
यदि आप एक रेपो से खींच रहे हैं जिसमें इसका दूरस्थ शाखा नाम "मास्टर" से अलग है, तो इसका उपयोग करें git reset --hard origin/branch-name - Nerrve
इस प्रश्न और उत्तर के उपरांतों की मात्रा को देखते हुए, मुझे लगता है कि गिट को कमांड को शामिल करना चाहिए git pull -f - Sophivorus


इसे इस्तेमाल करे:

git reset --hard HEAD
git pull

यह वही करना चाहिए जो आप चाहते हैं।


761
2018-05-09 19:45



मैंने यह किया है और कुछ स्थानीय फाइलें जो रेपो में नहीं थीं डिस्क पर छोड़ी गई थीं। - Piotr Owsiak
मुझे नहीं लगता कि यह सही है। उपरोक्त विलय करेगा, ओवरराइट नहीं करेगा जिसे प्रश्न में अनुरोध किया गया था: "गिट को उनको ओवरराइट करने के लिए कैसे मजबूर करें?" मेरे पास जवाब नहीं है, मैं वर्तमान में इसकी तलाश कर रहा हूं .. फिलहाल मैं उस कोड के साथ शाखा में स्विच करता हूं जिसे मैं "गिट चेकआउट शाखाविथकोड टोकीप" रखना चाहता हूं, फिर "गिट शाखा-डी शाखा टोओ ओवरराइट" और फिर अंत में "गिट चेकआउट -बी शाखा टोओ ओवरराइट"। अब आपके पास ब्रांचविथकोड टोकिप से ब्रांच शाखाओओवरराइट पर मर्ज करने के बिना सटीक कोड होगा। - felbus
'गिट पुल' का उपयोग करके विलय करने के बजाय, गिट fetch --all के बाद 'गिट रीसेट - हार्ड मूल / मास्टर' - Lloyd Moore
हाँ, @Loydmoore समाधान मेरे लिए काम किया। सिर्फ एक टिप्पणी के बजाय उत्तर होने के साथ किया जा सकता है। - Max Williams
यह मौजूदा परिवर्तनों को वापस खींचने वाली अंतिम शाखा प्रतिबद्धता को रीसेट कर देगा। फिर गिट पुल नवीनतम शाखा से परिवर्तन विलय करता है। यह वही किया जो मैं चाहता था .. धन्यवाद! - Codeversed


चेतावनी: git clean आपकी सभी अनचाहे फ़ाइलों / निर्देशिकाओं को हटा देता है और पूर्ववत नहीं किया जा सकता है।


कभी-कभी बस clean -f सहायता नहीं करता है। यदि आपके पास अनचाहे निर्देशिकाएं हैं, -d विकल्प भी आवश्यक है:

git reset --hard HEAD
git clean -f -d
git pull

चेतावनी: git clean आपकी सभी अनचाहे फ़ाइलों / निर्देशिकाओं को हटा देता है और पूर्ववत नहीं किया जा सकता है।


381
2018-03-19 09:10



बहुत बढ़िया ... मेरे डॉटफाइल रेपो के खिलाफ इसे चलाएं ... मेरी होम निर्देशिका में। अच्छा है कि मेरे पास वास्तव में कुछ भी महत्वपूर्ण नहीं था ... - Lauri
मुझे लगता है कि परिदृश्य विवरण यह स्पष्ट करता है कि वह वास्तव में सामग्री को फेंकना नहीं चाहता है। इसके बजाय वह क्या चाहता है कि फाइलों को ओवरराइट करने पर गिट को रोकना बंद करें। @ लॉरी, यह आपके साथ नहीं होना चाहिए था। दुर्भाग्य से लोगों ने परिदृश्य विवरण के सार को गलत तरीके से पढ़ा है - मेरा सुझाव देखें। - Hedgehog
आखिरकार। गिट क्लीन-एफ-डी आसान है जब साफ सब कुछ साफ करने में विफल रहता है। - earthmeLon
@crizCraig जब तक वे शामिल नहीं हैं .gitignore - Bleeding Fingers
@earthmeLon, जिसके लिए आप चाहें git clean -dfx। -x अनदेखा करता है .gitignore। आम तौर पर आपके निर्माण उत्पाद .gitignore में होंगे। - Paul Draper


हेजहोग की तरह मुझे लगता है कि जवाब भयानक हैं। लेकिन हालांकि हेजहोग का जवाब बेहतर हो सकता है, मुझे नहीं लगता कि यह उतना ही सुरुचिपूर्ण है जितना हो सकता है। जिस तरह से मुझे ऐसा करने के लिए मिला वह परिभाषित रणनीति के साथ "fetch" और "विलय" का उपयोग कर रहा है। जो इसे बनाना चाहिए ताकि आपके स्थानीय परिवर्तन तब तक संरक्षित किए जा सकें जब तक वे उन फ़ाइलों में से एक न हों जिन्हें आप ओवरराइट करने के लिए मजबूर कर रहे हैं।

सबसे पहले अपने परिवर्तनों की प्रतिबद्धता करें

 git add *
 git commit -a -m "local file server commit message"

फिर कोई संघर्ष होने पर परिवर्तन लाएं और ओवरराइट करें

 git fetch origin master
 git merge -s recursive -X theirs origin/master

"-एक्स" एक विकल्प नाम है, और "उनका" उस विकल्प का मान है। यदि कोई संघर्ष हो तो आप "अपने" परिवर्तनों के बजाय "उनके" परिवर्तनों का उपयोग करना चुन रहे हैं।


335
2018-04-11 20:13



यह अब तक का सबसे अच्छा जवाब है जिसे मैंने देखा है। मैंने कोशिश नहीं की है, लेकिन अन्य उत्तरों के विपरीत, यह आपकी सभी अनचाहे फ़ाइलों को नकारने का प्रयास नहीं करता है, जो स्पष्ट कारणों से बहुत खतरनाक है। - huyz
डिट्टो - यह मेरे लिए बहुत बड़ा विलय (गिटहब पुल अनुरोध) करते समय मेरे लिए काम करता था जहां मैं बस इसे अपने सभी के शीर्ष पर स्वीकार करना चाहता था। अच्छा उत्तर! मेरे मामले में पिछले दो आदेश थे: 1) get fetch other-repo; 2) git merge -s recursive -X theirs other-repo/master - quux00
प्रश्न: -एक्स क्या है? 'उनका' क्या है? - AlxVallejo
यह रिपॉजिटरीज फ़ाइलों के साथ किसी भी विवाद को ओवरराइट करेगा, न कि आपके स्थानीय, सही? - Nathan Fiscaletti
"-एक्स" एक विकल्प नाम है, और "उनका" उस विकल्प का मान है। यदि कोई संघर्ष हो तो आप "अपने" परिवर्तनों के बजाय "उनके" परिवर्तनों का उपयोग करना चुन रहे हैं। - Richard Kersey


करने के बजाय:

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

मैं निम्नलिखित करने की सलाह दूंगा:

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

यदि आप मूल / मास्टर शाखा में रीसेट करने जा रहे हैं तो सभी रिमोट और शाखाएं लाने की आवश्यकता नहीं है?


237
2018-04-26 13:48



आपका उत्तर सिर्फ आपके प्रतिनिधि के लिए आवश्यक है। मुझे पूछना चाहिए, क्या यह सभी अनचाहे फ़ाइलों को भी हटा देता है? - Nicolas De Jay
हाँ, मेरा अधिकांश प्रतिनिधि यहां से आ रहा है :) यह सभी अनचाहे फ़ाइलों को भी हटा देगा। कुछ मैं भूल गया था और दर्दनाक रूप से सिर्फ 2 दिन पहले याद दिलाया गया था ... - Johanneke
इस अन्य उत्तर पर टिप्पणियां देखें: stackoverflow.com/a/8888015/2151700 - Johanneke
यह मेरी अनचाहे फ़ाइलों को नहीं हटाया; जो वास्तव में मैं उम्मीद करता हूं। क्या कुछ लोगों के लिए ऐसा कोई कारण है, न कि दूसरों के लिए? - arichards
अनचाहे फ़ाइलों को गिट रीसेट द्वारा प्रभावित नहीं किया जाता है। यदि आप उन्हें भी हटाना चाहते हैं, तो करें git add . पहले, पहले git reset --hard - Johanneke


ऐसा लगता है कि सबसे अच्छा तरीका सबसे पहले करना है:

git clean

सभी अनचाहे फ़ाइलों को हटाने के लिए और फिर सामान्य के साथ जारी रखें git pull...


122
2017-07-14 15:16



मैंने एक ही मुद्दे को हल करने के लिए "गिट क्लीन" का उपयोग करने की कोशिश की, लेकिन इसने इसे हल नहीं किया। गिट स्टेटस का कहना है, "आपकी शाखा और 'मूल / मास्टर' अलग हो गए हैं, और क्रमश: 2 और 9 अलग-अलग प्रतिबद्ध हैं।" और गिट पुल आपके ऊपर जो कुछ है उसके समान कुछ कहता है। - slacy
गिट क्लीन एक बदमाश उपकरण है, और आप कई चीजें फेंक सकते हैं जिन्हें आप रखना चाहते हैं। फ़ाइलों को हटाने या उनका नाम बदलने के लिए बेहतर है जो गिट सफल होने तक शिकायत कर रहा है। - Neil Mayhew
मुझे नहीं लगता कि यह सामान्य रूप से काम करता है। क्या मजबूर गिट पुल के माध्यम से मूल रूप से एक गिट क्लोन रिमोट करने का कोई तरीका नहीं है? - mathtick
@mathick: git fetch origin && git reset --hard origin/master - Arrowmaster
है git clean सबसे अच्छा जवाब यहाँ? ऐसा लगता है कि फ़ाइलों को हटाने की तरह ही ओपी चाहता है। उन्होंने 'स्थानीय फाइलों का ओवरराइट' हटाने के लिए कहा। - JohnAllen


चेतावनी, ऐसा करने से आपकी फ़ाइलों को स्थायी रूप से हटा दिया जाएगा यदि आपके गिटिग्नोर फ़ाइल में कोई निर्देशिका / * प्रविष्टियां हैं।

कुछ जवाब भयानक प्रतीत होते हैं। डेविड अवाजनिश्विली सुझाव का पालन करके @ लॉरी के साथ क्या हुआ उसके अर्थ में भयानक।

इसके बजाय (गिट> v1.7.6):

git stash --include-untracked
git pull

बाद में आप छिपे इतिहास को साफ कर सकते हैं।

मैन्युअल रूप से, एक-एक-एक:

$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...

$ git stash drop stash@{0}
$ git stash drop stash@{1}

क्रूरता से, सभी एक बार में:

$ git stash clear

बेशक अगर आप जो कुछ भी दबाते हैं उस पर वापस जाना चाहते हैं:

$ git stash list
...
$ git stash apply stash@{5}

97
2018-02-11 23:00



नहीं, मुझे ऐसा नहीं लगता। छेड़छाड़ सिर्फ रास्ते से बाहर की गई फ़ाइलों को ले जाता है। उपरोक्त फ़ाइलों को भी चलाता है (स्टैश) फ़ाइलें जो गिट ट्रैक नहीं करती हैं। यह उन फ़ाइलों को रोकता है जो रिमोट में जोड़े गए हैं, जो अभी तक आपकी मशीन पर नहीं खींचे हैं - लेकिन जो आपने बनाया है (!) - खींचा जा सकता है। सभी असामान्य काम को नष्ट किए बिना। उम्मीद है कि समझ में आता है? - Hedgehog
यदि आपके पास 1.7.6 नहीं है, तो आप नकल कर सकते हैं --include-untracked बस अस्थायी रूप से git addअपने पूरे रेपो को लेकर, तुरंत इसे छेड़छाड़ करना। - nategood
मैं हेजहोग से सहमत हूं। यदि आप यहां लोकप्रिय उत्तर देते हैं, तो आप शायद यह जान सकें कि आपने अनजाने में कई चीजें मारे हैं जिन्हें आप वास्तव में खोना नहीं चाहते थे। - Guardius
मेरे पास अन्य अनचाहे फ़ाइलें थीं - इसके अलावा मर्ज / पुल ओवरराइट करना चाहता था, इसलिए इस समाधान ने सबसे अच्छा काम किया। git stash apply मेरे सभी अनचाहे फ़ाइलों को अपवाद (ठीक से) के साथ वापस लाया है जो विलय पहले ही बना चुके हैं: "पहले से मौजूद है, कोई चेकआउट नहीं है।" पूरी तरह से काम किया। - BigBlueHat
यह सबसे साफ जवाब है, और स्वीकार किया जाना चाहिए। कुछ टाइपिंग को सहेजने के लिए आप छोटे फॉर्म का उपयोग कर सकते हैं: git stash -u। - ccpizza


स्थानीय परिवर्तनों को दूर करने के लिए आपको यह आदेश उपयोगी हो सकता है:

git checkout <your-branch> -f

और फिर एक सफाई करें (काम करने वाले पेड़ से अनचाहे फ़ाइलों को हटा दें):

git clean -f

यदि आप अनचाहे फ़ाइलों के अलावा अनचाहे निर्देशिका को हटाना चाहते हैं:

git clean -fd

86
2017-08-05 18:06



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


विलय करने के बजाय git pull, इसे इस्तेमाल करे:

git fetch --all

के बाद:

git reset --hard origin/master


72
2017-11-22 10:56





मेरे लिए काम करने वाली एकमात्र चीज थी:

git reset --hard HEAD~5

यह आपको पांच कामों और फिर साथ ले जाएगा

git pull

मैंने पाया कि देखकर गिट मर्ज को पूर्ववत कैसे करें


51
2018-05-05 21:53



आखिर में मेरे लिए यह काम किया गया क्योंकि मैंने बल को अपनी शाखा को मूल रेपो में धकेल दिया था और इसे अपने रिमोट रेपो में खींचने की कोशिश करते समय संघर्ष विलय करना जारी रखा था .. - jwfrench
हाय, वास्तव में यह एक के लिए एक चाल है work around लेकिन वास्तव में प्रभावी है। चूंकि कुछ संघर्ष केवल कुछ कामों में हो सकते हैं, फिर 5 कामों को वापस करने से रिमोट कोड के साथ कोई संघर्ष नहीं होगा। - Hoang Le