2012-09-06 12 views
20

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

$ git status 
# On branch master 
# 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) 
# (commit or discard the untracked or modified content in submodules) 

#  modified: dir/file1.cpp 
#  modified: dir/file1.h 
#  modified: dir/file2.cpp 
#  modified: dir/file2.h 
#  modified: dir/file3.cpp 
#  modified: dir/file3.h 
#  modified: dir/file4.cpp 
#  modified: dir/file4.h 

मुझे पता है कि file2.cpp, file2.h, और file3.cpp सामग्री के साथ संशोधित किया गया है (अर्थात, बस फ़ॉर्मेट नहीं किया गया)। मैं इन तीन फ़ाइलों में बदलावों को छिपाना चाहता हूं और फिर पुराने संशोधन की जांच करना चाहता हूं, ताकि मैं इन फ़ाइलों में परिवर्तनों को दोबारा लागू कर सकूं। मैं नहीं बल्कि कुछ से बचने होगा:

$ cp file2.cpp ~/tmp 
$ git checkout blahblahblah 
$ cp ~/tmp/file2.cpp . 

इस कि stashing शामिल नहीं करता है करने के लिए एक स्पष्ट तरीका है, मुझे पता है। जो भी काम हो जाता है।

+0

सवाल पर एक नजर डालें (http://stackoverflow.com/questions/5506339/कैसे-कैन-आई-गिट-स्टेश-ए-विशिष्ट-फ़ाइल) लेकिन यह आपके मामले में भी लगता है कि आप उन फ़ाइलों के साथ फ़ाइलों को 'गिट जोड़ सकते हैं' जिन्हें आप रखना चाहते हैं और फिर 'गिट चेकआउट - .' और फिर यदि आप चाहते हैं तो अंत में जोड़े गए फ़ाइलों को अस्थिर करें। – mikej

+0

अगले गिट 2.13 (क्यू 2 2017) के साथ, वास्तविक कमांड 'गिट स्टैश पुश - file2.cpp file2.h file3.cpp' होगा। [नीचे मेरा जवाब] देखें (http://stackoverflow.com/a/42963606/6309) – VonC

उत्तर

21

आप परिवर्तनों को आप रखने के लिए, तो stash फ़ाइलों के बाकी चाहते हो के साथ फ़ाइलों add और गुप्त कोष में स्पष्ट कर सकते हैं: (। ध्यान रखें कि यह सभी अपने stashes की साफ हो जाएगा)

git add file2.cpp file2.h file3.cpp 
git stash --keep-index 
git stash clear 

यह आपको file2.cpp, file2.h, और file3.cpp प्रतिबद्धता के लिए चरणबद्ध करेगा। आप तो इन फ़ाइलों को छिपाया जा चाहते हैं (और उन्हें प्रतिबद्ध नहीं):

git reset 
git stash 

अब आप केवल उन तीन फाइलों के साथ रखे, अपने पिछले प्रतिबद्ध पर हो जाएगा।

+7

आपको 'स्टैश साफ़' चलाने की आवश्यकता क्यों है? – sekmo

3

git diff और git apply IMO के लिए एक अच्छा फायदा नहीं है यही कारण है कि:

git diff file2.cpp file2.h file3.cpp > ../my-changes.patch 
git checkout ... 
git apply ../my-changes.patch 

diff के बाद, आप सुनिश्चित करें कि आपके सभी परिवर्तनों को देखते हैं बनाने के लिए पैच फ़ाइल का निरीक्षण कर सकते हैं।

ध्यान दें कि पैच लागू नहीं होने पर, आपको आवेदन करने के लिए --reject विकल्प का उपयोग करने की आवश्यकता हो सकती है। man page for apply भी देखें।

5

एक अच्छा विकल्प इंटरेक्टिव स्टैश मोड का उपयोग कर रहा है।

git stash --patch 

यह ज्यादातर इंटरैक्टिव ऐड मोड की तरह काम करता है: आप परिवर्तन आप अपने काम के पेड़ में है दिखा डिफ की एक श्रृंखला के साथ प्रस्तुत किया जा रहे हैं और आप चुनना होगा जो फ़ाइलें (या एक के केवल कुछ भागों फ़ाइल!) आप छेड़छाड़ करना चाहते हैं, बाकी को बरकरार रखा जाएगा।

man git-stash से:

--patch के साथ, आप सहभागी सिर और काम कर पेड़ के बीच अंतर से जिसे का चयन कर सकते रखे किया जाना है। स्टैश एंट्री का निर्माण इस तरह किया जाता है कि इसकी इंडेक्स स्टेटस आपके भंडार की इंडेक्स स्थिति के समान ही है, और इसके वर्क्री में केवल वही परिवर्तन होते हैं जिन्हें आपने इंटरैक्टिव रूप से चुना है। चयनित परिवर्तन तब आपके वर्कट्री से वापस लुढ़क दिए जाते हैं। --patch मोड को संचालित करने के तरीके को जानने के लिए "Interactive Mode" section of git-add(1) देखें।

अपने मामले में, आप स्वरूपण-केवल शिकारी देखने और अपने सार्थक परिवर्तनों को खोए बिना व्यक्तिगत रूप से उन्हें छीनने में सक्षम होंगे।

19

मुझे पता है कि file2.cpp, file2.h, और file3.cpp सामग्री के साथ संशोधित किया गया है (अर्थात, बस फ़ॉर्मेट नहीं किया गया)।
मैं इन तीन फ़ाइलों में परिवर्तनों को छीनना चाहता हूं और फिर पुराने संशोधन की जांच करना चाहता हूं, ताकि मैं इन फ़ाइलों में परिवर्तनों को फिर से लागू कर सकूं।

Git 2.13 (Q2 2017) के साथ

, git छिपाने की जगह के साथ

git stash push [--] [<pathspec>...] 

देखें commit 9e14090, commit 1ada502, commit df6bba0 (28 फ़र, 2017) विशिष्ट फ़ाइलों के लिए परिवर्तन छिपाया जा आधिकारिक तौर पर एक तरह से होगा, और commit 9ca6326, commit 6f5ccd4, commit f5727e2 (1 9 फरवरी 2017) Thomas Gummerer (tgummerer) द्वारा।
(commit 44c3f09 में Junio C Hamano -- gitster -- द्वारा विलय, 10 मार्च 2017)

now documented के रूप में:

जल्दी से एक स्नैपशॉट बनाने के लिए, आप छोड़ सकते हैं "पुश"।
इस मोड में, गैर-विकल्प तर्कों को किसी अवांछित छेड़छाड़ से गलत वर्तनी उप-आदेश को रोकने की अनुमति नहीं है।
इस के दो अपवाद stash -p हैं जो stash push -p और पथस्पेक्स के लिए उपनाम के रूप में कार्य करता है, जिन्हें दोहरी हाइफ़न -- के बाद असंबद्धता के लिए अनुमति दी जाती है।

जब pathspec को दिया जाता है 'git stash push', नई गुप्त कोष संशोधित राज्यों केवल उन्हीं फ़ाइलों को pathspec से मेल के लिए रिकॉर्ड करता है।
सूचकांक प्रविष्टियों और काम कर पेड़ फ़ाइलों तो, केवल इन फ़ाइलों के लिए HEAD में वापस राज्य के लिए लुढ़का कर रहे हैं भी, फ़ाइलों को pathspec बरकरार मेल नहीं खाते हो जाता है।

ध्यान दें, के रूप में, the comments में medmunds से कहा कि git stash रास्तों relative to the root folder of the git repo का प्रयोग करेंगे।

+0

संस्करण 2।13 (विंडोज़ के लिए) इस टिप्पणी की तारीख के रूप में जारी नहीं किया गया है। – OmegaMan

+0

@ ओमेगामन हाँ: गिट 2.13 (लिनक्स) दो दिनों (10 मई) में जारी किया जाना है: https://calendar.google.com/calendar/embed?src=jfgbl2mrlipp4pb6ieih0qr3so%40group.calendar.google.com (से http://stackoverflow.com/a/14931771/6309)। विंडोज़ के लिए गिट अगले 24 से 48 घंटों में रिलीज होना चाहिए। – VonC

+1

@ ओमेगामन और ... जारी! https://github.com/git-for-windows/git/releases/tag/v2.13.0.windows.1 – VonC

1

आप गिट स्टेश-पी का भी उपयोग कर सकते हैं। इस तरह आप चुन सकते हैं कि कौन से शिकारी को छिपाने के लिए जोड़ा जाना चाहिए, पूरी फाइलों का भी चयन किया जा सकता है।

आप प्रत्येक हंक के लिए कुछ क्रियाओं के साथ संकेत दिया जाएगा: [? कैसे मैं एक विशिष्ट फ़ाइल छिपाया git कर सकते हैं]

y - stash this hunk 
n - do not stash this hunk 
q - quit; do not stash this hunk or any of the remaining ones 
a - stash this hunk and all later hunks in the file 
d - do not stash this hunk or any of the later hunks in the file 
g - select a hunk to go to 
/- search for a hunk matching the given regex 
j - leave this hunk undecided, see next undecided hunk 
J - leave this hunk undecided, see next hunk 
k - leave this hunk undecided, see previous undecided hunk 
K - leave this hunk undecided, see previous hunk 
s - split the current hunk into smaller hunks 
e - manually edit the current hunk 
? - print help 
संबंधित मुद्दे