Git Pull संभव नहीं है, Unmerged फ़ाइलें


89

मैंने इस पर सभी समान प्रश्नों को पढ़ा है; ऐसा लगता है कि निम्नलिखित में से किसी ने भी काम नहीं किया है:

Delete offending files
git reset --hard HEAD
git stash
git pull

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

प्रयास किया:

git stash
git pull

काम भी नहीं किया।

और जानकारी

एक स्थानीय कमिट है, और अपस्ट्रीम में एक कमिट भी है। मैंने इस प्रकार कोशिश की है, git pull --rebaseलेकिन यह अभी भी ठीक से काम नहीं कर रहा है ... जो मुझे त्रुटियां देता है - "एक अनसुलझे संघर्ष के कारण बाहर निकलना"। यदि मैं करता हूं git stash, git reset --hard HEAD, git pull --rebase, तो मुझे त्रुटि मिलती है "पुल संभव नहीं है, अनमैरिड परिवर्तन ..."

जवाबों:


199

कहते हैं कि रिमोट है originऔर शाखा है master, और कहते हैं कि आपने पहले ही masterचेक आउट कर लिया है, निम्नलिखित प्रयास कर सकते हैं:

git fetch origin
git reset --hard origin/master

यह मूल रूप से केवल वर्तमान शाखा लेता है और इसे HEADदूरस्थ शाखा को इंगित करता है ।

चेतावनी : जैसा कि टिप्पणी में कहा गया है, यह अपने स्थानीय परिवर्तन फेंक होगा और जो कुछ भी मूल पर है के साथ ऊपर लिख

या आप पाइपलाइन कमांड का उपयोग अनिवार्य रूप से एक ही करने के लिए कर सकते हैं:

git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard

संपादित करें: मैं संक्षेप में यह बताना चाहता हूं कि यह क्यों काम करता है।

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

एक शाखा किसी दिए गए हैश के लिए एक नामित सूचक है। यहाँ एक उदाहरण सेट किया गया है:

$ find .git/refs -type f
.git/refs/tags/v3.8
.git/refs/heads/master
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master

इन फ़ाइलों में से प्रत्येक में एक कमिट की ओर इशारा करते हुए हैश होता है:

$ cat .git/refs/remotes/origin/master
d895cb1af15c04c522a25c79cc429076987c089b

ये सभी आंतरिक गिट भंडारण तंत्र के लिए हैं, और स्वतंत्र रूप से काम कर रहे डायरेक्टरी का काम करते हैं । निम्नलिखित कार्य करके:

git reset --hard origin/master

git उसी हैश मान पर वर्तमान शाखा को इंगित करेगा जो मूल / मास्टर को इंगित करता है। फिर यह उस हैश पर फ़ाइल संरचना / सामग्री से मेल खाने के लिए कार्यशील निर्देशिका को बदल देता है।

इसे काम पर देखने के लिए आगे बढ़ें और निम्न प्रयास करें:

git checkout -b test-branch
# see current commit and diff by the following
git show HEAD
# now point to another location
git reset --hard <remote>/<branch>
# see the changes again
git show HEAD

2
हाल ही में स्वीकृत संपादन से शुरुआत में बड़े पैमाने पर चेतावनी जोड़ते हुए, जैसे कि यह पहले ही उल्लेख किया गया है कि यह इंगित करना है: "तब [git] उस हैश में फ़ाइल संरचना / सामग्री से मिलान करने के लिए कार्यशील निर्देशिका को जबरदस्ती बदल देता है।" लेकिन लगता है कि पर्याप्त स्पष्ट नहीं था।
ट्रेवर नोरिस


5

निम्नलिखित आदेश सेट का उपयोग करके हल किया गया:

git reset --hard
git pull --rebase
git rebase --skip
git pull

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


3

यदि आप कभी भी इस समस्या को प्राप्त करने के लिए दौड़ते हैं git fetchऔर फिर git आपको git pullमर्ज संघर्ष ( संशोधित / अनमैरिड फ़ाइलों दोनों) और आपको अधिक निराश करने के कारण चलाने की अनुमति नहीं देता है, तो यह आपको किसी भी संघर्ष मार्कर को नहीं दिखाएगा फ़ाइल क्योंकि यह अभी तक विलय नहीं हुआ है)। यदि आप अपना काम खोना नहीं चाहते हैं, तो आप निम्नलिखित कार्य कर सकते हैं।

फ़ाइल को स्टेज करें।

$ git add filename

फिर स्थानीय परिवर्तनों को रोकें।

$ git stash

अपनी वर्किंग डायरेक्टरी को खींचें और अपडेट करें

$ git pull

अपनी स्थानीय संशोधित फ़ाइल को पुनर्स्थापित करें (यदि यह हो सके तो स्वचालित रूप से विलय हो जाएगा, अन्यथा इसे हल करें)

$ git stash pop

आशा है कि यह मदद करेगा।


2

यदि आप अपने स्थानीय परिवर्तनों को दूर नहीं करना चाहते हैं तो भी एक समाधान है। बस unmerged फ़ाइलों (द्वारा git addया git remove) को ठीक करें । फिर करते हैं git pull


1

यह मानते हुए कि आपके पास जो भी परिवर्तन हैं, उन्हें फेंकना चाहते हैं, पहले इसके आउटपुट की जांच करें git status। इसके बगल में "unmerged" कहने वाली किसी भी फ़ाइल के लिए, चलाएँ git add <unmerged file>। फिर साथ पालन करें git reset --hard। जो कि अनटैक की गई फ़ाइलों को छोड़कर किसी भी स्थानीय परिवर्तन से छुटकारा दिलाएगा।


अरे हाँ। इसे "अनमैरिड" नहीं कह सकते। यह "संशोधित दोनों" या शायद एक या दो अन्य बातें भी कह सकता है। का आउटपुट क्या है git status?
रयान स्टीवर्ट

इसे पोस्ट करने के बाद मैं टीम के सदस्य को सुझाव git rebase --abortदेने के लिए कह रहा हूँ और git pull --rebaseसुझाव के अनुसार git
ईसाई स्टीवर्ट

1

मैं स्थानीय रूप से अनमैरिड फ़ाइल को हटाने के साथ हल हो गया।

$ git rm <the unmerged file name>
$ git reset --hard
$ git pull --rebase
$ git rebase --skip
$ git pull
Already up-to-date.

जब मैं बाद में git कमिट भेजता हूं:

$ git commit . -m "my send commit"
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

0

रेयान स्टीवर्ट का जवाब लगभग वहीं था। उस स्थिति में जहां आप वास्तव में अपने स्थानीय परिवर्तनों को हटाना नहीं चाहते हैं, वहाँ एक वर्कफ़्लो है जिसे आप मर्ज कर सकते हैं:

  • दौड़ो git status। यह आपको अनमैरिड फाइल्स की लिस्ट देगा।
  • उन्हें (हाथ से, आदि) मर्ज करें
  • Daud git commit

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

Git तब मर्ज को सफल मानता है और आपको आगे बढ़ने की अनुमति देता है।

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