2012-01-25 14 views
19

हमने कुछ बुरा किया है।'गिट स्टेश'

हम एक विलय संघर्ष के दौरान git stash save भाग गए, और अब हम अपने काम को बहाल नहीं कर सकते हैं।

बातें हम कोशिश की है:

git pull -Xours origin master 
git stash apply --index 

और:

git pull origin master 
git stash save --keep-index "merge conflicts" 
git stash apply [email protected]{1} 

कृपया मदद!

+0

क्या आप वास्तव में कुछ भी महत्वपूर्ण करते थे? (क्या आपको वास्तव में स्टैश किए गए परिवर्तनों को पुनर्स्थापित करने की आवश्यकता है?) क्या आप अभी कोशिश किए गए विलय को रीसेट कर सकते हैं, और इसे फिर से कर सकते हैं? – Cascabel

+1

क्रमशः हाँ और नहीं। परिवर्तन विवाद समाधान के विलय के एक से अधिक दिनों से होते हैं। – bukzor

+3

@ बुकर: यदि आपको विवाद समाधान के विलय के लिए एक दिन की आवश्यकता है तो शाखा शाखा प्रबंधन और कार्य वितरण (या आवृत्ति मर्ज) के संबंध में आपकी नीतियों पर पुनर्विचार करने का समय हो सकता है। इस तरह के लंबे विलय संकल्प बाद में एक प्रतिबद्ध – Grizzly

उत्तर

0

जब आप एक विवादित स्थिति (अनुक्रमणिका और कार्यशील निर्देशिका) में हों, तो आप git stash नहीं कर पाएंगे - यह अनमोल प्रविष्टियों को एक त्रुटि देगी।

सुनिश्चित करें कि आपने वास्तव में एक छेड़छाड़ की है। git stauts और git stash show

+0

'गिट स्टैश' से पहले, मैंने संघर्षों का समाधान किया है और 'गिट एड' का उपयोग करने के लिए आगे बढ़ना है। मेरे संकल्पों में 'गिट एड' होने के बाद, मैंने और संपादन किए और फिर 'गिट स्टैश सेव msgstr' किया। तो यह सफल रहा। –

+0

@bukzor वास्तव में, मैंने अभी विंडोज 7 पर msysgit 1.8.3 के साथ इसका परीक्षण किया है। अगर फ़ाइल को विवादित छोड़ दिया गया है (यानी विलय संघर्ष को हल करने का कोई प्रयास नहीं किया गया है), तो 'गिट स्टैश सेव' वास्तव में निरस्त हो जाता है विवादित फ़ाइल को छेड़छाड़ करना तो *** यह वास्तव में सही है, यह झूठी नहीं है ***। –

18

मुद्दा यह है कि git stash शाखा आप में मर्ज करने के लिए कोशिश कर रहे थे के लिए एक संदर्भ नहीं सहेजता है प्रतीत हो रहा है के उत्पादन में मिलते हैं। किसी मर्ज के दौरान, इस MERGE_HEAD नाम के एक रेफरी में संग्रहित है।

इसे ठीक करने और अपने पहले वाली स्थिति में वापस पाने के लिए आपको संशोधन खोजने की जरूरत है (के नाटक करते हैं यह d7a9884a380f81b2fbf002442ee9c9eaf34ff68d है) आप में मर्ज करने के लिए कोशिश कर रहे थे, और यह करने के लिए MERGE_HEAD सेट आप गुप्त कोष में लागू करने के बाद।

तो फिर तुम गुप्त कोष (--index के साथ फिर से चरण के लिए सब कुछ है कि पहले का मंचन किया गया) लागू कर सकते हैं, और अपने MERGE_HEAD सेट:

git stash apply --index 
git update-ref MERGE_HEAD d7a9884a380f81b2fbf002442ee9c9eaf34ff68d 
+0

जबकि उपर्युक्त मेरे लिए सच है, मुझे पूरी तरह से भरोसा नहीं है कि बस MERGE_HEAD सेट करना और अनस्टैशिंग मर्ज स्थिति को पुनर्स्थापित करने के लिए पर्याप्त है। यदि संभव हो, तो संघर्ष के दौरान मैं गिट स्टैश का उपयोग करने से दूर रहूंगा। – user1338062

+1

मैं भी करूंगा, लेकिन इस बिंदु पर यह अंतराल है। – bukzor

1

को देखते हुए अपने पिछले टिप्पणी: यदि आप उपयोग कर सकते हैं

git stash megre --no-commit <branch> 

परिवर्तन

करने से तो आप क्या चाहते हैं के साथ इसे संशोधित बिना एक "मर्ज" राज्य में सूचकांक डाल करने के लिए:

+०१२३५१६४१०६

अगर आप पहले से ही गुप्त कोष में अपने मर्ज बाहर काम किया है:

git reset #to remove the "conflicts" flags 
git checkout <initial commit> -- ./ #to revert everything to the previous working state, 
git stash apply #apply your changes 

और एक बार सब कुछ वांछित स्थिति में है, git commit


बारे bukzor की टिप्पणी: वहाँ वास्तव में एक बड़ा है git checkout <tree-ish> और git checkout <tree-ish> -- <files> के बीच अंतर।

git checkout पर reference से:

  • git checkout <branch>: यह फार्म, सूचकांक को अद्यतन करने के पेड़ काम करके शाखाओं स्विच, और सिर निर्दिष्ट शाखा को प्रतिबिंबित या प्रतिबद्ध करने के लिए।

  • git checkout [-p|--patch] <tree-ish> -- <pathspec>: जब < पथ > या - पैच दिए जाते हैं, तो गिट चेकआउट शाखाओं को स्विच नहीं करता है। यह इंडेक्स फ़ाइल से या नामित < पेड़-आश > (अक्सर प्रायः एक प्रतिबद्ध) से कार्यरत पेड़ में नामित पथ अपडेट करता है।

git checkout <initial commit> वास्तव में मर्ज सूचनाओं को त्याग देगा।

git checkout <initial commit> -- ./ (ध्यान दें अतिरिक्त -- ./), दूसरे हाथ पर, मर्ज जानकारी रखने के लिए, और <initial commit> में अपने राज्य के लिए हर नज़र रखी फ़ाइल लौट जाएगा।

+0

'गिट चेकआउट' विलय की स्थिति को हटा देगा, है ना?मैं एक सामान्य प्रतिबद्धता के साथ समाप्त हो जाऊंगा जो मास्टर में सभी परिवर्तनों को डुप्लिकेट करता है। – bukzor

+0

'गिट स्टैश लागू' भी विलय स्थिति को साफ़ करता है, स्पष्ट रूप से एमईआरजीआईएचईएडी रेफरी को सेट करता है जैसा कि इवान के जवाब में सुझाव दिया गया है मेरे लिए चाल है –

+0

गिट 2 में, 'गिट स्टैश विलय' जैसी कोई कमांड नहीं है :( – dcorking

1

मैंने आज भी वही किया, और छेड़छाड़ से ठीक पहले राज्य में वापस आने के लिए एक अलग दृष्टिकोण (परीक्षण और त्रुटि के बाद) लिया ताकि मैं संघर्षों को हल करना जारी रख सकूं और विलय को पूरा कर सकूं।

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

$ git status 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: myproject/src/main/java/com/acme/package3/Class3.java 
# modified: myproject/src/main/java/com/acme/package3/Class4.java 
# 

इसके बाद, मैं एक पैच बनाया है और शाखा वापस पूर्व मर्ज स्थिति में रीसेट:

$ git diff HEAD > ~/merge-with-resolved-conflicts.patch 
$ git reset --hard HEAD 

तो मैं एक अस्थायी शाखा (मर्ज गंतव्य शाखा से प्राप्त) बनाया है, और लागू किया पैच:

$ git checkout -b my-temp-branch 
$ git apply ~/merge-with-resolved-conflicts.patch 
$ git commit -a -m "Merge with resolved conflicts" 

तो मेरी-अस्थायी शाखा के सिर अब सब कुछ है कि शेष संघर्ष के साथ हल संघर्षों के साथ फ़ाइलें, और फ़ाइलों सहित विलय कर दिया गया था, शामिल हैं।

तो मैं मूल शाखा में वापस स्विच, फिर से विलय कर दिया, और Git स्थिति

$ git checkout my-branch 
$ git merge other-branch 
$ git status 

को देखा स्थिति संघर्षों के साथ फ़ाइलों की पूरी सूची दिखाता है:

# Unmerged paths: 
# (use "git add <file>..." to mark resolution) 
# 
# both modified:  myproject/src/main/java/com/acme/package1/Class1.java 
# both modified:  myproject/src/main/java/com/acme/package2/Class2.java 
# both modified:  myproject/src/main/java/com/acme/package3/Class3.java 
# both modified:  myproject/src/main/java/com/acme/package3/Class4.java 
# 

अब मैं करने के लिए आवश्यक फ़ाइलों की इन दो सूचियों की तुलना करें। दूसरी सूची में कोई भी फाइल लेकिन पहले नहीं पहले ही हल हो चुकी है (इस उदाहरण में, कक्षा 1.जावा और कक्षा 2.जावा)। उन फ़ाइलों में से प्रत्येक के लिए तो, मैं अस्थायी शाखा से हल हो गई संघर्षों के साथ संस्करण में खींच लिया (जैसे चेरी ले, लेकिन एक पूरे के बजाय अलग-अलग फ़ाइलों के लिए प्रतिबद्ध):

$ git checkout my-temp-branch myproject/src/main/java/com/acme/package1/Class1.java 
$ git checkout my-temp-branch myproject/src/main/java/com/acme/package2/Class2.java 

यह किया है, मैं वापस आ गया था छेड़छाड़ से पहले राज्य में, इसलिए मैं शेष संघर्षों को हल करने और विलय करने के लिए फिर से शुरू कर सकता था।

0

मेरे समाधान (मर्ज संघर्ष के दौरान git छिपाने की जगह पॉप) इस से बाहर निकलना था:

  • बना सकते हैं और एक नया (स्थानीय) शाखा mytemporarybranch

    Git शाखा mytemporarybranch चेकआउट & & गिट चेकआउट mytemporarybranch

  • इस mytemporarybranch

    Git प्रतिबद्ध मी "मेरे गन्दा मर्ज और स्क्वैश"

  • चेकआउट myoriginalbranch में प्रतिबद्ध

    Git चेकआउट myoriginalbranch

  • मर्ज सही ढंग से

    Git (कोई स्क्वैश पॉप/इस समय लागू!)

  • स्क्वैश विलय mytemporarybranchmyoriginal शाखा पर मिलने --squash mytemporarybranch