मैं किसी भी फ़ाइल (या फ़ाइल में परिवर्तन) को गिट स्टैश से कैसे निकालूँगा?


772

मैं यह जानना चाहूंगा कि क्या किसी एकल फ़ाइल को निकालना संभव है या किसी स्‍टैप से फ़ाइल को अलग करना बिना स्‍टैप परिवर्तन बंद किए बिना।

क्या कोई इस बारे में कुछ सुझाव / विचार दे सकता है?

जवाबों:


1130

पर Git गुप्त कोष मैनपेज आप (, "चर्चा" खंड में बस के बाद "विकल्प" वर्णन) पढ़ सकते हैं कि:

एक स्‍टैश को एक कमिट के रूप में दर्शाया जाता है, जिसका पेड़ वर्किंग डायरेक्टरी की स्थिति को रिकॉर्ड करता है, और इसका पहला अभिभावक HEAD में कमिट होता है जब स्‍टैश बनाया गया था।

तो आप stash@{0}एक मर्ज कमिट के रूप में स्टैश का इलाज कर सकते हैं (जैसे पहला / सबसे ऊपरी स्लैश), और उपयोग करें:

$ git diff stash@{0}^1 stash@{0} -- <filename>

स्पष्टीकरण: का stash@{0}^1अर्थ है दिए गए स्टैश का पहला अभिभावक, जो कि ऊपर दिए गए स्पष्टीकरण में कहा गया है, वह वचन है, जिस पर बदलाव किए गए थे। हम "git diff" के इस रूप का उपयोग करते हैं (दो कमिट के साथ) क्योंकि stash@{0}/ refs/stashएक मर्ज कमिट है, और हमें git को बताना होगा कि हम किस माता-पिता के खिलाफ अलग होना चाहते हैं। अधिक गुप्त:

$ git diff stash@{0}^! -- <filename>

यह भी काम करना चाहिए ( "निर्दिष्ट सीमा" अनुभाग में, वाक्यविन्यास की व्याख्या के लिए git Rev-parse manpage देखें rev^!)।

इसी तरह, आप स्‍टैश में से किसी एक फाइल को चेक करने के लिए गिट चेकआउट का उपयोग कर सकते हैं :

$ git checkout stash@{0} -- <filename>

या इसे किसी अन्य फ़ाइलनाम के तहत सहेजने के लिए:

$ git show stash@{0}:<full filename>  >  <newfile>

या

$ git show stash@{0}:./<relative filename> > <newfile>

( ध्यान दें कि यहां <full filename> एक प्रोजेक्ट की शीर्ष निर्देशिका के सापेक्ष फ़ाइल का पूर्ण पथनाम है (विचार करें: सापेक्ष stash@{0}))।


आपको stash@{0}शेल विस्तार से उपयोग करने की आवश्यकता हो सकती है , अर्थात उपयोग "stash@{0}"या 'stash@{0}'


8
यह बहुत अच्छा है ... मुझे वास्तव में समझ में नहीं आया कि जब तक मैंने आपके उत्तर को नहीं पढ़ा (जो मुझे गिट-चेकआउट के लिए ले जाता है) तक काम किया। मुझे वास्तव में वह नहीं मिला, जब आप एक स्टैश करते हैं, तो git TWO कमिट्स को बचाता है - एक इंडेक्स की स्थिति के लिए और एक वर्किंग कॉपी की स्थिति के लिए जो इंडेक्स और मूल HEAD के बीच एक मर्ज है। यह उन अजीब पेड़ों की व्याख्या करता है जो मैंने तब देखे हैं जब मैं भंडार के साथ "गिटक - लंबा" के साथ भंडार की कल्पना करता हूं।
पैट नॉट

4
ज्यादातर मैं git चेकआउट एप्लिकेशन को यह पूरा करने का सबसे अच्छा तरीका पाता हूं कि वह क्या करना चाहता था। हालाँकि मैं उत्सुक था और डबल-चेक्ड git checkoutमैन पेज। यह फ़ाइल को किसी अन्य स्थान पर नहीं छोड़ सकता। इसमें एक संदर्भ है: stackoverflow.com/questions/888414/…
डैनी

84
$ git चेकआउट स्टैश @ {0} - <फ़ाइल नाम> बहुत उपयोगी है, धन्यवाद
गुरुत्वाकर्षण

43
ध्यान दें कि git checkoutदृष्टिकोण स्टैश से सटीक फ़ाइल को कॉपी करता है - यह इसे उस तरह से मर्ज नहीं करता है जो आपकी कार्यशील निर्देशिका में है git stash apply। (इसलिए यदि आपके पास आधार से किसी भी तरह का बदलाव हुआ है, तो वे नष्ट हो जाएंगे)।
पेट्रिग्नन

4
ध्यान दें कि git stash applyफ़ाइल के धराशायी होने के बाद से कार्य ट्री में संशोधित की गई फ़ाइल में परिवर्तनों को मर्ज करने के लिए , कार्य ट्री में उस फ़ाइल का मंचन किया जाना चाहिए। काम के लिए ऑटो-मर्ज के लिए, एक ही फाइल को काम की कॉपी और स्टैक्ड कॉपी-टू-मर्ज दोनों में संशोधित नहीं किया जा सकता है। अंत में, स्लैश लागू आइटम को स्टैच की तरह से नहीं हटाएगा git stash pop
विले

46

यदि आप git stash applyइसके बजाय उपयोग करते हैं git stash pop, तो यह आपके काम करने वाले पेड़ पर लगे हुए दाने को लागू करेगा लेकिन फिर भी यह दंश रख सकता है।

साथ यह किया है, तो आप कर सकते हैं add/ commitफ़ाइल आप चाहते हैं कि और फिर शेष बदलाव रीसेट।


2
एक विशिष्ट स्टैश पॉप करने के लिए: git stash pop stash@{0}( git stash list
स्टैक्ड

यदि अन्य फ़ाइलों की स्थिति में कोई मर्ज विरोध होता है, तो git मुझे उस फ़ाइल पर प्रतिबद्ध नहीं होने देता जो मैं चाहता हूं :(
कपटपूर्ण

33

किसी भी शाखा से परिवर्तन प्राप्त करने का एक आसान तरीका है, जिसमें चोरी भी शामिल है:

$ git checkout --patch stash@{0} path/to/file

यदि आप कई भागों में पैच करना चाहते हैं, तो आप फ़ाइल युक्ति को छोड़ सकते हैं। या एकल फ़ाइल में सभी परिवर्तन प्राप्त करने के लिए पैच (लेकिन पथ नहीं) को छोड़ दें। यदि आपके पास एक से अधिक है, तो 0स्टैश नंबर से बदलें git stash list। ध्यान दें कि यह पसंद है diff, और शाखाओं के बीच सभी मतभेदों को लागू करने की पेशकश करता है । केवल एक कमिट / स्टेश से परिवर्तन प्राप्त करने के लिए, एक नज़र डालें git cherry-pick --no-commit


क्या यह स्टैश से सटीक फ़ाइल की प्रतिलिपि बनाता है, या क्या यह मर्ज होता है? कॉपी के मामले में, यदि आपके पास स्टैश बनने के बाद से कोई बदलाव है, तो वे खो जाएंगे।
डेंजेल

2
@Danijel पढ़ें git help checkout--patchइंटरेक्टिव मर्जिंग करता है, यह शेल में आपके द्वारा स्वीकृत हंक (या यदि आप eपैच को चुनने के लिए जो कुछ भी बचाते हैं ) को लागू करते हैं। पथ अकेले फ़ाइल को अधिलेखित कर देगा, जैसे मैंने लिखा था, "सभी परिवर्तन"।
वाल्फ

1
मामूली सुधार: git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")' - तब git applydiffat stash@{4}केवल स्टाॅस और उसके अभिभावक के बीच परिवर्तित हुई फाइलों का उपयोग किया जाता है।
मार्क

25

संक्षिप्त जवाब

पूरी फाइल देखने के लिए: git show stash@{0}:<filename>

अंतर देखने के लिए: git diff stash@{0}^1 stash@{0} -- <filename>


1
मुझे नहीं लगता कि वह किसी विशेष फ़ाइल के लिए स्टैश देखने से संबंधित था - केवल उस फ़ाइल को पॉप करने के लिए।
Amalgovinus

1
यह वही है जिसे मैं देख रहा था। तो फिर तुम जगह ले सकता है diffके साथ difftoolअपने पसंदीदा बाहरी diff उपयोग करने के लिए।
पीट ब्रिट्स

19
$ git checkout stash@{0} -- <filename>

टिप्पणियाँ:

  1. सुनिश्चित करें कि आपने "-" और फ़ाइल नाम पैरामीटर के बाद स्थान रखा है

  2. अपने विशिष्ट स्टैश नंबर के साथ शून्य (0) बदलें। स्‍टैश सूची पाने के लिए, उपयोग करें:

    git stash list
    

जकुब नारबस्की के उत्तर पर आधारित - छोटा संस्करण


11

आप " git show stash@{0}" के साथ एक स्टाॅश के लिए अंतर प्राप्त कर सकते हैं (या जो भी स्टैश की संख्या है, "git stash list" देखें))। एकल फ़ाइल के लिए भिन्न के अनुभाग को निकालना आसान है।


2
मेरे जैसे दिमाग के लिए अभी भी सरल: git show stashसबसे ऊपरी दिखावा दिखाने के लिए उपयोग करें (आम तौर पर केवल एक ही आपके पास है)। इसी तरह आप अपनी वर्तमान शाखा के साथ अंतर को दिखा सकते हैं git diff head stash
10

5

समझने के लिए सबसे सरल अवधारणा, हालांकि शायद सबसे अच्छा नहीं है, क्या आपके पास तीन फाइलें बदल गई हैं और आप एक फाइल को रोकना चाहते हैं।

यदि आप git stashउन सभी को छिपाने के लिए करते हैं, git stash applyतो उन्हें फिर से वापस लाने के लिए और फिर git checkout f.cफाइल में प्रभावी ढंग से रीसेट करने के लिए।

जब आप उस फ़ाइल को अनस्टैश करना चाहते हैं तो एक बार करें git reset --hardऔर फिर से रन git stash applyकरें, इस तथ्य का लाभ उठाते हुए कि स्टाॅक git stash applyस्टैक से अंतर स्पष्ट नहीं करता है।


1

यदि स्टैक्ड फ़ाइलों को वर्तमान संस्करण के साथ विलय करने की आवश्यकता होती है, तो अंतर का उपयोग करके पिछले तरीकों का उपयोग करें। अन्यथा आप git popउनका उपयोग न करने के लिए कर सकते हैं , git add fileWantToKeepआपकी फ़ाइल के मंचन के लिए, और git stash save --keep-indexमंच पर जो कुछ भी है, उसे छोड़कर सब कुछ करने के लिए। याद रखें कि पिछले वाले के साथ इस तरह का अंतर यह है कि यह फ़ाइल को स्टैश से "पॉप" करता है। पिछले उत्तर इसे बनाए रखते हैं git checkout stash@{0} -- <filename>इसलिए यह आपकी आवश्यकताओं के अनुसार चलता है।


0

अपने काम के पेड़ के लिए एक छिपाने की जगह में एक फ़ाइल में परिवर्तन लागू करने के लिए निम्नलिखित का उपयोग करें।

git diff stash^! -- <filename> | git apply

यह आम तौर पर उपयोग करने से बेहतर है git checkoutक्योंकि आप किसी भी बदलाव को खो नहीं सकते हैं क्योंकि आपने स्टैश बनाया था।


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