क्यों कहता है "खींचो संभव नहीं है क्योंकि आपके पास फाइलें नहीं हैं"?


195

जब मैं टर्मिनल में अपनी परियोजना निर्देशिका में खींचने की कोशिश करता हूं, तो मुझे निम्नलिखित त्रुटि दिखाई देती है:

harsukh@harsukh-desktop:~/Sites/branch1$ git pull origin master
U app/config/app.php
U app/config/database.php
U app/routes.php
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

जीआईटी क्यों कहता है "Pull is not possible because you have unmerged files", और मैं इसे कैसे हल कर सकता हूं?


1
मेरे मामले में मैंने इन कमांडों का उपयोग किया है "git add।" फिर "Git -m प्रतिबद्ध" टेस्ट "और अंत में" Git धक्का "त्रुटि हटा दिया।
Akhzar नजीर

आपको बस "$ git add <file>" जोड़ने की जरूरत है ... यह अपडेट करने के लिए कि क्या प्रतिबद्ध होगा या पुनर्स्थापित करेगा (कार्यशील निर्देशिका में परिवर्तन को त्यागने के लिए) फिर "$ git कमिट" करें, फिर "$ git पुश" को मर्ज करने के लिए।
Find_X

मामले में यह मदद करता है: मैंने देखा है कि बस "गिट ऐड" कर रहा है। तब कमिट करने से काम नहीं चला। मुझे नाम से अलग-अलग फाइल को जोड़ना था, फिर कमिट और पुश / पुश करना था।
इयोनोमोस

जवाबों:


212

वर्तमान में क्या हो रहा है, कि आपके पास कुछ फ़ाइलों का एक सेट है, जिसे आपने पहले विलय करने की कोशिश की है, लेकिन उन्होंने मर्ज टकराव को फेंक दिया। आदर्श रूप से, यदि किसी को एक मर्ज संघर्ष मिलता है, तो उसे मैन्युअल रूप से हल करना चाहिए, और बदलाव का उपयोग करना चाहिए git add file.name && git commit -m "removed merge conflicts"। अब, किसी अन्य उपयोगकर्ता ने अपनी रिपॉजिटरी पर विचाराधीन फाइलों को अपडेट किया है, और अपने परिवर्तनों को आम अपस्ट्रीम रेपो में धकेल दिया है।

ऐसा होता है, कि आपका मर्ज अंतिम प्रतिबद्ध से (शायद) हल नहीं हुआ है, इसलिए आपकी फ़ाइलों को सभी सही मर्ज नहीं किया गया है, और इसलिए U( unmerged) फ़ाइलों के लिए ध्वज। तो अब, जब आप एक करते हैं, तो git pullगिट त्रुटि को फेंक रहा है, क्योंकि आपके पास फ़ाइल का कुछ संस्करण है, जो सही ढंग से हल नहीं हुआ है।

इसे हल करने के लिए, आपको प्रश्न में मर्ज संघर्षों को हल करना होगा, और परिवर्तनों को जोड़ना और प्रतिबद्ध करना होगा, इससे पहले कि आप कर सकें git pull

नमूना प्रजनन और समस्या का समाधान:

# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params`
Desktop $ cd test

सबसे पहले, हम रिपॉजिटरी संरचना बनाते हैं

test $ mkdir repo && cd repo && git init && touch file && git add file && git commit -m "msg"
repo $ cd .. && git clone repo repo_clone && cd repo_clone
repo_clone $ echo "text2" >> file && git add file && git commit -m "msg" && cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

अब हम repo_clone में हैं, और यदि आप एक करते हैं git pull, तो यह टकराव पैदा करेगा

repo_clone $ git pull origin master
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/anshulgoyal/Desktop/test/test/repo
 * branch            master     -> FETCH_HEAD
   24d5b2e..1a1aa70  master     -> origin/master
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

यदि हम क्लोन में संघर्षों को अनदेखा करते हैं, और मूल रेपो में अब और अधिक हंगामा करते हैं,

repo_clone $ cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

और फिर हम एक करते हैं git pull, हम प्राप्त करते हैं

repo_clone $ git pull
U   file
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

ध्यान दें कि fileअब एक असंक्रमित राज्य में है और अगर हम एक करते हैं git status, तो हम स्पष्ट रूप से देख सकते हैं:

repo_clone $ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)

You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      file

इसलिए, इसे हल करने के लिए, हमें पहले मर्ज संघर्ष को हल करने की आवश्यकता है जिसे हमने पहले अनदेखा किया था

repo_clone $ vi file

और इसकी सामग्री सेट करें

text2
text1
text1

और फिर इसे जोड़ें और बदलाव करें

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts

1
पूर्ण होने के लिए, मैं संघर्षों को हल करने के लिए 'पवन मेरिजेट' का उपयोग करने के लिए पवन के उत्तर को जोड़ूंगा। दूसरा-से-अंतिम चरण बहुत व्यावहारिक नहीं हो सकता है ("मर्ज को हल करें ... [सेटिंग द्वारा] ... इसकी सामग्री को: [कुछ पाठ]")।
निर्विवाद रूप से

वैकल्पिक रूप से, आप @ user261 की सलाह का उपयोग करके विलय कर सकते हैं। किसी भी तरह से, मुझे लगता है कि एक व्यावहारिक अर्थ में विलय करने के बारे में एक कदम जोड़ना इस जवाब को पूरा करेगा।
undeniablyrob

3
यह उत्तर वास्तव में अच्छी तरह से काम करता है जब आपके पास एकल फ़ाइलों को ठीक करने के लिए सरल संघर्ष होते हैं। उदाहरण के लिए, कोड की एक या दो लाइनें जो अलग-अलग होती हैं। यदि आपके पास कई फाइलें हैं, जिन्हें भारी रूप से संशोधित किया गया है, तो यह एक कठिन फिक्स है। लेकिन यह इस विचार को घर देता है कि कठिन संघर्षों से बचने के लिए आपको Git के साथ अक्सर प्रतिबद्ध होना चाहिए।
वॉन डी। टेलर

46

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

रिमोट: ए <- बी <- सी <- डी
स्थानीय: ए <- बी *
(* इंगित करता है कि आपके पास कई फाइलें हैं जो संशोधित की गई हैं, लेकिन प्रतिबद्ध नहीं हैं।)

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

विकल्प एक: उन परिवर्तनों को दूर करें जिन्हें
आप या तो git checkoutप्रत्येक अनमैरिड फ़ाइल के लिए उपयोग कर सकते हैं, या आप git reset --hard HEADअपनी शाखा की सभी फ़ाइलों को HEAD में रीसेट करने के लिए उपयोग कर सकते हैं । वैसे, आपकी स्थानीय शाखा में HEAD बिना किसी तारांकन के B है। यदि आप यह विकल्प चुनते हैं, तो आरेख बन जाता है:

रिमोट: ए <- बी <- सी <- डी
स्थानीय: ए <- बी

अब जब आप खींचते हैं, तो आप मास्टर से परिवर्तनों के साथ अपनी शाखा को तेजी से अग्रेषित कर सकते हैं। खींचने के बाद, आप शाखा मास्टर की तरह दिखेंगे:

स्थानीय: ए <- बी <- सी <- डी

विकल्प दो: परिवर्तनों को फिर से रखें
यदि आप बदलावों को रखना चाहते हैं, तो आप पहले प्रत्येक फाइल में किसी भी मर्ज संघर्ष को हल करना चाहेंगे। आप अपनी IDE में प्रत्येक फ़ाइल को खोल सकते हैं और निम्नलिखित प्रतीकों की तलाश कर सकते हैं:

<<<<<<< HEAD
// कोड का आपका संस्करण
=======
// कोड का रिमोट संस्करण
>>>>>>>>

Git आपको कोड के दो संस्करणों के साथ प्रस्तुत कर रहा है। HEAD मार्कर के भीतर निहित कोड आपकी वर्तमान स्थानीय शाखा का संस्करण है। अन्य संस्करण वह है जो रिमोट से आ रहा है। एक बार जब आपने कोड का एक संस्करण चुन लिया (और मार्करों के साथ अन्य कोड हटा दिया गया), तो आप टाइप करके प्रत्येक फ़ाइल को अपने स्टेजिंग क्षेत्र में जोड़ सकते हैं git add। अंतिम कदम git commit -m एक उचित संदेश के साथ टाइप करके अपना परिणाम देना है । इस बिंदु पर, हमारा आरेख इस तरह दिखता है:

दूरस्थ: A <- B <- C <- D
स्थानीय: A <- B <- C '

यहाँ मैंने 'C' के रूप में बनी कमिट को लेबल किया है क्योंकि यह रिमोट पर कमिट C से अलग है। अब, यदि आप खींचने की कोशिश करते हैं तो आपको एक गैर-फास्ट फॉरवर्ड त्रुटि मिलेगी। Git आपकी शाखा पर रिमोट में परिवर्तन नहीं कर सकता है, क्योंकि आपकी शाखा और रिमोट दोनों ने सामान्य पूर्वजों द्वारा किए गए बी से विचलन कर दिया है। इस बिंदु पर, यदि आप खींचना चाहते हैं तो आप रिमोट पर अपनी शाखा git mergeया दूसरी git rebaseशाखा भी कर सकते हैं ।

Git की महारत हासिल करने के लिए uni- दिशात्मक लिंक्ड सूचियों को समझने और हेरफेर करने में सक्षम होने की आवश्यकता होती है। मुझे उम्मीद है कि यह स्पष्टीकरण आपको Git का उपयोग करने के बारे में सही दिशा में सोच रहा होगा।


33

इसका एक सरल उपाय है। लेकिन इसके लिए आपको सबसे पहले निम्न सीखना होगा

vimdiff

संघर्षों को दूर करने के लिए, आप उपयोग कर सकते हैं

git mergetool

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


2
मैं कहूंगा कि vimdiff की आवश्यकता नहीं है (आप अपनी पसंद के किसी भी मर्ज / डिफरेंट टूल का उपयोग कर सकते हैं, जैसे कि WinMerge, या OSX की अंतर्निहित FileMerge, आदि)। ऐसा कहने के बाद, यह @ म्यू के जवाब के लिए एक बढ़िया अतिरिक्त है।
निर्विवाद रूप से

32

यदि आप परिवर्तनों को मर्ज नहीं करना चाहते हैं और फिर भी अपने स्थानीय को अपडेट करना चाहते हैं तो चलाएं:

git reset --hard HEAD  

यह आपके लोकल को HEAD के साथ रीसेट करेगा और फिर git पुल का उपयोग करके अपने रिमोट को खींचेगा।

यदि आपने पहले ही अपना मर्ज स्थानीय रूप से कर लिया है (लेकिन अभी तक रिमोट से धक्का नहीं दिया है), और इसे वापस भी लेना चाहते हैं:

git reset --hard HEAD~1 

6

यदि आप स्थानीय रूप से चलाने के लिए एक दूरस्थ शाखा को खींचना चाहते हैं (समीक्षा या परीक्षण के उद्देश्यों के लिए कहें), और जब आपको $ git pullस्थानीय मर्ज का सामना करना पड़ता है:

$ git checkout REMOTE-BRANCH
$ git pull  (you get local merge conflicts)
$ git reset --hard HEAD (discards local conflicts, and resets to remote branch HEAD)
$ git pull (now get remote branch updates without local conflicts)

5

आपके पास स्थानीय रूप से कुछ फाइलें हैं जिन्हें आप खींचने से पहले मर्ज करने की आवश्यकता है। आप फ़ाइलों को चेकआउट कर सकते हैं और फिर अपनी स्थानीय फ़ाइलों को अधिलेखित करने के लिए खींच सकते हैं।

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master

विलय दो फ़ाइलों की सामग्री को जोड़ती है। वर्तमान में आपकी स्थानीय फाइलें दूरस्थ सर्वर के लोगों से भिन्न हैं। दूरस्थ सर्वर पर विलय किया जाना चाहिए। इसलिए यदि आप अपनी संपादित फ़ाइलों को चरणबद्ध करते हैं और उन्हें धक्का देते हैं, तो आपके परिवर्तन को रिपॉजिटरी की फाइलों में जोड़ दिया जाएगा। तब आपकी फाइलें सिंक में होंगी और आप पूरे प्रोजेक्ट को अन्य परिवर्तनों के साथ खींच सकते हैं। जब मैंने git का उपयोग करना शुरू किया तो मुझे git हेल्प बुक बहुत मददगार लगी। आप इसे यहाँ पा सकते हैं: git-scm.com/book/en/Getting-Started
Nick

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

आह हाँ यह सच है, मेरी क्षमायाचना। मैं एक आसान जवाब देने की कोशिश कर रहा था
निक 8

ठीक है, अगर आपके पास किसी कमेटी का विलय करते समय टकराव होता है, तो हाँ, आपके पास परस्पर विरोधी, अनमर्ल्ड फाइलें होंगी और आपको उन्हें मर्ज करने की आवश्यकता होगी।
एडवर्ड थॉमसन

3

अनुसरण करने के चरण:

step-1 : git reset --hard HEAD  (if you want to reset it to head)
step-2 : git checkout Master 
step-3 : git branch -D <branch Name>
(Remote Branch name where you want to get pull) 
step-4 : git checkout <branch name>
step-5 : git pull. (now you will not get any
error)

धन्यवाद, सर्बशीश


2

मेरे साथ भी यही मुद्दा था
। मेरे मामले में, कदम नीचे दिए गए हैं-

  1. सभी फ़ाइल को हटा दिया गया है जो यू (अनमरजेड) प्रतीक के साथ शुरू हो रहा था । जैसा-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. मास्टर से कोड खींचो

$ git pull origin master
  1. स्टेटस के लिए जाँच की गई

 $ git status

यहाँ संदेश है जो यह दिखाई दिया-
और क्रमशः 2 और 1 अलग-अलग प्रतिबद्ध हैं। तुम्हारे पास अनमने रास्ते हैं।
(use "git pull" to merge the remote branch into yours)

(fix conflicts and run "git commit")

जलमग्न पथ:
(संकल्प को चिह्नित करने के लिए "git add ..." का उपयोग करें)

both modified:   project/app/pages/file1/file.ts
both modified:   project/www/assets/file1/file-name.html
  1. सभी नए बदलाव जोड़े गए -

    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. सिर पर बदलाव के लिए प्रतिबद्ध-

$ git commit -am "resolved conflict of the app."
  1. कोड को धक्का दिया -

$ git push origin master

इस छवि के साथ कौन सा मोड़ हल हो सकता है - यहां छवि विवरण दर्ज करें


1

जब मर्ज संघर्ष होता है, तो आप अलग-अलग फ़ाइल खोल सकते हैं। आपको "<<<<<<<< या >>>>>>>>" प्रतीक मिलेंगे। ये आपके परिवर्तनों और रिमोट पर मौजूद परिवर्तनों का उल्लेख करते हैं। आप मैन्युअल रूप से उस हिस्से को संपादित कर सकते हैं जिसकी आवश्यकता है। इसके बाद फाइल को सेव करें और फिर करें: git add

मर्ज की उलझनों का समाधान होगा।


-1

बस इस कमांड को चलाएं:

git reset --hard

3
आपको समझाना चाहिए कि कमांड क्या करता है, क्योंकि कुछ लोग बहुत निराश होंगे यदि वे कोशिश करते हैं और यह पता
लगाते हैं

यह तब काम करता है जब आप केवल बाहरी अस्थायी स्रोत में अपने परिवर्तनों को कॉपी करते हैं .. यदि आपने केवल एक प्रोजेक्ट के लिए कुछ फ़ाइलों को उदाहरण के लिए कॉन्फ़िगर किया है तो यह एकदम सही है। कमांड को ले जाएं और फिर अपने परिवर्तनों को वापस लाएं। मेरे लिये कार्य करता है!
cwiggo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.