केवल कुछ फ़ाइलों को कैसे अनस्टैश करें?


385

मैंने अपने परिवर्तनों को रोक दिया। अब मैं केवल कुछ फ़ाइलों को स्टैश से अनस्टैश करना चाहता हूं। मैं यह कैसे कर सकता हूँ?


4
मुझे लगता है कि आपको पूरे स्लैश को लागू करना होगा, लेकिन फिर आप चुनिंदा री-स्टैश कर सकते हैं।
रिचर्ड

4
@AbdouTahiri क्या गलत है?
एलेक्स

32
@AbdouTahiri Uhhhh .. git stash एक कानूनी विशेषता है, और अत्यंत उपयोगी है। मैं इसे दैनिक उपयोग करता हूं। कहो, एक सहकर्मी को मुझे कुछ समीक्षा करने की आवश्यकता है लेकिन मैं एक जटिल परिवर्तन सेट के बीच में हूं। मैं टूटे हुए कोड का ढेर करने नहीं जा रहा हूं, इसलिए मैं शाखाओं को स्विच कर सकता हूं। मैं स्टैश जा रहा हूं, शाखाओं को स्विच कर रहा हूं, समीक्षा कर रहा हूं, वापस स्विच कर रहा हूं, अनस्टैश। क्या आप इस बात पर विस्तार से ध्यान देना चाहते हैं कि कौन या क्यों गिट स्टैश को "अनुशंसित नहीं" माना जाता है? सिर्फ इसलिए कि आपका गिट स्टैश इतिहास गड़बड़ है और पढ़ने के लिए कठिन का मतलब यह नहीं है कि हर कोई elses है। गन्दा गट स्टैश सेट सिर्फ खराब वर्कफ़्लो है, गिट का दोष नहीं।
1:16 बजे dudewad

6
@ येलक्स नथिंग। गिट स्टैश में कुछ भी गलत नहीं है। इसका उपयोग करते रहें।
६:१६ पर दुबेवाद

जवाबों:


460

के रूप में नीचे वर्णित है, और में विस्तृत " मैं एक git छिपाने की जगह से एक एकल फाइल (या एक फ़ाइल में परिवर्तन) कैसे निकाल सकते हैं? ", तो आप उपयोग आवेदन कर सकते हैं git checkoutया git showएक विशिष्ट फ़ाइल को पुनर्स्थापित करने के लिए।

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

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

(के रूप में टिप्पणी की द्वारा जैमे एम , tcsh जहां विशेष वर्ण से बचें करने की जरूरत है जैसे कुछ खोल के लिए, वाक्य रचना होगा: git checkout 'stash@{0}' -- <filename>)

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

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

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

टिप्पणी में पता चलता है :

यदि आप मैन्युअल रूप से चयन करना चाहते हैं कि आप उस फ़ाइल से कौन सा परिवर्तन लागू करना चाहते हैं:

git difftool stash@{0}..HEAD -- <filename>

विवेक टिप्पणी में कहते हैं :

ऐसा लगता है कि " git checkout stash@{0} -- <filename>" फ़ाइल के संस्करण को उस समय के रूप में पुनर्स्थापित करता है जब स्टैश किया गया था - यह उस फ़ाइल के लिए परिवर्तित किए गए परिवर्तनों को लागू नहीं करता है ।
बाद करने के लिए:

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

(जैसा कि peterflynn ने टिप्पणी की है , आपको कुछ मामलों में, एक को हटाने की आवश्यकता हो सकती है ) ( पारंपरिक अंतरों से प्रमुख स्लैश)| git apply -p1p1


जैसा कि टिप्पणी की गई: "अस्थिर" ( git stash pop), फिर:

  • वह जोड़ें जो आप इंडेक्स में रखना चाहते हैं ( git add)
  • बाकी को रोकें: git stash --keep-index

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


5
यदि आप git stash popफ़ाइल विरोध के कारण नहीं कर सकते हैं तो यह काम नहीं करता है । बालमुरुगन ए के जवाब ने उस मामले में मेरे लिए चाल चली।
एंड्रे

1
यदि आप मैन्युअल रूप से चयन करना चाहते हैं जो आप उस फ़ाइल से लागू करना चाहते हैं, तो आप git difftool stash @ {0} .. HEAD - <filename>
yucer

5
ऐसा लगता है कि "git checkout stash @ {0} - <filename>" फ़ाइल के संस्करण को उस समय तक पुनर्स्थापित करता है जब स्टैश किया गया था - यह उस फ़ाइल के लिए स्टैक्ड परिवर्तन लागू नहीं होता है। उत्तरार्द्ध करने के लिए: "git diff stash @ {0} ^ 1 stash @ {0} - <filename> | git apply"
Vivek

1
@JaimeM। धन्यवाद। अधिक दृश्यता के उत्तर में मैंने आपकी टिप्पणी शामिल की है।
VonC

1
unstashइसका मतलब है कि इसका मतलब है pop, जैसा कि मुझे लगता है कि यह ज्यादातर मामलों में होता है, यह केवल आंशिक रूप से सवाल का जवाब देता है। फिर आप बाद में होने वाले संघर्षों और / या भ्रम से बचने के लिए स्लेश से चुनिंदा रूप से लगाए गए टुकड़ों को कैसे हटा सकते हैं?
डायलनयुंग

115
git checkout stash@{N} <File(s)/Folder(s) path> 

उदाहरण के लिए। केवल ./test.c फ़ाइल को पुनर्स्थापित करने के लिए और। पिछले फ़ोल्डर से फ़ोल्डर को हटा दें,

git checkout stash@{0} ./test.c ./include

12
यह सही जवाब है! सिंगल लाइन कमांड को विशिष्ट फ़ाइलों से केवल स्टैक्ड परिवर्तन लागू करने के लिए, एक आकर्षण की तरह काम करता है!
बजकर

1
फ़ाइल के लिए (केवल) स्टैक्ड परिवर्तन लागू करने के लिए: "git diff stash @ {N} ^ 1 stash @ {N} - <filename> | git apply"
Vivek

यह मेरे लिए भी काम करता है। बस चुनिंदा फ़ाइलों को स्टैश से उपयोग करने के लिए चेकआउट करें और आप कर रहे हैं। मैं इस में फंस गया था मैंने -aस्टैश बनाते समय ध्वज का इस्तेमाल किया था ।
राजीव रंजन

1
@ 4levels मुझे लगता है कि "स्टैक्ड बदलाव लागू करें" ऐसा नहीं होता है, है ना? मुझे लगता है कि "जो कुछ भी आपके पास है उसे स्लैश से कॉपी के साथ अधिलेखित करें" क्या होता है।
msouth

35

मुझे लगता है कि VonC का जवाब शायद वही है जो आप चाहते हैं, लेकिन यहाँ एक चुनिंदा "git apply" करने का तरीका है:

git show stash@{0}:MyFile.txt > MyFile.txt

4
यह वही हो सकता है जो आप कुछ मामलों में चाहते हैं, लेकिन सावधान रहें कि यह कमांड किसी भी कार्यशील निर्देशिका परिवर्तनों के साथ मर्ज करने के बजाय अधिलेखित हो जाएगा ।
रहबरब

यह मेरे लिए काम करता है, क्योंकि मैं सिर्फ एक फ़ाइल की प्रतिलिपि बनाना चाहता था जो केवल स्टैश में मौजूद है और किसी checkoutभी चीज़ की परवाह नहीं करती है ।
टॉम रसेल

1
Windows PowerShell के लिए: git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt- PS के लिए विशेष रूप से ब्रेसिज़ की व्याख्या नहीं करने के लिए बैकस्टिक्स आवश्यक हैं, और scयह आवश्यक है क्योंकि PS का >ऑपरेटर UTF-16 (वास्तव में UCS-2) के लिए डिफॉल्ट करता है, जो शायद आप नहीं चाहते हैं। @ बालमुरुगन ए का जवाब इन मुद्दों से ग्रस्त नहीं है।
इयान केम्प

19

पहले सभी स्‍तंभों को सूचीबद्ध करें

git stash list

stash@{0}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP on master: 7e450c81 Merge branch 'Offlineseite'

फिर दिखाओ कि कौन सी फाइलें स्टैश में हैं (स्लैश 1 लेने दें):

git stash show 1 --name-only

//Hint: you can also write
//git stash show stash@{1} --name-only

 ajax/product.php
 ajax/productPrice.php
 errors/Company/js/offlineMain.phtml
 errors/Company/mage.php
 errors/Company/page.phtml
 js/konfigurator/konfigurator.js

फिर उस फ़ाइल को लागू करें जिसे आप पसंद करते हैं:

git checkout stash@{1} -- <filename>

या संपूर्ण फ़ोल्डर:

git checkout stash@{1} /errors

यह भी बिना काम करता है --लेकिन उनका उपयोग करने की सिफारिश की जाती है। इस पोस्ट को देखें ।

यह भी विकल्प व्याख्या को रोकने और शाब्दिक रूप से सभी निम्नलिखित तर्कों का इलाज करने के लिए एक संकेत के रूप में एक डबल हाइफ़न को पहचानने के लिए पारंपरिक है।


1
इस संपादन के साथ यह स्पष्ट है। +1
वॉन सीपी

1
मैंने कई तरीके आजमाए और यह तरीका वह था जिसकी मुझे जरूरत थी। मुझे एक समस्या का सामना करना पड़ा था जो git stash popअनटैक की गई फ़ाइलों के लिए एक त्रुटि थी। धन्यवाद।
रमिन फिरोज

10

यदि आप git stash pop(बिना किसी विरोध के) इसे लागू करने के बाद स्टैश हटा देंगे। लेकिन अगर आप git stash applyइसे स्टैच लिस्ट से हटाए बिना पैच लगाएंगे। फिर आप अनचाहे परिवर्तनों के साथ वापस लौट सकते हैंgit checkout -- files...


2
इस पोस्ट के टकराव वाले हिस्से को स्पष्ट करने के लिए, यदि आप git stash popऔर वहाँ टकराव हैं, तो आपको उन्हें मैन्युअल रूप से ठीक करना होगा और स्टैश को हटाया नहीं जाएगा।
थॉमस मैककेबे

6

एक और तरीका:

git diff stash@{N}^! -- path/to/file1 path/to/file2  | git apply -R

2
यह एकमात्र सही उत्तर IMO है। केवल परिवर्तन लागू करने के बजाय अपनी फ़ाइल का उपयोग checkoutया showनेत्रहीन रूप से अधिलेखित कर देगा। "एक और तरीका" एक ख़ामोशी है।
cam

1
मैं path/to/file2आपके कार्यक्षेत्र में उसी फ़ाइल के विरुद्ध अंतर करना चाहता हूँ जैसा आप नहीं कर रहे हैं। दूसरा रास्ता छोड़कर मेरे लिए ठीक काम करता है। - और मुझे -Rविकल्प का उपयोग करके एक त्रुटि संदेश मिलता है ("रिवर्स में पैच लागू करें", धराशायी संस्करण को पैच करने की कोशिश कर रहा है?)। तो मेरा वर्किंग वर्जन जैसा दिखता है git diff stash@{N}^! -- path/to/file | git apply -
थामस

"पैच विफल"? 3-तरफ़ा मर्ज करने का प्रयास करें। ...| git apply -3 -
जॉन मी

6

विंडोज उपयोगकर्ताओं के लिए: PowerShell में घुंघराले ब्रेसिज़ का विशेष अर्थ है। आप या तो सिंगल कोट्स के साथ घेर सकते हैं या बैकटिक के साथ भाग सकते हैं। उदाहरण के लिए:

git checkout 'stash@{0}' YourFile

इसके बिना, आपको एक त्रुटि प्राप्त हो सकती है:

Unknown switch 'e'


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