2008-09-02 15 views
84

एक previous Git question में, डैनियल Benamy Git में एक कार्यप्रवाह के बारे में बात कर रहा था:Git-गुप्त कोष बनाम Git शाखा

मैं मास्टर पर काम कर रहा था और कुछ सामान के लिए प्रतिबद्ध है और फिर फैसला किया मैं पर काम रखना चाहते थे पकड़ो। मैंने कुछ काम करने का समर्थन किया और फिर मैंने अपना बकवास काम शुरू करने से पहले ब्रांच किया।

वह अपने मौजूदा परिवर्तनों को खोए बिना अपने कामकाजी राज्य को पिछली बिंदु पर पुनर्स्थापित करना चाहता था। सभी उत्तर के आसपास

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

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


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

उत्तर

106

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

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

git stash branch <branchname> [<stash>] 

सब एक आदेश में, एक नई शाखा के शीर्ष पर गुप्त कोष में लागू करने के लिए।

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

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

+1

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

+1

यदि आप किसी विशिष्ट स्टैश "एन" का संदर्भ लेना चाहते हैं, तो स्टैश @ {N} –

+9

का उपयोग करें अपने स्टैश के नामों के लिए 'गिट स्टैश सूची' देखें। – idbrii

8

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

मुझे पता लगाने का एकमात्र तरीका यह है कि किसके लिए गिटक का उपयोग करना है - और स्पैश को स्पॉट करें। कम से कम यह आपको यह देखने देता है कि किस तरह से छेड़छाड़ की गई थी, साथ ही साथ उस छिद्र में शामिल सब कुछ का अंतर भी था।

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

अभी के लिए, मैं हमेशा शाखा बनाने की कोशिश करता हूं जब तक कि मैं बिल्कुल सकारात्मक नहीं हूं, उसी दिन भी, उस दिन भी उस छिपाने के लिए वापस आ रहा हूं।

+3

क्या आप उन्हें उपयोगी नाम दिए बिना शाखाएं बनाते हैं? यदि नहीं, तो मुझे नहीं लगता कि आप स्टैश के साथ ऐसा क्यों नहीं करते हैं। यदि आप वास्तव में जानना चाहते हैं कि उनमें क्या शामिल है, तो आप यह दिखाने के लिए कि कौन सी फाइलें बदली गई हैं, या गिट-स्टैश लागू करें और वास्तविक अंतर देखने के लिए गिट-डिफ को गिट-स्टैश शो का उपयोग करें। नीचे छिड़काव की छड़ें रखना आपकी शाखाओं को नियंत्रण में रखने जैसा ही है। –

+16

असल में, आप 'गीट स्टैश ड्रॉप [] ' –

+1

ट्रू का उपयोग कर एक सिंगल स्टैश को हटा सकते हैं, गिट में अब लंबे समय तक गिट स्टैश ड्रॉप है। अब उपयोग करने के लिए यह पिटा का बहुत कम है। मैं इसे हर दिन, और समय के लंबे समय तक भी उपयोग करता हूं। – webmat

48

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

आपके वर्तमान परिवर्तन

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

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

$ git stash list 
[email protected]{0}: WIP on master: e71813e..." 

[email protected]{0} भाग नोट करें? यह तुम्हारा स्टैश आईडी है। इसे बाद में इसे पुनर्स्थापित करने के लिए आपको इसकी आवश्यकता होगी। चलो अभी यह करते हैं। आपके द्वारा किए गए प्रत्येक स्टैश के साथ स्टैश आईडी बदल जाती है। स्टैश @ {0} आपके द्वारा बनाए गए आखिरी छेड़छाड़ को संदर्भित करता है।

एक गुप्त कोष में लागू करने के लिए

$ git stash apply [email protected]{0} 

आप देख सकते हैं गुप्त कोष में अभी भी वहाँ के बाद आप इसे लागू किया गया है। यदि आपको इसकी आवश्यकता नहीं है तो आप इसे छोड़ सकते हैं।

$ git stash drop [email protected]{0} 

या, क्योंकि गुप्त कोष में एक ढेर की तरह काम करता है, तो आप पिछले गुप्त कोष में आप को बचाया बंद पॉप कर सकते हैं:

$ git stash pop 

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

$ git stash clear 

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

$ git stash 
... 
$ git stash pop 

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

I also have a more in-depth version of this posted on my blog

+0

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

3

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

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

  • git stash गंदा Git राज्य बाल बाल बचाता है (संशोधित फ़ाइलों, और कहा सूचकांक में फ़ाइलें), जबकि git-bottleसब कुछ कि HEAD से अलग है को बचाने के लिए डिज़ाइन किया गया है, और यह संशोधित, संशोधित और नहीं जोड़ा गया, जोड़ा नहीं गया, अनमोल पथ, और पूर्ण rebase/विलय राज्यों के बीच एक संरक्षित तरीके में अंतर करता है (केवल .gitignore के तहत पथ सहेजे नहीं गए हैं)।
  • git stash ऑब्जेक्ट्स को छिपाने के लिए सहेजता है जिन्हें आपको अलग-अलग ट्रैक रखने की आवश्यकता होती है। अगर मैंने 2 सप्ताह पहले कुछ छीन लिया था तो मुझे शायद याद नहीं होगा, जबकि git-bottleके रूप में बचाता है वर्तमान शाखा पर टेटेटिव प्रतिबद्धता करता है। रिवर्स एक्शन git-unbottle है जो git stash पॉप के बराबर है।भंडारों के बीच इन गतिविधियों को धक्का देना और साझा करना संभव है। यह रिमोट बिल्ड के लिए उपयोगी हो सकता है, जहां आपके पास केवल रिमोट सर्वर में निर्माण के लिए, या संघर्ष समाधान पर अन्य लोगों के साथ सहयोग करने के लिए एक और भंडार है।
संबंधित मुद्दे