गिट स्टैश के लिए इच्छित उपयोग-मामला क्या है?


143

यदि मैं शाखा A पर काम करता हूं और अचानक शाखा A पर एक कमिट के साथ तैयार होने से पहले शाखा B पर काम करने की आवश्यकता होती है, तो मैं A पर अपने बदलावों की जांच करता हूं, B चेकआउट करता हूं, वहां अपना काम करता हूं, फिर A को चेकआउट करता हूं और स्टैश लगाता हूं।

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

इसके अलावा, एक और परिदृश्य: मैं काम पर और घर पर दोनों काम करता हूं। अगर मैं घर जाने के लिए प्रतिबद्ध होने के साथ तैयार नहीं हूं, तो क्या मैं अपने काम को रोक सकता हूं, इसे GitHub पर धकेल सकता हूं और फिर घर पर उस रोक को खींच सकता हूं?


3
काफी हद तक आपकी कंपनी की नीतियों पर निर्भर करता है, यदि कोई हो। आप "स्वीकृत" उत्तर का चयन कैसे करेंगे?
डेमन पेंटर

1
यह प्रश्न जैसा कि वाक्यांशबद्ध है केवल राय के लिए पूछ रहा है (क्या मुझे इस तरह या उस तरह से गिट का उपयोग करना चाहिए ?) और इस तरह बंद या संपादित किया जाना चाहिए।
टायलरएच

जवाबों:


161

स्टैश सिर्फ एक सुविधा विधि है। चूंकि git में शाखाएँ इतनी सस्ती और आसानी से प्रबंधित हो जाती हैं, इसलिए मैं व्यक्तिगत रूप से लगभग हमेशा एक नई अस्थायी शाखा बनाना पसंद करता हूँ, लेकिन यह ज्यादातर स्वाद की बात है।

एक जगह जिसे मैं चोरी करना पसंद करता हूं, अगर मुझे पता है कि मैं अपनी आखिरी प्रतिबद्ध में कुछ भूल गया हूं और पहले से ही उसी शाखा में अगले काम करना शुरू कर दिया हूं:

# Assume the latest commit was already done
# start working on the next patch, and discovered I was missing something

# stash away the current mess I made
git stash save

# some changes in the working dir

# and now add them to the last commit:
git add -u
git commit --amend

# back to work!
git stash pop

2
क्या आपके द्वारा जोड़ी गई चीज़ गायब हो गई है जब आप इसे अनस्टैश कर देते हैं, तो यह स्टैश में विलीन हो जाती है? (मैं अभी भी इस पर चकित हूं कि समयरेखा किस तरह से काम करती है - मुझे लगता है कि आप इतिहास को लिख रहे हैं ??)
किकी ज्वेल

@KikiJewell पॉप-अप परिवर्तन इंडेक्स पर लागू होते हैं - वे प्रतिबद्ध नहीं हैं। इसलिए यदि आप git stash popदो बार, आप उन दो परिवर्तन सेटों के बीच अंतर खो देंगे।
मुरिनिक

अक्टूबर 2017 के अंत तक, गिट मेलिंग सूची पर व्यापक चर्चा हुई, जिसमें मौजूदा विकल्प के पक्ष में कमांड गिट स्टैश सेव को अपदस्थ किया जा रहा है git stash push। इसका मुख्य कारण यह है कि git stash pushचयनित रास्तों को चुराने का विकल्प पेश git stash saveकरता है , कुछ का समर्थन नहीं करता है।
कृष्णा गुप्ता

39

मैं तीन पैराग्राफ पर जवाब तोड़ दूंगा।

भाग 1:

git stash("स्टैश" में अपने अन-कम किए गए परिवर्तनों को सहेजने के लिए। ध्यान दें: यह कार्यशील पेड़ से परिवर्तनों को हटा देता है!)

git checkout some_branch(इच्छित शाखा में परिवर्तन - इस मामले में some_branch)

git stash list (सूची में गड़बड़ी)

आप देख सकते हैं:
stash @ {0}: WIP on {branch_name}: {SHA-1 ऑफ़ लास्ट कमेटी} {आखरी कमिट ऑफ़
यू ब्रांच} stash @ {0}: WIP on master: 085b095c6 संशोधन के लिए परीक्षण

git stash apply (करंट ब्रांच में काम करने वाले पेड़ पर लगाने के लिए)

git stash apply stash@{12}(यदि आपके पास बहुत सारी लड़ाइयाँ हैं, तो आप चुन सकते हैं कि कौन सा स्टेश लागू होगा - इस मामले में हम स्लैश लागू करते हैं 12)

git stash drop stash@{0}(स्‍टैश सूची से हटाने के लिए - इस मामले में स्‍टैश 0)

git stash pop stash@{1} (चयनित स्लैश को लागू करने और इसे स्टैश सूची से हटाने के लिए)

भाग 2:
आप इस आदेश के साथ अपने परिवर्तन छिपा सकते हैं लेकिन यह आवश्यक नहीं है।
आप अगले दिन बिना किसी रोक-टोक के जारी रख सकते हैं।
यह आपके परिवर्तनों को छिपाने के लिए और विभिन्न शाखाओं पर काम करने के लिए या अपने कोड के कुछ अहसास को लागू करने के लिए आदेश देता है और शाखाओं के बिना होने वाली दुर्घटनाओं में बचत करता है और आपके कस्टम केस को कमिट करता है!
और बाद में आप कुछ स्टैच का उपयोग कर सकते हैं और चेक विच बेहतर है।

भाग 3:
स्थानीय परिवर्तन के लिए अपने आदेशों को छिपाने की व्यवस्था करें।
यदि आप दूर से काम करना चाहते हैं तो आपको प्रतिबद्ध होना चाहिए और धक्का देना चाहिए।


10

मुख्य विचार है

दूर एक गंदे काम कर रहे निर्देशिका में परिवर्तन को रोकें

इसलिए बेसिकली स्टैश कमांड आपके कुछ बदलावों को रखता है, जिनकी आपको जरूरत नहीं है या उन्हें फिलहाल नहीं चाहते हैं; लेकिन आपको उनकी आवश्यकता हो सकती है।

जब आप वर्किंग डायरेक्टरी और इंडेक्स की वर्तमान स्थिति को रिकॉर्ड करना चाहते हैं , लेकिन एक क्लीन वर्किंग डायरेक्टरी में वापस जाना चाहते हैं, तो git stash का उपयोग करें । कमांड आपके स्थानीय संशोधनों को दूर करता है और HEAD कमिट से मिलान करने के लिए वर्किंग डायरेक्टरी को वापस करता है ।


7

आप निम्न आदेशों का उपयोग कर सकते हैं:

  • अपने अनपेक्षित परिवर्तनों को सहेजने के लिए

    git stash

  • अपनी बची हुई लकीरों को सूचीबद्ध करने के लिए

    git stash list

  • लागू करने के लिए / वापस न किए गए परिवर्तन प्राप्त करें जहाँ x 0,1,2 है ...

    git stash apply stash@{x}

ध्यान दें:

  • एक स्टैश लगाने के लिए और इसे स्टैश लिस्ट से हटा दें

    git stash pop stash@{x}

  • एक स्लैश लागू करने के लिए और इसे स्टैश सूची में रखें

    git stash apply stash@{x}


4

यदि आप हिट git stashकरते हैं जब आपके पास काम की प्रतिलिपि में परिवर्तन होता है (मंचन क्षेत्र में नहीं), तो गिट एक स्टैक्ड ऑब्जेक्ट बनाएगा और स्टैड्स के ढेर पर धक्का देगा (जैसे आपने किया था git checkout -- .लेकिन आप बदलाव नहीं खोएंगे)। बाद में, आप स्टैक के शीर्ष से पॉप कर सकते हैं।


2

स्‍टैश कमांड आपके पिछले कमिटमेंट के बाद आपके द्वारा किए गए किसी भी बदलाव को स्‍कैश करेगा। यदि आप अगले दिन इस पर काम जारी रखने वाले हैं तो आपके मामले में कोई कारण नहीं है। मैं केवल उन परिवर्तनों को पूर्ववत् करने के लिए उपयोग करूँगा जो आप करना नहीं चाहते हैं।


2
नहीं, git stashअपनी शाखा नहीं बदलेगा। यह विशेष रूप से किसी भी प्रतिबद्ध परिवर्तनों को "वापस" नहीं करेगा। यह केवल (अस्थायी) आपकी फ़ाइलों पर किसी भी अनपेक्षित परिवर्तन को छोड़ देगा। - यह उचित लग सकता है, लेकिन इस तरह के शब्दों का एक बहुत ही खास अर्थ होता है। आपको वास्तव में उन लोगों को मिश्रण नहीं करना चाहिए।
माइक्स

यह बात बताने के लिए धन्यवाद। मैंने उसी हिसाब से अपना जवाब बदल दिया।
सेवेरिन

गिट में एक "शाखा" को कमिट की एक श्रृंखला के रूप में परिभाषित किया गया है। git stashकिसी भी आवागमन को नहीं छूएगा और इसलिए किसी भी शाखा को संशोधित नहीं करेगा। यह एक शाखा से कुछ भी "हटा" नहीं देगा यह किसी भी तरह से "रीसेट" नहीं करेगा। शाखा वही रहती है, केवल काम के पेड़ में फाइलें बदल जाती हैं। - वे दो बिल्कुल अलग चीजें हैं।
माइक्स

यह आपके परिवर्तनों को "टाल" नहीं देगा! Git स्टाफ़ के लिए एक LIFO संरचना रखता है, इसलिए एक स्लैश वास्तव में एक धक्का है और आप इसके ऊपर से पॉप कर सकते हैं। शब्द "त्याग" का अर्थ है कि आप कुछ भी खो देंगे, लेकिन आप नहीं करेंगे।
ग्यार्यग्रहम

2

मुझे पता है कि स्टैकऑवरफ्लो राय आधारित उत्तरों के लिए जगह नहीं है, लेकिन मैं वास्तव में इस बारे में अच्छी राय रखता हूं कि कब किस तरह के बदलाव के साथ बदलाव करना है।

आप प्रायोगिक परिवर्तन नहीं करना चाहते हैं

जब आप अपने कार्यक्षेत्र / कार्यशील पेड़ में परिवर्तन करते हैं, तो यदि आपको मर्ज, पुश, लाने या खींचने जैसे किसी भी शाखा आधारित संचालन करने की आवश्यकता है, तो आपको एक स्वच्छ प्रतिबद्ध बिंदु पर होना चाहिए। इसलिए यदि आपके पास कार्यक्षेत्र में परिवर्तन हैं तो आपको उन्हें करने की आवश्यकता है। लेकिन क्या होगा अगर आप उन्हें प्रतिबद्ध नहीं करना चाहते हैं? यदि वे प्रायोगिक हैं तो क्या होगा? कुछ आप अपने प्रतिबद्ध इतिहास का हिस्सा नहीं चाहते हैं? कुछ आप दूसरों को नहीं देखना चाहते जब आप GitHub को धक्का देते हैं?

आप हार्ड रीसेट के साथ स्थानीय परिवर्तन नहीं खोना चाहते हैं

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

तो, 'जब आपको थप्पड़ मारना चाहिए' के ​​उत्तर के लिए, इसका उत्तर यह है कि आपको एक समतुल्य काम करने वाले पेड़ / इंडेक्स / कमिट के साथ क्लीन कमिट पॉइंट पर वापस जाने की आवश्यकता है, लेकिन आप अपने स्थानीय परिवर्तनों को खोना नहीं चाहते हैं। प्रक्रिया। बस अपने परिवर्तनों को एक कड़ी में बदल दें और आप अच्छे हों।

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

Git stash और GitHub

GitHub लगातार नई सुविधाओं को जोड़ रहा है, लेकिन अभी के रूप में, वहाँ अब एक छिपाने की जगह बचाने के लिए रास्ता है। फिर, एक स्टैश का विचार यह है कि यह स्थानीय और निजी है। आपके कार्य केंद्र तक भौतिक पहुंच के बिना कोई भी आपके संघर्ष में नहीं जा सकता। जिस तरह से git reflog git लॉग सार्वजनिक है, उसी तरह निजी है। शायद यह निजी नहीं होता अगर इसे गिटहब तक धकेल दिया जाता।

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

git diff > git-dif-file.diff

स्टैश पॉप

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