गिट स्टैश शाखा-विशिष्ट या पूरे रिपॉजिटरी के लिए है?


97

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

क्या git stashशाखा-विशिष्ट या पूरे भंडार के लिए है? यदि यह संपूर्ण रिपॉजिटरी के लिए है, तो क्या मैं इसे शाखा-विशिष्ट बनाने के लिए विकल्प पास कर सकता हूं?

जवाबों:


43

वर्तमान स्टाॅक स्टैक देखने के लिए:

git stash list

स्टैक से एक विशिष्ट स्लैश चुनने के लिए, इसे ऊपर द्वारा दिखाए गए द्वारा देखें ।stash@{number}

यदि आप चाहते हैं कि व्यवहार प्रति-शाखा हो, तो आप शाखा पर केवल एक कमिट (या कई कमिट) कर सकते हैं। आप बाद में कमिट (ओं) को हमेशा "अनमेक" कर सकते हैं (जैसे, या git resetतो --softया --mixed, git रिसेट डॉक्यूमेंटेशन देखें ; या लौकिकता को त्यागते हुए git rebase -iकेवल अंतिम "वास्तविक" कमिट) रखने के लिए।

(वास्तव में अनुकरण करने के लिए git stashआपको कम से कम दो कमिट्स चाहिए, एक इंडेक्स स्टेट के लिए और एक वर्क-ट्री स्टेट के लिए। यदि आप इंडेक्स स्टेट को बचाने और रिस्टोर करने की योजना नहीं बना रहे हैं, हालांकि, आप git add -Aपूरे वर्क-ट्री स्टेट को देख सकते हैं। और इसे अस्थायी कमेटी में रखें। वैकल्पिक रूप से, git stashएक शेल स्क्रिप्ट है जिससे आप इसे आसानी से कॉपी कर सकते हैं और इसे आसानी से संशोधित कर सकते हैं, जिससे यह काम कर रहा है। संपूर्ण रेपो। आप अभी भी स्पष्ट रूप से नामकरण करके एक शाखा से दूसरी शाखा में एक स्लैश लाने में सक्षम होंगे।)refs/pb-stash/branchrefs/stash


क्या आप जानते हैं कि stash listकेवल विवरण के अलावा प्रत्येक आइटम की फ़ाइल सूची कैसे प्रदर्शित करें ?
उभयलिंगी

2
git stash show(या संस्करण के git stash show stash@{<number>}अलावा कुछ के लिए @{0}) आपको एक देता है diff --stat; -pएक बड़ा अंतर पाने के लिए जोड़ें । नोट: यह "काम के पेड़" की तुलना "स्टाॅस बैग" में करता है, जिसके खिलाफ यह लटका रहता है; यह देखने के लिए कोई फ्रंट-एंड इंटरफ़ेस नहीं है कि दिए गए स्टैश-बैग में "इंडेक्स" क्या है।
torek

56

नहीं और नहीं जीआईटी स्टैश प्रति रिपॉजिटरी है।

यहां इसका उपयोग करने के बारे में एक अच्छा पृष्ठ है।


क्या दूसरा स्टैश पहले ओवरराइट करता है? IOW, अगर मैं दो स्टैस करता हूं, लेकिन बीच में कोई अस्थिरता नहीं है, तो क्या मैं पहला स्टैश खो देता हूं?
उभयचर

1
नहीं, तुम एक ढेर (पिछले में पहली बार बाहर) चोरी की। आप अपने
स्टाॅस

18

git stash प्रति-शाखा नहीं है।

  • इसके बजाय git stash(जब आप बहुत सारी चोरी और शाखाओं को आसानी से खो सकते हैं)
  • मेरा सुझाव है कि git commitअपनी शाखा में अधूरे कोड को सहेजने के लिए और जब आप कोड को पूरा करने के लिए तैयार हों तो git reset ${COMMIT_HASH_VALUE}अधूरा कोड वापस पाने के लिए
  • git commitऔर git resetजब एक साथ सही ढंग से उपयोग किया जाता है तो git stashएक विशिष्ट शाखा के लिए अनुकरण कर सकते हैं

यहां एक सामान्य वास्तविक जीवन परिदृश्य है जो मूल्य और उपयोग commitऔर resetआदेशों को प्रदर्शित करता है :

  • आप सुविधा शाखा X पर काम कर रहे हैं और आपका कोड परीक्षणों को संकलित या पास भी नहीं करता है
  • एक बग है जो वर्तमान नई सुविधा की तुलना में उच्च प्राथमिकता है और इसलिए आपको बग फिक्स पर तुरंत काम शुरू करना होगा
  • इसके बजाय एक गॅट स्टैश करें (और स्टेश मिक्स में खो जाता है क्योंकि आपके पास बहुत सी स्टैच और कई ब्रांच हैं)
  • आप git commitसुविधा शाखा X पर कर सकते हैं
    • COMMIT_HASH_VALUEबाद के लिए लिखें
  • हॉट फिक्स के लिए एक नई शाखा Y चेकआउट करें
  • शाखा Y पर हॉट फ़िक्स को समाप्त करें (बेसलाइन में हॉट फ़िक्स प्राप्त करने के लिए एक मर्ज अनुरोध करें और हॉट फ़िक्स शाखा को हटा दें)
  • फिर सुविधा शाखा X को फिर से चेकआउट करें
  • अपने अधूरे काम को पॉप करने के लिए जो परीक्षण को संकलित या पारित नहीं करता था -> बस एक करें git reset ${COMMIT_HASH_VALUE}

(FYI के लिए डिफ़ॉल्ट git resetहै --mixed)


2
इस परिदृश्य में रीसेट करने का एक आसान शॉर्टकट है git reset HEAD~1
सैम ए। होर्वाथ-हंट

1
@samHH के पास git रीसेट HEAD ^ 1 के साथ बहुत सारे उदाहरण हैं। गलती से दो बार हिट हो रहे हैं ... इसलिए मैं उपयोग नहीं करना चाहता हूं HEAD^1या नहीं HEAD~1
ट्रेवर बोयड स्मिथ

12

मुझे यकीन नहीं है कि यहाँ हर उत्तर commit+ के साथ स्लैश का अनुकरण करने का सुझाव क्यों देता है reset। स्टैस का उपयोग करने के लिए पूरी तरह से ठीक है, खासकर जब कई शाखाओं पर काम कर रहे हों। जब मैं कई शाखाओं पर काम करता हूं तो मैं भी प्रतिबद्ध नहीं करना चाहता, क्योंकि मैं चाहता हूं कि मेरे लौटने पर मेरे संपादक में सभी संशोधित बदलाव अभी भी उजागर हों।

तो यहाँ स्टाफ़ वर्कफ़्लो है:

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

git stash save "Your custom stash message"

जब आप किसी शाखा में लौटते हैं, तो स्टैश चेकआउट करें

git stash list

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

यदि आप शाखा पर हैं तो आप FixIssue0203उपयोग कर सकते हैं git stash popक्योंकि यह शीर्ष पर लागू होगा stash@{0}और इसे स्टैश से हटा देगा।

हालाँकि, यदि आपकी शाखा में ImproveReadmeआपको पहले स्टैश 1 लगाना चाहिए git stash apply stash@{1}और फिर स्टैक 1 को स्टैक से हटा दें git stash drop stash@{1}

बस!

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