आप एक अनट्रैक फ़ाइल को कैसे स्टैश कर सकते हैं?


1431

मेरे पास एक फ़ाइल में परिवर्तन है, एक नई फ़ाइल है, और जब मैं किसी अन्य कार्य पर स्विच करता हूं, तो उन्हें दूर करने के लिए गिट स्टैश का उपयोग करना चाहता हूं। लेकिन गिट स्‍टश अपने आप में मौजूदा फाइल के बदलावों को रोक देता है; नई फ़ाइल मेरे काम के पेड़ में बनी हुई है, मेरे भविष्य के काम को बंद कर रही है। मैं इस अनट्रैक फ़ाइल को कैसे स्टैश करूं?


27
इस बात से अवगत रहें कि यदि आपके पास केवल अपने स्टाॅश में अनटैक की गई फाइलें हैं, तो ऐसा लगेगा कि यह एक खाली है, जैसा कि git stash showरिटर्न में कुछ भी नहीं है और आपको इसे छोड़ने के लिए लुभाया जा सकता है (जैसा कि मैंने अभी किया था जबकि इसमें एक उपयोगी स्क्रिप्ट थी, जो मैंने कुछ महीने पहले लिखी थी। → कैसे गिरा हुआ निशान ठीक किया जाए )
मैक्सिमम आर।

जवाबों:


1918

अपनी कार्यशील निर्देशिका को अनटैक की गई फ़ाइलों (विशेष रूप से जो कि .ignignore में हैं) सहित स्टैश करने के लिए, तब आप शायद इस cmp का उपयोग करना चाहते हैं:

git stash --include-untracked

अधिक जानकारी:

अपडेट १ Update मई २०१8:

Git के नए संस्करणों में अब git stash --allसभी फाइलें हैं, जिनमें अनट्रैक और अनदेखा फाइलें शामिल हैं।
git stash --include-untrackedअब उपेक्षित फ़ाइलों को नहीं छूता (git 2.16.2 पर परीक्षण किया गया)।

नीचे मूल उत्तर:

चेतावनी, ऐसा करने से आपकी फ़ाइलों को स्थायी रूप से हटा दिया जाएगा यदि आपके पास आपकी gitignore फ़ाइल में कोई निर्देशिका / * प्रविष्टियाँ हैं।

संस्करण 1.7.7 के रूप में आप उपयोग कर सकते हैं git stash --include-untrackedया git stash save -uउन्हें बिना मंचित फ़ाइलों को अनट्रैक करने के लिए।

git addफ़ाइल जोड़ें ( ) और इसे ट्रैक करना शुरू करें। फिर स्टैश। चूंकि फ़ाइल की पूरी सामग्री नई है, इसलिए उन्हें स्टैक्ड किया जाएगा, और आप इसे आवश्यकतानुसार जोड़ सकते हैं।


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

6
@ alan-christensen पढ़ें कर्नेल की DESCRIPTION/ pub/software/scm/git/docs/git-stash.html । बात यह है कि कड़ी मेहनत के बाद एक साफ पेड़ है।
केल्विन

3
@ केल्विन का मेरी टिप्पणी में क्या मतलब था कि जब तक उनका मंचन नहीं किया गया है, तब तक यह नई फाइलों को स्टैश नहीं करता है, लेकिन अगर इनका मंचन नहीं किया गया है तो भी यह मौजूदा फाइलों को स्टैश करता है। मुझे असंगत लगता है।
एलन क्रिस्टेन्सन

11
@AlanChristensen बिंदु एक अलग शाखा के चेकआउट द्वारा लिखी जा सकने वाली चीजों को छिपाने के लिए है।
jwg

3
जैसा कि आपके यहाँ शीर्ष उत्तर है, मैं आपसे अनुरोध करूंगा कि आप अपने उत्तर में दो कारणों git stash --include-untrackedसे पहले सूची दें git stash --all। सबसे पहले यह 2019 में ओपी के सवाल का बेहतर तरीके से जवाब देता है और दूसरा क्योंकि - सभी कुछ ऐसा करता है जो ज्यादातर उपयोगकर्ता शायद नहीं चाहते हैं कि यह उन सभी फाइलों को हटा दे जो कि
.ignignored हैं

411

Git 1.7.7 के रूप में, विकल्प (या शॉर्ट-हैंड ) को git stashस्वीकार करता है । अपनी स्‍टैश में अनट्रैक की गई फ़ाइलों को शामिल करने के लिए, निम्‍नलिखित समादेशों का उपयोग करें:--include-untracked-u

git stash --include-untracked
git stash -u

चेतावनी, ऐसा करने से आपकी फ़ाइलों को स्थायी रूप से हटा दिया जाएगा यदि आपके पास आपकी gitignore फ़ाइल में कोई निर्देशिका / * प्रविष्टियाँ हैं।


15
कूल - यह अंत में मैनुअल पेज में वर्णित अनुसार काम करता है। स्टैशिंग (और सफाई) नई फ़ाइलें टूटी हुई व्यवहार नहीं है।
स्टीव बेनेट

1
मेरे संस्करण का संस्करण 1.9.1 है और यहां तक ​​कि अगर मेरे पास .gitignoreइस तरह दिखता है ignoredDirectoryऔर न ही ignoredDirectory/*यह अभी भी उन लोगों को हटा देता है। यहां तक ​​कि अनट्रैक की गई फाइलें ही नहीं डायरेक्टरी भी।
TheUn77777

22
क्या आप कृपया चेतावनी की व्याख्या कर सकते हैं? यह उन फ़ाइलों को क्यों हटाएगा? क्या यह उन्हें हटाता है और उन्हें नहीं रोकता है? मैंने कुछ समय के लिए Git का उपयोग किया है और इस समस्या में नहीं चला हूं।
हांग्जो डबिन्स्की

क्या चेतावनी *.extensionप्रविष्टियों पर भी लागू होती है ?
arekolek

3
@ aleksandr-dubinsky, @arekolek - git1.8.3 -u( --include-untracked) विकल्प अन-स्टैक की गई फ़ाइलों को ठीक कर सकता है और पॉप कर सकता है, लेकिन git stash show
स्टैक्ड होने वाली अनट्रैक की

77

फ़ाइल को इंडेक्स में जोड़ें:

git add path/to/untracked-file
git stash

सूचकांक की संपूर्ण सामग्री, साथ ही मौजूदा फ़ाइलों में कोई भी अस्थिर परिवर्तन, ये सभी इसे छिपाने की जगह बना देंगे।


यदि आप पहले से ही सूचकांक में होने वाले परिवर्तनों को नहीं चाहते हैं तो क्या होगा? क्या नई फ़ाइल को अभी भी संभव है?
allyourcode

इंडेक्स को कमिट करें, नई फाइल को स्टैश करें, फिर कमिट को वापस करें और / या कमिट से फाइल को चेक करें। यह एक गुदगुदी समाधान है, लेकिन यह काम करना चाहिए।
गदल्या

git add .किसी कारण से इसे ध्यान में नहीं रखा गया
TheBilTheory

53

Git bash में, कमांड का उपयोग करके अनट्रैक फाइल्स को स्टैशिंग किया जाता है

git stash --include-untracked

या

git stash -u

http://git-scm.com/docs/git-stash

git stash आपके कार्यक्षेत्र से किसी भी अनट्रैक या अनकम्फ़र्ड फ़ाइलों को हटा देता है। और आप निम्नलिखित आदेशों का उपयोग करके गिट स्टैश को वापस ला सकते हैं

git stash pop

यह फ़ाइल को आपके स्थानीय कार्यक्षेत्र में वापस रख देगा।

मेरा अनुभव

मुझे दूरस्थ go में .classpath और .project फ़ाइलों की गति से बचने के लिए अपनी gitIgnore फ़ाइल में एक संशोधन करना पड़ा। मुझे इस संशोधित .gitIgnore को दूरस्थ रेपो में स्थानांतरित करने की अनुमति नहीं है।

.classpath और .project फ़ाइलें ग्रहण के लिए महत्वपूर्ण हैं - जो मेरा जावा संपादक है।

मैंने सबसे पहले अपनी बाकी फाइलों को चुनिंदा रूप से जोड़ा और मंचन के लिए प्रतिबद्ध किया। हालाँकि, अंतिम पुश तब तक नहीं किया जा सकता, जब तक कि संशोधित .gitIgnore फ़ेल्स और अनट्रैक की गई फ़ाइलों के बीच न हो। .project और .classpath स्टैक्ड नहीं हैं।

मैंनें इस्तेमाल किया

 git stash 

संशोधित .gitIgnore फ़ाइल को चुराने के लिए।

स्टैशिंग .classpath और .project फ़ाइल के लिए, मैंने उपयोग किया

git stash --include-untracked

और इसने मेरे कार्यक्षेत्र से फाइलें निकाल दीं। इन फ़ाइलों की अनुपस्थिति ग्रहण में मेरे कार्य स्थान पर काम करने की मेरी क्षमता को दूर ले जाती है। मैं प्रतिबद्ध फाइलों को रिमोट पर धकेलने की प्रक्रिया पूरी करने के साथ आगे बढ़ा। एक बार यह सफलतापूर्वक हो जाने के बाद, मैंने उपयोग किया

git stash pop

यह वही फाइलें मेरे कार्यक्षेत्र में वापस चिपकाता है। इसने मुझे ग्रहण में उसी परियोजना पर काम करने की मेरी क्षमता को वापस दिया। आशा है कि यह गलत धारणाओं को मिटा देगा।


2
IDE फ़ाइलों के लिए आप वैश्विक gitignore का उपयोग क्यों नहीं करते? अर्थात। का उपयोग करें ~/.gitignore
अंती पिहलजा

20

जैसा कि कहीं और कहा गया है, इसका जवाब git addफ़ाइल में है। उदाहरण के लिए:

git add path/to/untracked-file
git stash

हालाँकि, एक अन्य उत्तर में भी सवाल उठाया गया है: यदि आप वास्तव में फाइल जोड़ना नहीं चाहते हैं तो क्या होगा? खैर, जहां तक ​​मैं बता सकता हूं, आपको करना होगा। और निम्नलिखित काम नहीं करेगा :

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash

यह निम्नानुसार विफल होगा:

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

तो आप क्या कर सकते हैं? ठीक है, आपको वास्तव में फ़ाइल को जोड़ना होगा, हालांकि , आप इसे बाद में प्रभावी रूप से अन-एड कर सकते हैं git rm --cached:

git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop   # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file

और फिर आप काम करना जारी रख सकते हैं, उसी स्थिति में जब आप पहले थे git add(नामक एक अनट्रैक फ़ाइल के साथ path/to/untracked-file; साथ ही आपके द्वारा ट्रैक की गई फ़ाइलों में कोई अन्य परिवर्तन हो सकते हैं)।

इस पर वर्कफ़्लो के लिए एक और संभावना कुछ इस तरह होगी:

git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack

[नोट: जैसा कि @mancocapac से एक टिप्पणी में उल्लेख किया है, जिसे आप जोड़ना चाहते हो सकता है --exclude-standardके लिए git ls-filesआदेश (हां, तो git ls-files -o --exclude-standard)।]

... जिसे आसानी से स्क्रिप्ट किया जा सकता है - यहां तक ​​कि उपनाम भी करेंगे (zsh सिंटैक्स में प्रस्तुत किया गया; आवश्यकतानुसार समायोजित) [भी, मैंने फ़ाइल नाम को छोटा कर दिया है, इसलिए यह सब इस उत्तर में स्क्रॉल किए बिना स्क्रीन पर फिट बैठता है; अपने चयन के वैकल्पिक फ़ाइलनाम को स्थान देने के लिए स्वतंत्र महसूस करें]:

alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

ध्यान दें कि बाद बेहतर एक खोल स्क्रिप्ट या समारोह के रूप में हो सकता है, मानकों को आपूर्ति करने के लिए किया जा अनुमति देने के लिए git stashआप नहीं चाहते मामले में, popलेकिन apply, और / या एक विशिष्ट गुप्त कोष में निर्दिष्ट करने के लिए, के बजाय सिर्फ शीर्ष लेने में सक्षम होना चाहते एक। शायद यह (दूसरे उर्फ ​​के बजाय, ऊपर) [व्हॉट्सएप बिना स्क्रॉल किए फिट होने के लिए छीन लिया गया; बढ़ाई गई विरासत के लिए फिर से जोड़ें]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

नोट : इस रूप में, आपको एक्शन तर्क के साथ-साथ पहचानकर्ता को भी आपूर्ति करने की आवश्यकता है यदि आप एक स्टैश पहचानकर्ता की आपूर्ति करने जा रहे हैं, जैसे unstashall apply stash@{1}याunstashall pop stash@{1}

.zshrcदीर्घावधि के लिए आप कौन सा कोर्स अपने समकक्ष या समकक्ष रखेंगे।

उम्मीद है कि यह उत्तर किसी के लिए उपयोगी हो, सभी को एक उत्तर में सब कुछ एक साथ रखे।


1
git ls-files -o मुझे उन लोगों की तुलना में बहुत अधिक फाइलें दिखाता है, जिनकी मुझे दिलचस्पी है। निम्नलिखित git स्थिति से मुझे --exclude- मानक कार्यों को जोड़ते हुए पाया गया। git ls-files -o --exclude-standard। इस पर मेरा ध्यान रखना "केवल" शामिल है "अनट्रैक की गई फाइलें जिन्हें आप सामान्य रूप से अनदेखा नहीं करेंगे, अर्थात केवल आपके द्वारा दिखाई गई फ़ाइलों को
अनट्रैक

20

Git संस्करण 2.8.1 पर: मेरे लिए निम्नलिखित कार्य करता है।

एक नाम के बिना स्टैश में संशोधित और अनटैक की गई फ़ाइलों को सहेजने के लिए

git stash save -u

नाम के साथ स्‍टैश में संशोधित और अनटैक की गई फ़ाइलों को सहेजने के लिए

git stash save -u <name_of_stash>

आप उपयोग कर सकते हैं पॉप या लागू बाद में के रूप में इस प्रकार है।

git stash pop

git stash apply stash@{0}

यह मेरे कंप्यूटर से अनट्रैक की गई फ़ाइलों को नहीं हटाता है, हालांकि वे अब अनट्रैक के रूप में सूचीबद्ध नहीं थे। git stash showउन्हें नहीं दिखाया। जब मैंने कोशिश की git stash apply, तो मुझे "त्रुटि मिली: स्टैच से अनट्रैक की गई फ़ाइलों को पुनर्स्थापित नहीं कर सका"। हालाँकि, फ़ाइलों को एक बार फिर अनट्रेक्ट के रूप में सूचीबद्ध किया गया था, लेकिन ट्रैक की गई फ़ाइलों में परिवर्तन बहाल नहीं किए गए थे। मुझे लगता है कि उन फ़ाइलों को व्यक्तिगत रूप से उन्हें स्टेश से बाहर निकालकर बहाल किया जा सकता है, लेकिन यह समाधान वह नहीं था जिसकी मुझे उम्मीद थी।
hBrent 14:17

9

मैं बस कर फ़ाइलों को अनट्रैक करने में सक्षम था :

git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}

पिछले एक ट्रैक की गई फ़ाइलों के स्टैप को पॉप करता है, इस प्रकार केवल अनट्रैक की गई फ़ाइलों को छोड़ देता है।


git stash save -uबस को बचाने नहीं है untrackedफ़ाइलें, यह दोनों की बचत होती है trackedऔर untracked। मुझे लगता है कि आप जो पहली बचत कर रहे हैं, वह इस मामले में जरूरी नहीं है। Atlassian.com/git/tutorials/saving-changes/…
Drenai

2
सवाल यह है कि सिर्फ अनट्रेक्टेड फाइलों को कैसे स्टैश किया जाए। यदि आप पहले स्लैश छोड़ते हैं, तो आप क्या पॉप करेंगे? यह विचार है: 1) ट्रैश ट्रैक किया गया। 2) स्टैक्ड अनट्रैक। 3) पॉप ट्रैक किया गया। परिणाम: अनट्रैक रह गया है।
ओड

3

यदि आप अनट्रैक की गई फ़ाइलों को स्‍टैश करना चाहते हैं, लेकिन अनुक्रमित फ़ाइलें (उदाहरण के लिए आप जिन लोगों के बारे में प्रतिबद्ध हैं) को रखें, बस -k(इंडेक्स रखें) विकल्प जोड़ें-u

git stash -u -k


2

मान लीजिए कि नई और अनट्रैक फ़ाइल को कहा जाता है: "views.json"। यदि आप अपने ऐप की स्थिति को तोड़कर शाखा बदलना चाहते हैं, तो मैं आमतौर पर टाइप करता हूं:

git add views.json

फिर:

git stash

और वह धराशायी हो जाता। तब मैं सिर्फ शाखा बदल सकता हूं

git checkout other-nice-branch

1

यहाँ कई सही उत्तर हैं, लेकिन मैं यह बताना चाहता था कि नई पूरी निर्देशिका के लिए, काम नहीं'git add path' करेगा । इसलिए अगर आपके पास अनट्रैक-पथ में नई फ़ाइलों का एक गुच्छा है और यह करें:

git add untracked-path
git stash "temp stash"

यह निम्न संदेश के साथ टकराएगा:

Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty

और अगर अनट्रैकड-पथ एकमात्र पथ है जिसे आप स्टैशिंग कर रहे हैं, तो स्टैश "टेम्प स्टैश" एक खाली स्लैश होगा। सही तरीका पूरे मार्ग को जोड़ना है, न कि केवल निर्देशिका नाम (यानी '/' के साथ पथ को समाप्त करना):

git add untracked-path/
git stash "temp stash"

कम से कम मेरे सिस्टम पर आपकी धारणा गलत है। यह स्लैश के बिना काम करता है! खाली निर्देशिकाओं को वैसे भी अनदेखा किया जाता है। (
मैकोस

0

मैंने सोचा कि यह बताने के लिए हल किया जा सकता है कि फ़ाइल मौजूद है, बजाय इसके सभी सामग्री को स्टेजिंग क्षेत्र में करने के, और फिर कॉल करें git stash। अरकनिद वर्णन करता है कि पूर्व को कैसे करना है।

git add --intent-to-add path/to/untracked-file

या

git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file

हालाँकि, बाद वाला काम नहीं करता है:

$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

1
जहां तक ​​मैं बता सकता हूं, पूर्व या तो काम नहीं करता है। इस समस्या के समाधान के लिए मेरा जवाब देखें ।
lindes

0
git stash --include-untracked

मेरा पसंदीदा क्योंकि यह आपके द्वारा जोड़ी गई फ़ाइलों को भी सहेजता है और उनका मंचन नहीं किया है।


0

मुझे नई बनाई गई फ़ाइलों के साथ सॉर्सेट्री का उपयोग करते समय एक समान समस्या का सामना करना पड़ा (वे या तो स्लैश में शामिल नहीं होंगे)।

जब मैंने पहली बार 'स्टेज ऑल' को चुना और फिर नए जोड़े गए घटकों को ट्रैक किया, जहां ट्रैक किया गया था और इसलिए इसे स्टैश में शामिल किया गया था।


यह सवाल 11 साल पुराना है और पहले से ही 14 जवाब हैं। क्या आपने उन्हें पोस्ट करने से पहले पढ़ा है?
मिकेल बी

-7

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

और चूंकि आमतौर पर git stashऔर git stash popबल्कि छोटे के बीच की समय सीमा होती है, इसलिए आपको फिर से अनट्रेक्ट की गई फ़ाइल की जल्द आवश्यकता होगी। इसलिए मैं कहूंगा कि git statusजब आप किसी और चीज़ पर काम कर रहे हों (बीच git stashमें git stash pop) छोटा हो तो फ़ाइल को दिखाने में असुविधा होती है, फिर काम के कारण होने वाली असुविधा और उस पर ध्यान देने की ज़रूरत होती है, ताकि अनट्रैक की गई फ़ाइल को जोड़ने की कोशिश में लागत आए आपका स्टैश।


15
यह प्रोजेक्ट पर निर्भर करता है। मान लें कि अनट्रैक फ़ाइल एक (आधी-लिखित) इकाई परीक्षण है, और परीक्षण दोहन निर्देशिका में सभी इकाई परीक्षण चलाता है। आदि
स्टीव बेनेट

1
एक अन्य उदाहरण यह है कि यदि आप दो कंप्यूटर पर काम करते हैं, और आपको A से B तक डेटा ले जाने की अनुमति है, लेकिन B से A. तक नहीं। यदि आप किसी समस्या को हल करने के लिए कोड का एक नया टुकड़ा बनाते हैं जो पहले B पर होता है लेकिन आप A और B दोनों पर चाहते हैं, आप B पर फ़ाइल को स्‍टैश करने में सक्षम होना चाहते हैं ताकि जब आप A पर उस फ़ाइल को दोबारा बनाए और फिर उसे बंडल में लाएं, तो आप यह सत्यापित करने के लिए स्टैक्ड संस्करण को अलग कर सकें कि आपने नहीं किया भूल करना।
गदल्या

7
सिर्फ इसलिए कि एक फ़ाइल को एक शाखा में ट्रैक नहीं किया गया है, इसका मतलब यह नहीं है कि यह किसी अन्य शाखा में ट्रैक की गई फ़ाइल के साथ संघर्ष नहीं करेगा।
jwg

3
सरल प्रति-उदाहरण: .conf.d निर्देशिका में कॉन्फ़िगरेशन फ़ाइल, या कोई अन्य जो केवल सॉफ्टवेयर के व्यवहार को संशोधित करता है।
फोटोनस

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