जीआईटी स्टैश अनकैशेड: सभी अस्थिर परिवर्तनों को दूर कैसे करें?


96

मान लीजिए कि परिवर्तन द्वारा दो प्रोजेक्ट में दो सेट किए गए हैं। एक सेट का मंचन किया जाता है और दूसरा नहीं।

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

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


२.२१ के साथ आज के अनुसार, अभी भी इसका कोई अच्छा जवाब नहीं है। नीचे दिए गए सभी उत्तर गलत ( -kविकल्प) या उपयोग करने के लिए बोझिल हैं।
पेंघे गेंग

जवाबों:


99

अद्यतन 2:
मुझे यकीन नहीं है कि लोग इस जवाब के बारे में शिकायत क्यों कर रहे हैं, ऐसा लगता है कि मेरे साथ पूरी तरह से काम किया जा रहा है, बिना खंडित फ़ाइलों के लिए आप -uध्वज जोड़ सकते हैं

पूरा कमांड बन जाता है git stash --keep-index -u

और यहाँ git-stashमदद से एक स्निपेट है

यदि --keep-index विकल्प का उपयोग किया जाता है, तो पहले से ही अनुक्रमणिका में जोड़े गए सभी परिवर्तन बरकरार हैं।

यदि --include-untracked विकल्प का उपयोग किया जाता है, तो सभी अनट्रैक की गई फाइलें भी स्टैक्ड हो जाती हैं और फिर उन्हें git क्लीन के साथ साफ किया जाता है, जिससे वर्किंग डायरेक्टरी बहुत साफ अवस्था में रह जाती है। यदि इसके बजाय --all विकल्प का उपयोग किया जाता है, तो अनदेखा की गई फ़ाइलों को अनट्रैक की गई फ़ाइलों के अतिरिक्त स्टैक्ड और साफ़ किया जाता है।

और यह कैसे दिखता है इसका एक gif है:

यहां छवि विवरण दर्ज करें

अपडेट करें:

भले ही यह चयनित उत्तर हो, लेकिन बहुत सारे लोगों ने बताया है कि [नीचे दिया गया उत्तर] (https://stackoverflow.com/a/34681302/292408) सही है, मैं इसे जांचने की सलाह देता हूं।

मैंने आज (31/1/2020) git संस्करण के खिलाफ फिर से अपने जवाब का परीक्षण किया 2.24.0, और मुझे अभी भी विश्वास है कि यह सही है, मैंने अनटैक की गई फ़ाइलों के बारे में एक छोटा नोट जोड़ा है। अगर आपको लगता है कि यह काम नहीं कर रहा है तो कृपया अपने git संस्करण का भी उल्लेख करें।

पुराना उत्तर :
यदि --keep-indexविकल्प का उपयोग किया जाता है, तो पहले से ही सूचकांक में जोड़े गए सभी परिवर्तन बरकरार हैं:

git stash --keep-index

के प्रलेखन सेgit-stash :

आंशिक रूप से परीक्षण करना

git stash save --keep-indexजब आप दो या अधिक काम के पेड़ में बदलाव करना चाहते हैं, तो आप इसका उपयोग कर सकते हैं , और आप प्रत्येक परिवर्तन को प्रतिबद्ध करने से पहले परीक्षण करना चाहते हैं:

# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash save --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

लेकिन, यदि आप केवल चरणबद्ध परिवर्तनों को नेत्रहीन रूप से देखना चाहते हैं, तो आप कोशिश कर सकते हैं difftool:

git difftool --cached

4
यह भी देखें git stash [-p|--patch]कि इंटरेक्टिव स्ट्रैसिंग कैसा लगता है। से man git stash"--patch के साथ, आप सहभागी सिर और काम कर पेड़ रखे जा करने के लिए के बीच अंतर से जिसे चुन सकते हैं।"
यहाँ

1
मैं आमतौर पर add -p, checkout -pऔर reset -p, कभी कोशिश नहीं की stash -p, टिप के लिए धन्यवाद: डी
मोहम्मद अबूशाही

19
ध्यान दें कि यह उत्तर आपके द्वारा किए गए परिवर्तनों को भी रोक देगा।
बेन फ्लिन

1
यह उत्तर वास्तव में उपयोगी नहीं है क्योंकि इससे भ्रम पैदा होगा। यह उत्तर बेहतर stackoverflow.com/a/34681302/292408 है
एलिय्याह लिन

1
@ElijahLynn मैं दूसरे जवाब से जुड़ा हुआ हूं क्योंकि मैंने बहुत से लोगों को यह कहते हुए पाया कि यह बेहतर उत्तर है, आपकी टिप्पणी के लिए धन्यवाद
मोहम्मद अबूझी

102

स्वीकार किए गए उत्तर में भी कुछ के रूप में इंगित किए गए परिवर्तनों का मंचन किया गया है। यहां यह एक तरीका है कि आप अपने मंचन को बिना किसी रोक-टोक के करवाएं।

विचार आपके मंचित परिवर्तनों की एक अस्थायी प्रतिबद्धता करने के लिए है, फिर अस्थिर परिवर्तनों को रोकें, फिर अस्थायी प्रतिबद्ध करें:

# temp commit of your staged changes:
$ git commit --message "WIP"

# -u option so you also stash untracked files
$ git stash -u

# now un-commit your WIP commit:
$ git reset --soft HEAD^

इस बिंदु पर, आपके पास अपने अस्थिर परिवर्तनों का एक स्टेश होगा और केवल आपके काम की कॉपी में आपके मंचित परिवर्तन मौजूद होंगे।


22
यह वास्तव में सही उत्तर IMO है। --keep-indexवर्तमान स्वीकृत जवाब में विकल्प अभी भी stashes क्या सूचकांक में, यह सिर्फ है भी सूचकांक में यह रहता है। तो फिर यह डुप्लिकेट है, और उल्लसितता ensues।
केन विलियम्स

4
@ केनविलियम्स <डेल> उल्लसितता </ del> <ins> त्रासदी </ ins>
tuespetre

@KenWilliams कि वास्तव में मुझे परेशान। ओपी कृपया चयनित उत्तर को समायोजित कर सकते हैं?
मिकमर्को

2
इस git add .कदम से सुधार किया जा सकता है के git add --allरूप में मौजूदा निर्देशिका के ऊपर एक निर्देशिका में फ़ाइलों को हड़पने चाहिए।
एलिय्याह लिन

1
यह अब तक का सबसे अच्छा उत्तर है, क्योंकि स्वीकृत उत्तर में --keep-index विकल्प भ्रामक है। यह स्वीकृत उत्तर होना चाहिए।
एलिय्याह लिन

21

मुझे लगता है कि चिह्नित जवाब मेरे लिए काम नहीं करता था क्योंकि मुझे कुछ ऐसा चाहिए था जो वास्तव में केवल मेरे अस्थिर परिवर्तनों से टकराया हो। चिह्नित उत्तर, git stash --keep-indexमंचन और अस्थिर दोनों परिवर्तनों को मिटा देता है। --keep-indexहिस्सा केवल सूचकांक काम कर प्रति पर बरकरार साथ ही छोड़ देता है। वह ओपी के लिए काम करता है, लेकिन केवल इसलिए कि उसने उससे थोड़ा अलग सवाल पूछा, क्योंकि वह वास्तव में इसका जवाब चाहता था।

अस्थिर परिवर्तनों को छिपाने के लिए मैंने जो एकमात्र सही तरीका पाया है, वह यह है कि आप स्टैश का उपयोग न करें:

git diff > unstaged.diff
git apply -R unstaged.diff

git checkout -- .भी की बजाय काम करेंगे apply -R

काम काम काम...

git apply unstaged.diff
rm unstaged.diff

1
यहाँ पर git version 2.6.1.windows.1, git stash -kवर्णित के रूप में काम किया।
कोपपोर्स

यह स्वीकृत उत्तर होना चाहिए! यह कई स्टैकओवरफ्लो थ्रेड्स में से केवल एक है जो यह दावा करता है और टेम्प-कम करने पर निर्भर नहीं करता है!
user643011

1
@ user643011: टेंप कमिट गिट में बुरी चीज नहीं है। वे कुछ भी खर्च करते हैं और किसी को नुकसान नहीं पहुंचाते हैं।
फ्रिट्ज़

1
@ फ्रिट्ज: कुछ परिदृश्यों में कोई अस्थायी हंगामा संभव नहीं है। यदि आपके पास पूर्व-पूर्व हुक है जो वर्तमान कार्य कोड की जांच करता है तो यह विफल हो सकता है। यदि आपके चरणबद्ध परिवर्तन अच्छे हैं, लेकिन आपके अस्थिर परिवर्तन नहीं हैं, तो यह दृष्टिकोण चरणबद्ध परिवर्तनों को करने में विफल हो जाएगा।
पेंघे गेंग

1
इसमें अनटैक की गई फ़ाइलें शामिल नहीं हैं। आपको अलग-अलग पैच में उन लोगों को खोजने और शामिल करने के लिए "git ls-files" का उपयोग करने की आवश्यकता है
ACyclic

5

Git: अस्थिर परिवर्तन को रोकें

यह उन सभी संशोधनों को तोड़ देगा, जिन्हें आपने नहीं जोड़ा था:

git stash -k

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

git stash -k -u 

इसके अलावा, आपकी वर्किंग डायरेक्टरी साफ होनी चाहिए (यानी जब आपको बाद में पॉप स्टैश पॉप मिल जाए तो सभी बदलाव करने होंगे)।

http://makandracards.com/makandra/853-git-stash-unstaged-changes


13
इसके बराबर है git stash --keep-index। चरणबद्ध फ़ाइलों को स्टैश में शामिल किया गया है।
बेंजामिन छे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.