गिट स्टैश ब्लंडर: गिट स्टैश पॉप और मर्ज संघर्ष के साथ समाप्त हुआ


200

मैंने git stash popमर्ज संघर्षों के साथ किया और समाप्त किया। मैंने फ़ाइल सिस्टम से फ़ाइलों को हटा दिया और git checkoutनीचे दिखाए अनुसार किया, लेकिन यह सोचता है कि फाइलें अभी भी अनमैरिड हैं। मैंने फिर फ़ाइलों को बदलने और git checkoutफिर से और उसी परिणाम को करने की कोशिश की । मैंने घटना को -fझंडे के साथ मजबूर करने की कोशिश की । किसी भी सहायता की सराहना की जाएगी!

chirag-patels-macbook-pro:haloror patelc75$ git status
app/views/layouts/_choose_patient.html.erb: needs merge
app/views/layouts/_links.html.erb: needs merge
# On branch prod-temp
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   db/schema.rb
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       unmerged:   app/views/layouts/_choose_patient.html.erb
#       unmerged:   app/views/layouts/_links.html.erb

chirag-patels-macbook-pro:haloror patelc75$ git checkout app/views/layouts/_choose_patient.html.erb
error: path 'app/views/layouts/_choose_patient.html.erb' is unmerged
chirag-patels-macbook-pro:haloror patelc75$ git checkout -f app/views/layouts/_choose_patient.html.erb
warning: path 'app/views/layouts/_choose_patient.html.erb' is unmerged

नोट: राज्य को बहाल करने से पहलेgit stash apply/pop Git 2.5 (Q2 2015) के साथ आसान होना चाहिए, काम कर पेड़ अब साफ होने की जरूरत है के बाद से: देखने के लिए नीचे दिए गए मेरा उत्तर
VonC

जवाबों:


219

देखें आदमी मग मर्ज ( हलफनामा कैसे प्राप्त करें ):

संघर्ष देखने के बाद, आप दो काम कर सकते हैं:

  • विलय न करने का निर्णय लें। केवल क्लीन-अप्स की आपको आवश्यकता है कि सूचकांक फाइल को एचईएडी को उलटा करने के लिए २. और ३ और ३ के द्वारा किए गए काम के पेड़ के परिवर्तनों को साफ करने के लिए रीसेट किया जाए; इसके लिए git-reset -hard का उपयोग किया जा सकता है।

  • संघर्षों को हल करें। Git काम के पेड़ में संघर्षों को चिह्नित करेगा। फ़ाइलों को आकार में संपादित करें और उन्हें अनुक्रमणिका में जोड़ें। सौदे को सील करने के लिए कमिट का उपयोग करें।

और TRER MERGE के तहत (यह देखने के लिए कि क्या 2. और 3. संदर्भित है):

जब यह स्पष्ट नहीं होता है कि परिवर्तनों को कैसे समेटना है, तो निम्न होता है:

  1. HEAD पॉइंटर वही रहता है।

  2. MERGE_HEAD रेफरी अन्य शाखा प्रमुख को इंगित करने के लिए सेट किया गया है।

  3. अनुक्रमणिका फ़ाइल और आपके कार्यशील ट्री में क्लीन मर्ज किए गए पथ दोनों को अपडेट किया गया है।

  4. ...

इसलिए: git reset --hardयदि आप अपने काम के पेड़ से आने वाले बदलावों को हटाना चाहते हैं, या git resetयदि आप केवल सूचकांक को साफ करना चाहते हैं और अपने काम के पेड़ में संघर्षों को हाथ से विलय करना चाहते हैं , तो इसका उपयोग करें ।

मैन गेट स्टैश ( विकल्प, पॉप ) के तहत आप इसके अलावा पढ़ सकते हैं:

राज्य को लागू करना संघर्षों के साथ विफल हो सकता है; इस स्थिति में, इसे स्‍टैश सूची से हटाया नहीं जाता है। आपको हाथ से संघर्ष को हल करने और बाद में मैन्युअल रूप से गिट स्टैश ड्रॉप को कॉल करने की आवश्यकता है।


9
वास्तव में, आपके द्वारा एक स्लैश छोड़ने के बाद भी, इसे फिर से प्राप्त करने के लिए अभी भी संभव है (और अधिक कठिन है), क्योंकि परिवर्तन अभी भी रिपॉजिटरी में मौजूद है। stackoverflow.com/search?q=git+recover+dropped+stash
phils

3
@ हंसिए: वह अच्छा है या बुरा? मेरे जवाब को बेहतर बनाने के लिए आपका स्वागत है, जहाँ आप इसे पहली बार में नहीं समझ पाए ...
tanascius

1
मुझे लगता है कि स्रोत कोड संशोधन एक जटिल समस्या डोमेन है। भ्रमित होना आसान है। मुझे अभी भी लगता है कि आपका उत्तर अच्छा है क्योंकि इसने मेरे दृष्टिकोण को पुन: पुष्टि की है।
nalply

1
इससे न केवल यह महसूस करने में मुझे बहुत मदद मिली कि मेरे द्वारा ग्रहण किए गए अनुसार स्टैश को हटा नहीं दिया गया है, लेकिन यह बताता है कि जब मैं निश्चित था कि मैं अपनी चीजों को पुनः प्राप्त करना नहीं भूल रहा था तब भी मेरा स्टैश बढ़ता रहा।
थोरानो 16

11
"राज्य को लागू करना संघर्षों के साथ विफल हो सकता है; इस मामले में, इसे स्टैश सूची से हटाया नहीं जाता है।" यह मेरी राय में, पोस्ट का सबसे महत्वपूर्ण हिस्सा है। बड़े, मैत्रीपूर्ण अक्षरों में DON'T PANIC शब्दों के साथ इसे सामने रखने के लिए अपने उत्तर को संपादित करने पर विचार करें । (हालांकि पहले से ही।) धन्यवाद।
पैट्रिक एम

42

मेरे साथ भी ऐसा ही हुआ था। मैं अभी तक फ़ाइलों को चरणबद्ध नहीं करना चाहता था इसलिए मैंने उनके साथ जोड़ा git addऔर फिर बस किया git reset। यह मूल रूप से अभी जोड़ा गया है और फिर मेरे बदलावों को अस्थिर कर दिया है लेकिन अनजाने रास्तों को साफ कर दिया है।


4
यह उपयोग करने से बेहतर प्रतीत होता है reset --hardक्योंकि यह आपकी फ़ाइलों को अधिलेखित नहीं करता है (मर्ज की समस्याओं को छोड़कर)। धन्यवाद!
sinelaw

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

2
git addउन्हें मंच देता है लेकिन git reset, जो मैं तुरंत करता हूं, उन्हें अस्थिर करता है। अनिवार्य रूप से यह अनजाने रास्तों को साफ करता है और मुझे अपने सामान्य काम करने वाले पेड़ को बाहर निकाल कर लौटाता है।
हारून

3
git addयदि आप करने जा रहे हैं तो आपको इसकी आवश्यकता नहीं है git resetgit resetप्रभावी रूप से "नाश कर देती है" git addgit reset( --mixed<- डिफ़ॉल्ट) प्रभावी रूप से कार्यशील निर्देशिका को स्पर्श नहीं करता है, ठीक उसी प्रकार जो आपकी कार्यशील निर्देशिका में था, संघर्षों और सभी को मिला देता है, अकेला छोड़ दिया जाता है। सूचकांक (और तकनीकी रूप से शाखा प्रमुख) को रीसेट किया जाता है (रेफरी के बिना उन्हें फिर से रीसेट किया जाता है HEAD, जिसका अर्थ है कि शाखा प्रमुख के लिए कोई परिवर्तन नहीं है, और प्रभावी git addरूप से सूचकांक में किए गए किसी भी परिवर्तन को अनसुना कर देता है, साथ ही साथ अनर्जित रास्तों को साफ करता है) ।
बम्बाम्स

3
अनुक्रम , संपादित करें / संकल्प , git resetऔर git stash dropअच्छी तरह से काम करता है। यह वही करता है जो git stash popबिना किसी संघर्ष के किया जाता। ऐसा लगता git addहै कि जरूरत नहीं है; यद्यपि यह शायद उपयोगी है, लेकिन आपके पास संघर्षों के साथ कई फाइलें हैं। जैसा कि प्रत्येक को हल किया जाता है , उन्हें जोड़ा जा सकता है और उन git statusपर नज़र रखी जा सकती है।
आर्टलेस शोर

13

अगर, मेरी तरह, आप आमतौर पर जो चाहते हैं, वह स्टैक्ड फ़ाइलों के साथ वर्किंग डायरेक्टरी की सामग्री को ओवरराइट करना है, और आपको अभी भी एक संघर्ष मिलता है, तो आप जो चाहते हैं वह संघर्ष का उपयोग करके हल करना है git checkout --theirs -- . रूट से ।

उसके बाद, आप कर सकते हैं git reset इंडेक्स से वर्किंग डायरेक्टरी में सभी बदलाव ला , क्योंकि जाहिर तौर पर संघर्ष के मामले में गैर-विवादित फाइलों में बदलाव इंडेक्स में रहते हैं।

हो सकता है कि आप git stash drop [<stash name>]बाद में भी भागना चाहें , ताकि आप git stash popटकराव से छुटकारा पा सकें ।


2

ध्यान दें कि Git 2.5 (Q2 2015) भविष्य का Git उस परिदृश्य को असंभव बनाने की कोशिश कर सकता है।

देखें ed178ef प्रतिबद्ध द्वारा जेफ राजा ( peff), 22 अप्रैल 2015
(द्वारा विलय Junio सी Hamano - gitster- में प्रतिबद्ध 05c3967 , 19 मई 2015)

नोट: इसे वापस कर दिया गया है। नीचे देखें

stash: लागू करने के लिए एक स्वच्छ सूचकांक की आवश्यकता है / पॉप

संकट

यदि आपने अपनी अनुक्रमणिका में सामग्री का मंचन किया है और " stash apply/pop" चलाएं , तो हम एक विरोधाभास पर चोट कर सकते हैं और नई प्रविष्टियों को सूचकांक में डाल सकते हैं।
अपनी मूल स्थिति को पुनर्प्राप्त करना उस बिंदु पर मुश्किल है, क्योंकि "गिट रीसेट - ऐसिस्ट" जैसे उपकरण कुछ भी मंचन को उड़ा देंगे

दूसरे शब्दों में:

" git stash pop/apply" यह सुनिश्चित करना भूल गया कि न केवल काम करने वाला पेड़ साफ है, बल्कि सूचकांक भी साफ है।
उत्तरार्द्ध एक महत्वपूर्ण है क्योंकि एक टकराव आवेदन संघर्ष कर सकता है और सूचकांक का उपयोग संघर्ष समाधान के लिए किया जाएगा।

उपाय

जब परिवर्तन का मंचन किया जाता है तो हम इसे लागू करने से इनकार कर सकते हैं।

इसका मतलब है कि अगर संशोधित फ़ाइलों पर एक स्लैश लागू करने से पहले विलय होते थे (जोड़ा गया था, लेकिन प्रतिबद्ध नहीं था), तो अब वे कोई विलय नहीं होंगे, क्योंकि स्लैश लागू / पॉप के साथ तुरंत बंद हो जाएगा:

Cannot apply stash: Your index contains uncommitted changes.

आपको परिवर्तनों को करने के लिए मजबूर करने का मतलब है कि, विलय के मामले में, आप आसानी से प्रारंभिक स्थिति (पहले git stash apply/pop) को बहाल कर सकते हैं git reset --hard


1937610 (15 जून 2015) को प्रतिबद्ध देखें , और जेफ किंग ( ) द्वारा ed178ef (22 अप्रैल 2015) प्रतिबद्ध हैं(द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध bfb539b , 24 जून 2015)peff
gitster

यह प्रतिबद्ध एक कड़ी को लागू करने की सुरक्षा को बेहतर बनाने का एक प्रयास था, क्योंकि आवेदन प्रक्रिया में परस्पर विरोधी सूचकांक प्रविष्टियाँ हो सकती हैं, जिसके बाद मूल सूचकांक स्थिति को बहाल करना कठिन है।

दुर्भाग्य से, यह " git stash -k" के आसपास कुछ सामान्य वर्कफ़्लो को चोट पहुँचाता है , जैसे:

git add -p       ;# (1) stage set of proposed changes
git stash -k     ;# (2) get rid of everything else
make test        ;# (3) make sure proposal is reasonable
git stash apply  ;# (4) restore original working tree

यदि आप चरणों (3) और (4) के बीच "कमिट" करते हैं, तो यह बस काम करता है। हालाँकि, यदि ये चरण प्री-कमिट हुक का हिस्सा हैं, तो आपके पास वह अवसर नहीं है (आपको परीक्षणों को पारित या असफल हुए बिना मूल राज्य को पुनर्स्थापित करना होगा)।

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