कैसे क्षतिग्रस्त हुए परिवर्तनों को पुनर्प्राप्त करने के लिए


691

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

इसके अलावा, मैंने तब से कोडित फ़ाइलों के शीर्ष पर कुछ बदलाव किए हैं।

क्या कोई मौका है अगर मैं संभव हो तो एक नई शाखा में किए गए परिवर्तनों को पुनः प्राप्त कर सकता हूं?


7
क्या आपने 'स्टश पॉप' का उपयोग करने की कोशिश की है?
रॉबर्ट

नहीं। वास्तव में मैं नया हूं। जैसा कि मैं उन सभी आदेशों के बारे में पूरी तरह से नहीं जानता, जो मैंने कुछ और करने की कोशिश नहीं की! मैं उन परिवर्तनों को नहीं खोना चाहता।
अस्वथी पी कृष्णन

33
यदि आप न चाहते हुए भी स्टैक्ड परिवर्तन खो देते हैं, तो 'गिट स्टैश अप्लाई' का उपयोग करने का प्रयास करें। यह आपके द्वारा वर्तमान शाखा में किए गए परिवर्तनों को लागू करेगा, जबकि अभी भी स्टैश को बनाए रखना होगा। यदि सब कुछ ठीक है, तो स्टेश लगाने के बाद, आप 'git stash drop' का उपयोग करके, स्टेश को गिरा सकते हैं
robert

2
@robert भयानक उत्तर की तुलना में सरल उत्तर के लिए धन्यवाद (एक नौसिखिया के लिए) स्वीकृत उत्तर।
सहेल गोधेन

जवाबों:


1184

आसान सवाल का आसान जवाब है git stash apply

बस उस शाखा की जाँच करें जिस पर आप अपने परिवर्तन चाहते हैं, और फिर git stash apply। फिर git diffपरिणाम देखने के लिए उपयोग करें।

आपके द्वारा अपने बदलावों के साथ किए जाने के बाद- applyअच्छा लग रहा है और आपको यकीन है कि आपको किसी और को छिपाने की ज़रूरत नहीं है - फिरgit stash drop इसे हटाने के लिए उपयोग करें।

मैं हमेशा के git stash applyबजाय का उपयोग करने का सुझाव देता हूं git stash pop। अंतर यह है कि applyआसान के पुनः प्रयास के लिए apply, या देखने के लिए, इत्यादि के बारे में स्टेश को चारों ओर छोड़ देता है । यदि popस्टैश को निकालने में सक्षम है, तो यह तुरंत भी dropहो जाएगा, और यदि आपको अचानक पता चलता है कि आप इसे कहीं बाहर निकालना चाहते थे अन्य (एक अलग शाखा में), या साथ --index, या कुछ ऐसे, जो इतना आसान नहीं है। यदि आप apply, आप चुनते हैं कि कब करना है drop

यह सब बहुत मामूली है एक रास्ता या दूसरा, और नौसिखिया के लिए यह एक ही होना चाहिए। (और आप इस सब को छोड़ सकते हैं!)


यदि आप अधिक उन्नत या अधिक जटिल सामान कर रहे हैं तो क्या होगा?

कम से कम तीन या चार अलग-अलग "गिट स्टैश का उपयोग करने के तरीके" हैं, जैसा कि यह था। ऊपर "रास्ता 1" के लिए है, "आसान तरीका":

  1. आपने एक साफ़ शाखा से शुरुआत की, कुछ परिवर्तनों पर काम कर रहे थे, और तब महसूस किया कि आप उन्हें गलत शाखा में कर रहे हैं। आप बस अपने द्वारा अभी किए गए परिवर्तनों को लेना चाहते हैं और उन्हें दूसरी शाखा में "स्थानांतरित" करना चाहते हैं।

    यह आसान मामला है, ऊपर वर्णित है। भागो git stash save(या सादे git stash, एक ही बात)। दूसरी शाखा देखें और उपयोग करें git stash apply। यह आपके पहले के परिवर्तनों में विलय करने के लिए गिट हो जाता है, git के शक्तिशाली मर्ज तंत्र का उपयोग करके। यदि आप उन्हें पसंद करते हैं, तो परिणामों को सावधानीपूर्वक (साथ में git diff) देखें और यदि आप ऐसा करते हैं, git stash dropतो स्टैश को छोड़ने के लिए उपयोग करें। हो गया!

  2. आपने कुछ बदलाव शुरू किए और उन्हें प्रभावित किया। फिर आप दूसरी शाखा में चले गए और अधिक परिवर्तन शुरू कर दिए, यह भूल गए कि आपके पास स्टैक्ड हैं।

    अब आप रखना चाहते हैं, या यहां तक ​​कि इन बदलावों को भी आगे बढ़ाना चाहते हैं , और अपने स्टैश को भी लागू करना चाहते हैं।

    आप वास्तव में git stash saveफिर से कर सकते हैं , जैसा git stashकि परिवर्तनों का "स्टैक" करता है। यदि आप ऐसा करते हैं कि आपके पास दो झड़पें हैं, तो बस एक-जिसे stashआप बुला सकते हैं - आप stash@{0}एक वर्तनी भी लिख सकते हैं stash@{1}git stash listउन सभी को देखने के लिए (किसी भी समय) का उपयोग करें । सबसे नया हमेशा सबसे कम संख्या वाला होता है। जब आप git stash drop, यह सबसे नया गिरता है, और वह stash@{1}जो स्टैक के शीर्ष पर ले जाता है। यदि आपके पास और भी था , तो वह stash@{2}बन गया stash@{1}, और इसी तरह।

    आप कर सकते हैं applyऔर फिर dropएक विशिष्ट छिपाने की जगह भी: git stash apply stash@{2}और इतने पर। एक विशिष्ट गति को छोड़ना, केवल उच्च-क्रम वाले लोगों को पुन: लोड करता है। फिर, बिना नंबर वाला भी है stash@{0}

    यदि आप बहुत सारी चोरी करते हैं, तो यह काफी गन्दा हो सकता है (जैसा मैं चाहता था stash@{7}या stash@{4}वैसा ही था या नहीं । रुकिए, मैंने अभी एक और धक्का दिया है, अब वे 8 और 5 हैं?)। मैं व्यक्तिगत रूप से इन परिवर्तनों को एक नई शाखा में स्थानांतरित करना पसंद करता हूं, क्योंकि शाखाओं के नाम हैं, और cleanup-attempt-in-Decemberमेरे लिए बहुत अधिक है stash@{12}। ( git stashकमांड एक वैकल्पिक सेव-मैसेज लेता है, और वे मदद कर सकते हैं, लेकिन किसी भी तरह, मेरे सभी स्टैड्स केवल नाम को हवा देते हैं WIP on branch।)

  3. (अतिरिक्त-उन्नत) चलाने से पहले आपने अपने कोड का उपयोग किया है git stash save -p, या ध्यान से- git addऔर / या- git rmविशिष्ट विशिष्ट बिट्स git stash save। स्टैक्ड इंडेक्स / स्टेजिंग क्षेत्र में आपका एक संस्करण था, और काम करने वाले पेड़ में एक और (अलग) संस्करण था। आप यह सब संरक्षित करना चाहते हैं। तो अब आप उपयोग करते हैं git stash apply --index, और यह कभी-कभी विफल होता है:

    Conflicts in index.  Try without --index.
    
  4. आप git stash save --keep-index"क्या प्रतिबद्ध होगा" का परीक्षण करने के लिए उपयोग कर रहे हैं । यह एक इस उत्तर के दायरे से परे है; इसके बजाय यह अन्य StackOverflow उत्तर देखें ।

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

git status               # see if there's anything you need to commit
                         # uh oh, there is - let's put it on a new temp branch
git checkout -b temp     # create new temp branch to save stuff
git add ...              # add (and/or remove) stuff as needed
git commit               # save first set of changes

अब आप एक "साफ" शुरुआती बिंदु पर हैं। या शायद यह इस तरह से अधिक हो जाता है:

git status               # see if there's anything you need to commit
                         # status says "nothing to commit"
git checkout -b temp     # optional: create new branch for "apply"
git stash apply          # apply stashed changes; see below about --index

याद करने के लिए मुख्य बात "गुप्त कोष" वह यह है कि है एक प्रतिबद्ध, यह सिर्फ एक थोड़ा है "अजीब / अजीब" के लिए प्रतिबद्ध है कि "एक शाखा पर" नहीं है। applyक्या बदल प्रतिबद्ध पर आपरेशन दिखता है, और कोशिश करता यह दोहराने के लिए भी आप अब कर रहे हैं। यह स्‍टैश अब भी रहेगा ( applyइसे इधर-उधर रखा जाता है), इसलिए आप इसे और देख सकते हैं, या यह तय कर सकते हैं कि यह गलत जगह है applyऔर फिर से अलग-अलग या जो भी कोशिश करें।


किसी भी समय आपके पास एक स्टैश होता है, आप स्लैश git stash show -pमें क्या है का सरलीकृत संस्करण देखने के लिए उपयोग कर सकते हैं । (यह सरलीकृत संस्करण केवल "अंतिम कार्य ट्री" परिवर्तनों पर दिखता है, कि सहेजे गए अनुक्रमणिका परिवर्तन जो --indexअलग से पुनर्स्थापित होते हैं।) कमांड git stash apply, बिना --index, बस आपके कार्य-निर्देशिका में उन्हीं परिवर्तनों को करने की कोशिश करता है ।

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

git stash apply stash      # apply top of stash stack
git stash apply stash@{1}  # and mix in next stash stack entry too

आप यहां "लागू करें" ऑर्डर चुन सकते हैं, विशेष क्रम में आवेदन करने के लिए विशेष स्टैड्स निकाल सकते हैं। हालांकि, ध्यान दें कि हर बार जब आप मूल रूप से "गिट मर्ज" कर रहे होते हैं, और मर्ज प्रलेखन के रूप में चेतावनी देता है:

गैर-तुच्छ अप्रयुक्त परिवर्तनों के साथ रनिंग गिट मर्ज हतोत्साहित किया जाता है: जबकि संभव हो, यह आपको एक ऐसी स्थिति में छोड़ सकता है जो संघर्ष के मामले में वापस करना मुश्किल है।

यदि आप एक साफ निर्देशिका के साथ शुरू करते हैं और सिर्फ कई git applyऑपरेशन कर रहे हैं , तो यह वापस करना आसान है: git reset --hardस्वच्छ राज्य में वापस आने के लिए उपयोग करें, और अपने applyऑपरेशन को बदलें । (यही कारण है कि मैं इन जटिल मामलों के लिए पहले एक साफ काम करने वाली निर्देशिका में शुरू करने की सलाह देता हूं।)


सबसे खराब संभव मामले के बारे में क्या?

मान लीजिए कि आप बहुत सारे एडवांस गिट स्टफ कर रहे हैं, और आपने एक स्‍टैश बनाया है, और चाहते हैं git stash apply --index, लेकिन सहेजे गए स्‍टैश को लागू करना संभव नहीं है --index, क्‍योंकि आपके द्वारा सहेजे जाने के समय से ही शाखा बहुत अधिक बदल गई है।

यह वही git stash branchहै जिसके लिए है

अगर तुम:

  1. बाहर की जाँच सही प्रतिबद्ध आप पर जब आप मूल किया थे stash, तो
  2. एक नई शाखा बनाएँ, और अंत में
  3. git stash apply --index

परिवर्तनों को फिर से बनाने का प्रयास निश्चित रूप से काम करेगा । ये क्या करता है (और यह तब से स्टैश को गिरा देता है क्योंकि इसे सफलतापूर्वक लागू किया गया था।)git stash branch newbranch


कुछ अंतिम शब्दों के बारे में --index(क्या बिल्ली है?)

--indexसमझाने के लिए क्या करना आसान है, लेकिन आंतरिक रूप से थोड़ा जटिल है:

  • जब आपके पास परिवर्तन होते हैं, तो आपको आईएनजी git addसे पहले उन्हें (या "स्टेज") करना होगा commit
  • इस प्रकार, जब आप भाग गया git stash, तो आप हो सकता है दोनों फ़ाइलों को संपादित किया है fooऔर zorgहै, लेकिन केवल उन में से एक का मंचन किया।
  • तो जब आप गुप्त कोष में वापस पाने के लिए पूछना, यह अच्छा हो सकता है अगर यह git addहै addएड बातें करता है और नहीं git add गैर जोड़ा बातें। यही है, यदि आप addएड करते हैं, fooलेकिन zorgइससे पहले कि आप वापस नहीं करते हैं stash, तो यह ठीक है कि ठीक उसी सेटअप हो सकता है। क्या मंचन किया गया था, फिर से मंचन किया जाना चाहिए; क्या संशोधित किया गया था, लेकिन मंचन नहीं हुआ, फिर से संशोधित किया जाना चाहिए, लेकिन मंचन नहीं किया गया।

--indexकरने के लिए ध्वज applyइस तरह की स्थापना की बातें करने की कोशिश करता। यदि आपका कार्य-वृक्ष साफ है, तो यह आमतौर पर काम करता है। यदि आपके वर्क-ट्री में पहले से ही सामान addएड है, हालांकि, आप देख सकते हैं कि यहां कुछ समस्याएं कैसे हो सकती हैं। यदि आप बाहर निकलते हैं --index, तो applyऑपरेशन पूरे मंचित / अस्थिर सेटअप को संरक्षित करने का प्रयास नहीं करता है। इसके बजाय, यह सिर्फ "स्टैश बैग" में वर्क-ट्री कमिट का उपयोग करके गिट के मर्ज मशीनरी को आमंत्रित करता है । यदि आप मंचन / अस्थिरता को संरक्षित करने के बारे में परवाह नहीं करते हैं, तो बाहर जाना इसके काम को करने के --indexलिए बहुत आसान बनाता git stash applyहै।


2
मैं आपकी टिप्पणी नहीं समझता। क्या आपका मतलब है: आप भाग गए git stash pop? या क्या आपका मतलब है: आपने कुछ फ़ाइलों को संपादित किया है, लेकिन git stashअभी तक फिर से नहीं चला है? या आप पूरी तरह से कुछ और मतलब है?
torek

1
हाँ। ध्यान दें, मेरे (लंबे) संपादन में मैं यह सलाह देता हूं कि आपके पास अब applyएक स्टाश होने से पहले क्या है । आपको ऐसा करने की ज़रूरत नहीं है , लेकिन यह आपके लिए चीजों को बहुत सरल बनाता है। आप rebase -iएक साथ कई कमिट्स, या चेरी-पिक विशेष परिवर्तनों, या जो भी हो, बाद में स्क्वैश करने के लिए उपयोग कर सकते हैं ।
torek

1
हाँ: git stash apply --index(दो डैश याद रखें)। यदि आप बाहर निकलते हैं --index, तो कोई बड़ी बात नहीं; का एकमात्र बिंदु --indexमंचन / अस्थिर सेटअप रखना है। (शायद आपके पास पहले से कोई विशेष सेटअप नहीं था।) फिर git statusआदि, और / आदि वांछित के रूप में जोड़ें (जब और केवल जब) आप सभी को छिपाने की जगह के साथ किया जाता है, git stash dropइसे त्यागने के लिए उपयोग करें।
torek

1
जब तक आप (नहीं रखने dropया pop) गुप्त कोष में, आप हमेशा मूल स्टैश कोड सुरक्षित एक प्रतिबद्ध पर, क्योंकि एक गुप्त कोष में राशि है एक प्रतिबद्ध! यदि आप इसे वापस प्राप्त करना चाहते हैं, लेकिन एक शाखा पर, git stash branch(उस अनुभाग को देखें, या शून्या के उत्तर में प्रो गिट बुक देखें )। इसके बाद आप कर सकते हैं शाखा या कि बंद कि शाखा, आदि के लिए प्रतिबद्धgit checkoutgit cherry-pick
torek

2
@ChuckWolber: Git का नामकरण परंपराएं वांछित होने के लिए बहुत कुछ छोड़ती हैं (हम "दूरस्थ", "ट्रैकिंग" और "शाखा"?) शब्दों को कितने अलग-अलग अर्थ दे सकते हैं। यह ध्यान देने योग्य है कि आप मूल स्टैश से असंबंधित किसी चीज़ पर एक स्टेश लगा सकते हैं।
torek

57
git stash pop

सब कुछ वापस मिल जाएगा

जैसा कि टिप्पणियों में सुझाया गया है, आप git stash branch newbranchएक नई शाखा में स्टेश लगाने के लिए उपयोग कर सकते हैं , जो चलने के समान है:

git checkout -b newbranch
git stash pop

सहायता के लिए धन्यवाद। क्या मैं उन परिवर्तनों को एक नई शाखा में प्राप्त कर सकता हूँ? अभी मैं विकसित शाखा पर हूँ
अश्वत्थ पी कृष्णन

3
git stash ब्रांच newbranch, स्टैक्ड परिवर्तन के साथ एक नई ब्रांच बनाएगा।
रॉबर्ट

3
@ रॉबर्ट: git stash branch newbranchवास्तव में ऐसा करेगा; लेकिन इस बात का ध्यान रखें कि यह अपने माता-पिता के साथ नई शाखा बनाता है जो HEADउस समय stashकिए गए वचन के अनुसार था । दूसरे शब्दों में, यह जब आप कुछ देर तक हैक सत्र या जो कुछ भी, गंदगी पर ताक के बाद वापस आते हैं, और तय "मैं डाल दिया है चाहिए कि एक शाखा पर, बल्कि stashing से" के लिए है :-)
torek

मैंने अपना प्रश्न संपादित किया है। यदि संभव हो तो मैं उन परिवर्तनों को एक नई शाखा में लाना चाहता हूं।
अश्विनी पी कृष्णन

1
कभी-कभी आप सिर्फ TLDR जवाब चाहते हैं :)
sachinruk

24

इसे सरल बनाने के लिए, आपके पास अपने स्टैप को फिर से करने के लिए दो विकल्प हैं:

  1. git stash pop - सहेजे गए स्थिति में वापस पुनर्स्थापित करें, लेकिन यह अस्थायी संग्रहण से स्टैश को हटा देता है।
  2. git stash apply - सहेजे गए राज्य में वापस पुनर्स्थापित करें और संभव बाद के पुन: उपयोग के लिए स्टैश सूची को छोड़ देता है।

आप इस लेख में गिट स्टैल्स के बारे में अधिक विस्तार से पढ़ सकते हैं ।


19

अपनी स्‍टैश सामग्री की जांच करने के लिए: -

गिट स्टैश सूची

किसी विशेष स्टैश नंबर को स्टैश सूची से लागू करें: -

git स्लैश लागू स्लैश @ {2}

या सिर्फ पहला स्टेश लगाने के लिए: -

git stash पॉप

नोट: git स्‍टैश पॉप आपकी स्‍टैश सूची से स्‍टैश को हटा देगा जबकि git स्‍टैश लागू नहीं करेगा। इसलिए उसी के अनुसार उनका उपयोग करें।


2

मैक पर यह मेरे लिए काम किया:

git स्‍टैश सूची (अपनी सभी स्‍टेश देखें)

git stash list

git stash लागू होता है (अपनी स्‍टैश सूची से केवल वह नंबर जो आप चाहते हैं)

इस तरह:

git stash apply 1

0

आप "git stash" का उपयोग करके अनचाहे बदलावों को रोक सकते हैं, फिर "git checkout -b" का उपयोग करके एक नई शाखा में चेकआउट करें, फिर स्टैक्ड कमिट "git stash apply" लागू करें

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