git-stash बनाम गिट-शाखा


92

एक में पिछले Git प्रश्न , डैनियल Benamy Git में एक कार्यप्रवाह के बारे में बात कर रहा था:

मैं मास्टर पर काम कर रहा था और कुछ सामान तैयार किया और फिर तय किया कि मैं उस काम को रोकना चाहता हूँ। मैंने अपना काम शुरू करने से पहले कुछ कमिट्स का बैकअप लिया और फिर ब्रांच किया।

वह अपने वर्तमान परिवर्तनों को खोए बिना समय में अपने कार्यशील अवस्था को पिछले बिंदु पर पुनर्स्थापित करना चाहता था। सभी उत्तर कई तरह से, कुछ इस तरह से घूमते रहे

git branch -m master crap_work
git branch -m previous_master master

यह कैसे तुलना करता है git stash? मैं थोड़ा उलझन में हूँ कि यह देखने के लिए अलग-अलग उपयोग मामला क्या है जब ऐसा लगता है कि सब कुछ git stashपहले से ही शाखा द्वारा नियंत्रित किया जाता है ...


@ जोर्डी बंस्टर : धन्यवाद, जो चीजों को साफ करता है। मुझे लगता है कि मैं "स्टैशिंग" को एक हल्के, अनाम, शाखा की तरह मानता हूं। तो कुछ भी कर सकते हैं, शाखा के रूप में अच्छी तरह से लेकिन अधिक शब्दों के साथ कर सकते हैं। अच्छा!

जवाबों:


109

'स्लैश' आपकी वर्किंग कॉपी पर अनक्माइज्ड, " डर्टी " सामान ले जाता है, और इसे दूर करके आपको एक क्लीन वर्किंग कॉपी के साथ छोड़ देता है।

यह वास्तव में बिल्कुल भी शाखा नहीं करता है। फिर आप किसी अन्य शाखा के शीर्ष पर आवेदन कर सकते हैं। या, Git 1.6 के रूप में, आप कर सकते हैं:

git stash branch <branchname> [<stash>]

एक नई शाखा के शीर्ष पर, सभी को एक कमांड में लागू करने के लिए।

यदि आप अभी तक " गलत " शाखा के लिए प्रतिबद्ध नहीं हैं, तो स्टैश बहुत बढ़िया काम करता है।

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


1
एक चीज जो मुझे काटती है ... क्या आप लिख सकते हैं कि [<stash>] वास्तव में कैसी दिखती है! उन्होंने इसे डॉक्स में उस संकेतन में रखा, लेकिन यह स्पष्ट नहीं है कि यह 1 या @ {1} या क्या होना चाहिए।
ग्रेग लिंड

1
यदि आप एक विशिष्ट स्लैश "N" का उल्लेख करना चाहते हैं, तो stash @ {N} का उपयोग करें
जोर्डन बंस्टर

9
git stash listअपने नामों के नाम देखें ।
इडबरी

6
ग्रेग, हां आप कर सकते हैं: गिट स्टैश सेव (आपके स्टैश का नाम)। इसे और अधिक उपयोगी बनाता है यदि आप इसका उपयोग करते हैं तो आप जानते हैं कि प्रत्येक स्टैश क्या करता है। आपको स्टैश के पैच दिखाने के लिए आप git stash शो -p (नाम) का उपयोग कर सकते हैं।
थॉमस वेंडर स्टिकल

7
इसके अलावा, git stash show -uकाम की नकल के खिलाफ छिपाने की जगह दिखाने के लिए।
केन

49

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

अपने वर्तमान परिवर्तनों को छिपाने के लिए

$ git stash save 
Saved "WIP on master: e71813e..."

आपके पास एक से अधिक स्टेश भी हो सकते हैं। स्टाॅक स्टैक की तरह काम करता है। हर बार जब आप एक नया स्टैश बचाते हैं, तो इसे स्टैक के ऊपर रखा जाता है।

$ git stash list
stash@{0}: WIP on master: e71813e..."

stash@{0}भाग पर ध्यान दें ? वो है आपकी stash ID। बाद में इसे बहाल करने के लिए आपको इसकी आवश्यकता होगी। चलो अब ठीक है। आपके द्वारा की गई हर स्‍टैश के साथ स्‍टैश आईडी बदल जाती है। stash @ {0} आपके द्वारा किए गए अंतिम चरण को दर्शाता है।

एक स्टैश लगाने के लिए

$ git stash apply stash@{0}

जब आप इसे लागू करते हैं, तो आप नोटिस कर सकते हैं कि स्टैश अभी भी है। यदि आपको इसकी आवश्यकता नहीं है तो आप इसे छोड़ सकते हैं।

$ git stash drop stash@{0}

या, क्योंकि यह स्टैक एक स्टैक की तरह काम करता है, आप अपने द्वारा बचाए गए अंतिम स्लैश को पॉप कर सकते हैं:

$ git stash pop

यदि आप अपनी सभी बाधाओं को मिटा देना चाहते हैं, तो 'स्पष्ट' कमांड चलाएँ:

$ git stash clear

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

$ git stash
...
$ git stash pop

कुछ वास्तव में महत्वपूर्ण काम पर उपयोग करने से पहले स्टैश के साथ प्रयोग करने के लिए स्वतंत्र महसूस करें।

मेरे पास अपने ब्लॉग पर पोस्ट किए गए इस संस्करण का और भी अधिक गहरा संस्करण है


माना 'सर्वश्रेष्ठ' उत्तर की तुलना में बहुत अधिक उपयोगी संसाधन ... (हालांकि सर्वश्रेष्ठ उत्तर ने इसे बहुत स्पष्ट कर दिया, पूर्ण उपयोग से संबंधित कुछ भ्रम थे)
कुमारहर्ष

9

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

एक ही रास्ता मुझे पता है कि कौन सा है जिसका उपयोग gitk --all का उपयोग करें और स्टैच को स्पॉट करें। कम से कम यह आपको यह देखने की अनुमति देता है कि स्टैश किस वस्तु पर बनाया गया था, साथ ही उस स्टैश में शामिल हर चीज का अंतर भी।

ध्यान दें कि मैं git 1.5.4.3 का उपयोग कर रहा हूं, और मुझे लगता है कि 1.6 git stash पॉप जोड़ता है, जो मुझे लगता है कि चयनित स्लैश को लागू करेगा और इसे सूची से हटा देगा। जो काफी क्लीनर लगता है।

अभी के लिए, मैं हमेशा शाखा करने की कोशिश करता हूं जब तक कि मैं बिल्कुल सकारात्मक न हो जाऊं, मैं एक ही दिन में वापस आ जाऊंगा, यहां तक ​​कि घंटे के भीतर भी।


3
क्या आप उन्हें उपयोगी नाम दिए बिना शाखाएँ बनाते हैं? यदि नहीं, तो मैं यह नहीं देखता कि आप स्टैश के साथ ऐसा क्यों नहीं करते हैं। यदि आप वास्तव में जानना चाहते हैं कि उनके पास क्या है, तो आप बस git-stash शो का उपयोग करते हैं, यह दिखाने के लिए कि कौन सी फाइलें बदली गई हैं, या वास्तविक भिन्नताओं को देखने के लिए git-stash लागू होते हैं। ट्रिम किए गए स्टैम्स को नीचे रखना वैसा ही है जैसे अपनी शाखाओं को नियंत्रण में रखना।
जिओनीज चामिओसोव

18
वास्तव में, आप git stash drop [<stash>]
कुमारहर्ज़

1
सच है, git में लंबे समय से git स्‍टैश ड्रॉप पड़ा है। यह अब उपयोग करने के लिए एक PITA से बहुत कम है। मैं इसे हर दिन उपयोग करता हूं, और यहां तक ​​कि समय के लंबे अंतराल पर भी।
वेबमैट

3

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

इससे प्रमुख अंतर git stash:

  • git stashगंदे गिट स्थिति को संकरी रूप से सहेजता है (संशोधित फ़ाइलें, और अनुक्रमणिका में फ़ाइलें जोड़ी गई), जबकि हर उस चीज़git-bottle को सहेजने के लिए डिज़ाइन किया गया है , और यह संशोधित, संशोधित और न जोड़े गए, न जोड़े गए, अनजान पथों के बीच के संरक्षण के तरीके में अंतर करता है, और पूर्ण रीबेस / मर्ज स्थिति (केवल के तहत पथ सहेजे नहीं गए हैं)।HEAD.gitignore
  • git stashउन वस्तुओं को छिपाने के लिए सहेजता है जिन्हें आपको अलग से ट्रैक करने की आवश्यकता होती है। अगर मैं कुछ 2 सप्ताह पहले मैं इसे याद नहीं कर सकता रखे, जबकि git-bottleके रूप में बचत होती है वर्तमान शाखा को जांच करता । रिवर्स एक्शन वह है git-unbottleजो git stashपॉप के बराबर है । इन कमिट को रिपोजिटरी के बीच धकेलना और साझा करना संभव है। यह रिमोट बिल्ड के लिए उपयोगी हो सकता है, जहां आपके पास रिमोट सर्वर में एक और रिपॉजिटरी है, जो कि केवल निर्माण के लिए, या संघर्ष समाधान पर अन्य लोगों के साथ सहयोग करने के लिए है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.