स्टैशिंग आपको Git रिपॉजिटरी में अपने कोड को बाद के लिए सहेजने देती है।
जब आप Git रिपॉजिटरी के साथ काम कर रहे होते हैं, तो आप फ़ाइल में परिवर्तन कर सकते हैं जिन्हें आप बाद में Git कमिट पर लागू करना चाहते हैं।
यहीं git stash कमांड काम आती है। स्टैशिंग आपको अपने वर्किंग ब्रांच पर कोड को बाद की तारीख के लिए सहेजने देती है। इस ट्यूटोरियल में, हम उदाहरणों के साथ, Git में स्टैशिंग की मूल बातें और git stash कमांड का उपयोग कैसे करें, इस पर चर्चा करेंगे।
Git Stash क्या है?
स्टैशिंग आपको अपने वर्किंग डायरेक्टरी और इंडेक्स में कोड को बाद के लिए सहेजने देती है। कभी-कभी, जब आप कोड लिख रहे होते हैं, तो आप अपने द्वारा किए गए परिवर्तनों को सहेजना चाहेंगे, लेकिन उन्हें रिपॉजिटरी में कमिट नहीं करना चाहेंगे।
एक परिदृश्य जहां ऐसा हो सकता है वह है इश्यू फिक्सिंग में। मान लें कि एक बग रिपोर्ट आती है। आप पहले से ही एक फीचर लागू करने पर काम कर रहे हैं। आप पहले फीचर की ओर किए गए परिवर्तनों को सहेजना चाह सकते हैं और फिर बग ठीक कर सकते हैं।
ऐसा इसलिए है क्योंकि बग रिपोर्ट आपके द्वारा विकसित किए जा रहे फीचर पर प्राथमिकता लेगी। आप पहले बग ठीक करना चाहेंगे, फिर फीचर-फोकस्ड कोड को रिपॉजिटरी में कमिट करेंगे। आप नहीं चाहेंगे कि आपका बग फिक्स और फीचर कमिट में दिखाई दें। ऐसा इसलिए है क्योंकि बड़े और अधिक जटिल कमिट्स अन्य डेवलपर्स के लिए रिपॉजिटरी के इतिहास को पढ़ना अधिक कठिन बना देते हैं।
दूसरे शब्दों में, स्टैशिंग आपको अपने मौजूदा कोड को त्यागने या कमिट किए बिना Git रिपॉजिटरी में किसी और चीज़ पर काम करने देती है।
स्टैशिंग आपको आपके द्वारा फ़ाइल में किए गए परिवर्तनों को सहेजने, या "स्टैश" करने, बाद के लिए अनुमति देती है। एक बार फ़ाइल स्टैश हो जाने के बाद, आप किसी और चीज़ पर काम कर सकते हैं। फिर, आप बाद में वापस आ सकते हैं और आपके द्वारा स्टैश किए गए परिवर्तनों को अपने कोड पर लागू कर सकते हैं।
स्टैशिंग वर्तमान वर्किंग डायरेक्टरी को अंतिम कमिट पर वापस लाता है। इसका मतलब है कि हमारे कोड को स्टैश करने से हमें एक साफ वर्किंग डायरेक्टरी मिलती है जिसके साथ हम काम कर सकते हैं। एक साफ डायरेक्टरी होने का मतलब है कि हम मर्ज कन्फ्लिक्ट्स की चिंता किए बिना परिवर्तन कर सकते हैं। हमें कमिट्स के बीच किए गए परिवर्तनों को सॉर्ट करने के बारे में भी सोचने की ज़रूरत नहीं है।
Git में परिवर्तनों को स्टैश कैसे करें
git stash कमांड का उपयोग बाद के लिए कोड को स्टैश करने के लिए किया जाता है। जब आप git stash चलाते हैं, तो आपके वर्तमान वर्किंग डायरेक्टरी में आपके द्वारा कमिट में पुश नहीं किए गए परिवर्तनों को बाद के लिए सहेजा जाएगा। इसमें स्टेज्ड परिवर्तन (git add का उपयोग करके स्टेजिंग एरिया में जोड़े गए परिवर्तन) और अनस्टेज्ड परिवर्तन दोनों शामिल हैं।
यहाँ git stash कमांड के लिए सिंटैक्स है:
git stash
मान लें कि हम एक वेबसाइट पर काम कर रहे हैं और हमारा कोड Git रिपॉजिटरी में संग्रहीत है।
हमने अपने कोड में index.html और index.js फ़ाइलों में परिवर्तन किए हैं। हम इन फ़ाइलों को बाद के लिए स्टैश करना चाहते हैं जबकि हम अपने index.html फ़ाइल में डिज़ाइन बग ठीक करते हैं।
अपने परिवर्तनों को देखने के लिए, हम git status कमांड का उपयोग कर सकते हैं। यह हमारे उदाहरण में लौटाता है:
On branch master Your branch is up to date with 'origin/master'. Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html
यह हमें दिखाता है कि हमने एक नई फ़ाइल बनाई है (index.js), और हमने एक मौजूदा फ़ाइल को संशोधित किया है (index.html)। हम इन परिवर्तनों को बाद के लिए सहेजना चाहते हैं जबकि हम अपने कोडबेस के दूसरे भाग पर काम करते हैं। ऐसा करने के लिए, हम git stash कमांड का उपयोग करने जा रहे हैं:
git stash
हमारा कोड लौटाता है:
Saved working directory and index state WIP on master: 3b16026 feat: Launch new homepage
git stash कमांड ने हमारे रिपॉजिटरी में किए गए परिवर्तनों को बाद के लिए सहेज लिया है। अब, यदि हम फिर से git status कमांड चलाते हैं, तो हम देख सकते हैं कि कमिट करने के लिए कुछ भी नहीं है:
On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean
git stash कमांड ने हमारे रिपॉजिटरी में किए गए परिवर्तनों को बाद के लिए सहेज लिया है। अब, यदि हम फिर से git status कमांड चलाते हैं, तो हम देख सकते हैं कि कमिट करने के लिए कुछ भी नहीं है:
जब आपका कोड स्टैश हो जाता है, तो आपका रिपॉजिटरी आपके द्वारा किए गए परिवर्तनों के बिना पिछले कमिट पर वापस आ जाता है। आपके द्वारा अपने कोड में किए गए परिवर्तनों को बाद के लिए सहेजा गया है। उन्हें stash pop कमांड का उपयोग करके जब आप तैयार हों तब आपके कोडबेस पर लागू किया जा सकता है।
अनट्रैक्ड परिवर्तनों को स्टैश करना
git stash कमांड केवल Git रिपॉजिटरी में पहले से ट्रैक की जा रही फ़ाइलों में स्टेज्ड और अनस्टेज्ड परिवर्तनों को स्टैश करेगा। डिफ़ॉल्ट रूप से, स्टैश कमांड अनट्रैक्ड परिवर्तनों को शामिल नहीं करता।
स्टेज्ड परिवर्तन वे परिवर्तन हैं जिन्हें स्टेजिंग एरिया में जोड़ा गया है। अनस्टेज्ड परिवर्तन जो स्टैश किए जाते हैं वे Git द्वारा ट्रैक की गई फ़ाइलों में किए गए परिवर्तन हैं। यदि आप एक नई फ़ाइल बदलते हैं जो Git द्वारा ट्रैक नहीं की जाती है, तो इसे Git स्टैश में नहीं जोड़ा जाएगा। अनदेखी की गई फ़ाइलों को स्टैश में नहीं जोड़ा जाएगा।
ये git stash कमांड का उपयोग करते समय लागू डिफ़ॉल्ट प्राथमिकताएं हैं। यदि आप अपनी अनट्रैक्ड फ़ाइलों को स्टैश करना चाहते हैं — जैसे कि एक नई फ़ाइल जिसे स्टेज नहीं किया गया है — तो आप -u फ्लैग का उपयोग कर सकते हैं। यहाँ -u फ्लैग के लिए सिंटैक्स है:
git stash -u
वैकल्पिक रूप से, यदि आप अपने स्टैश में अनदेखी फ़ाइलों को शामिल करना चाहते हैं, तो आप -a फ्लैग का उपयोग कर सकते हैं। यहाँ -a फ्लैग के लिए सिंटैक्स है:
git stash -a
-a फ्लैग का उपयोग करने से git stash को आपकी अनदेखी फ़ाइलों में परिवर्तनों को स्टैश करने के लिए कहा जाएगा। ये वे फ़ाइलें हैं जिन्हें आपके कोड रिपॉजिटरी में .gitignore फ़ाइल में परिभाषित किया गया है (यदि आपके पास एक है)।
git stash pop का उपयोग करके स्टैश किए गए परिवर्तनों को लागू करें
git stash pop कमांड का उपयोग स्टैश किए गए परिवर्तनों को रिपॉजिटरी पर लागू करने के लिए किया जाता है। मान लें कि हमने तय किया है कि हम पिछले उदाहरण में किए गए स्टैश किए गए परिवर्तनों को लागू करना चाहते हैं। हम ऐसा इस कमांड का उपयोग करके कर सकते हैं:
git stash pop
git stash pop कमांड लौटाता है:
On branch master Your branch is up to date with 'origin/master'. Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html Dropped refs/stash@{0} (48afd55381cf43f2332f771349c7233fb99f80a6)
git stash pop कमांड चलाने पर, हमारे स्टैश से परिवर्तन हमारे रिपॉजिटरी की स्थानीय वर्किंग कॉपी पर लागू होते हैं। पॉप कमांड स्टैश में कोड को आपके रिपॉजिटरी पर लागू करता है। फिर, स्टैश खाली हो जाता है।
git stash pop कमांड आपके द्वारा अपने कोड में किए गए परिवर्तनों की एक सूची भी लौटाता है, जो दिखाता है कि आपके स्टैश में क्या था।
आप git stash apply कमांड का उपयोग करके अपने कोड में किए गए परिवर्तनों को लागू कर सकते हैं। आप उन परिवर्तनों को अपने स्टैश में रख सकते हैं। हम निम्न कमांड का उपयोग करके अपने स्टैश में परिवर्तनों को रख सकते हैं:
git stash apply
कमांड लौटाता है:
On branch master Your branch is up to date with 'origin/master'. Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html
कई ब्रांचेज़ में परिवर्तन लागू करना
अपने कोडबेस में कई ब्रांचेज़ में समान स्टैश किए गए परिवर्तनों को लागू करना स्टैश कमांड के लिए एक अच्छा उपयोग मामला है। उदाहरण के लिए, आप एक ब्रांच पर स्टैश लागू करने का निर्णय ले सकते हैं। फिर, आप दूसरी ब्रांच पर जाएंगे और सहेजे गए परिवर्तनों को लागू करने के लिए उसी स्टैश का उपयोग करेंगे।
एकाधिक स्टैशेज़
आप Git में एकाधिक स्टैशेज़ बना सकते हैं। इसका मतलब है कि आप एक फ़ाइल में परिवर्तन कर सकते हैं और उन्हें बाद के लिए स्टैश कर सकते हैं। आप दूसरी फ़ाइल में परिवर्तन कर सकते हैं और उन्हें अलग स्टैश में संग्रहीत कर सकते हैं।
स्टैशेज़ ट्रैक करना
रिपॉजिटरी में स्टैशेज़ की सूची लौटाने के लिए, आप निम्न कमांड चला सकते हैं:
git stash list
मान लें कि हम हमारे द्वारा बनाए गए सभी स्टैशेज़ की सूची पुनः प्राप्त करना चाहते हैं। हम उपरोक्त कमांड निष्पादित करके ऐसा कर सकते हैं। यह कमांड लौटाता है:
stash@{0}: WIP on master: 3b16026 feat: Launch new homepage stash@{1}: WIP on master: 3b16026 feat: Launch new homepage
git stash list कमांड ने हमारे स्टैशेज़ की सूची लौटाई।
हालांकि, ये स्टैशेज़ केवल स्टैश से जुड़े डिफ़ॉल्ट कमिट संदेशों का उपयोग करते हैं। इसका मतलब है कि हमारे लिए यह ट्रैक करना मुश्किल है कि कौन सा स्टैश किन परिवर्तनों को शामिल करता है। ऐसा इसलिए है क्योंकि हमने अपने किसी भी स्टैश पर विवरण निर्दिष्ट नहीं किया है।
मान लें कि हम एक नए स्टैश में विवरण जोड़ना चाहते हैं। हम ऐसा इस कमांड का उपयोग करके कर सकते हैं:
git stash save "add new change to website"
कमांड लौटाता है:
Saved working directory and index state On master: add new change to website
हमारे पिछले कमिट से जुड़े डिफ़ॉल्ट संदेश दिए जाने के बजाय, हमारे स्टैश को अपना संदेश दिया गया है।
एकाधिक स्टैशेज़ लागू करना
git stash pop कमांड आपके रिपॉजिटरी पर सबसे हालिया स्टैश लागू करता है (वह जिसके पास stash@{0} टैग है)। हालांकि, जब आप एकाधिक स्टैशेज़ के साथ काम कर रहे होते हैं, तो आप अपने कोडबेस पर एक विशिष्ट स्टैश लागू करना चाह सकते हैं।
आप स्टैश से जुड़े यूनिक ID को निर्दिष्ट करके ऐसा कर सकते हैं जिसे आप अपने कोडबेस पर लागू करना चाहते हैं। मान लें कि हम stash@{1} पर संग्रहीत स्टैश को अपने कोडबेस पर लागू करना चाहते हैं। हम ऐसा इस कमांड का उपयोग करके कर सकते हैं:
git stash pop stash@{2}
कमांड stash@{2} में संग्रहीत परिवर्तनों को हमारे रिपॉजिटरी पर लागू करता है और स्टैश को हटा देता है।
स्टैश का उपयोग करके ब्रांच बनाना
स्टैशिंग आपके द्वारा कोडबेस में किए गए परिवर्तनों को सुविधाजनक तरीके से संग्रहीत करने का एक तरीका है जबकि आप दूसरा परिवर्तन करने पर काम करते हैं।
हालांकि, ऐसे समय हो सकते हैं जब, स्टैश बनाए रखने के बजाय, आप अपने कोड को अपनी खुद की ब्रांच में ले जाना चाहते हैं।
यह परिदृश्य उत्पन्न हो सकता है यदि आपके कोड को मर्ज करते समय कन्फ्लिक्ट्स उत्पन्न होते हैं। आप कोड को दूसरी ब्रांच में ले जाना चाह सकते हैं यदि आप कोडबेस में बड़े परिवर्तन कर रहे हैं। यहीं git stash branch कमांड काम आती है।
आप git stash branch कमांड का उपयोग एक नई ब्रांच बनाने के लिए कर सकते हैं जिस पर स्टैश में परिवर्तन लागू किए जाएंगे। इस कमांड के लिए सिंटैक्स इस प्रकार है:
git stash branch <new-branch> <stash-id>
"new-branch" पैरामीटर उस ब्रांच की ID को संदर्भित करता है जिसे बनाया जाना चाहिए। "stash-id" उस स्टैश की ID को संदर्भित करता है जिसका कोड आप नई ब्रांच पर लागू करना चाहते हैं।
मान लें कि हम अपने stash@{2} स्टैश से परिवर्तनों को "update-site" नामक नई ब्रांच पर लागू करना चाहते हैं। हम ऐसा इस कमांड का उपयोग करके कर सकते हैं:
git stash branch update-site stash@{2}
कमांड लौटाता है:
Switched to a new branch 'update-site' On branch update-site Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html Dropped stash@{2} (9a15b9cd20f8988937134d1267fafbea4c6a8647)
सबसे पहले, git stash branch कमांड हमारे स्टैश किए गए परिवर्तनों के लिए एक नई ब्रांच बनाता है। हमारे द्वारा अपने रिपॉजिटरी में किए गए परिवर्तनों को नई ब्रांच पर लागू किया जाता है। फिर, हम उस ब्रांच को देखने के लिए स्विच हो जाते हैं। अंत में, हमारा स्टैश हटा दिया जाता है क्योंकि स्टैश किया गया कोड अपनी खुद की ब्रांच में सहेजा गया है।
Git Stash हटाएं
एक बार जब आप स्टैश में कोड का उपयोग कर लेते हैं, तो आप स्टैश को हटाने के लिए git stash drop कमांड का उपयोग कर सकते हैं। यहाँ git stash drop कमांड के लिए सिंटैक्स है:
git stash drop <stash>
मान लें कि हम ID stash@{2} वाले स्टैश को ड्रॉप करना चाहते हैं। हम ऐसा इस कमांड का उपयोग करके कर सकते हैं:
git stash drop stash@{2}
कमांड लौटाता है:
Dropped stash@{2} (82079798c950b053fac0efb7b1d5693864dc96e7)
वैकल्पिक रूप से, आप रिपॉजिटरी से जुड़े सभी स्टैशेज़ को हटाने के लिए git stash clear कमांड का उपयोग कर सकते हैं। इस कमांड के लिए सिंटैक्स है:
git stash clear
यह कमांड हमारे रिपॉजिटरी में सभी स्टैशेज़ को हटा देता है।
विशिष्ट फ़ाइलों को स्टैश करना
git stash कमांड डिफ़ॉल्ट रूप से आपकी वर्तमान वर्किंग डायरेक्टरी में सभी ट्रैक की गई फ़ाइलों को स्टैश करता है। हालांकि, कुछ मामलों में, आप तय कर सकते हैं कि आप किसी विशिष्ट फ़ाइल या फ़ाइलों के सेट को स्टैश करना चाहते हैं।
आप git stash push कमांड का उपयोग करके किसी विशिष्ट फ़ाइल को स्टैश कर सकते हैं। यहाँ इस कमांड का उपयोग करने के लिए सिंटैक्स है:
git stash push -m "<message>" <file>
"message" पैरामीटर उस संदेश को संदर्भित करता है जो आपके स्टैश से जुड़ा होगा। "file" पैरामीटर उस फ़ाइल का नाम है जिसे आप स्टैश करना चाहते हैं।
मान लें कि हम अपने कोड में index.html फ़ाइल में किए गए परिवर्तनों को केवल एक स्टैश में जोड़ना चाहते हैं। हम ऐसा इस कमांड का उपयोग करके कर सकते हैं:
git stash push -m "feat: changed index.html file" index.html
कमांड लौटाता:
Saved working directory and index state On master: feat: changed index.html file
कमांड ने केवल index.html फ़ाइल को कमिट संदेश "feat: changed index.html file" के साथ एक स्टैश में जोड़ा है। हमारे द्वारा अपने कोड में किए गए अन्य सभी परिवर्तनों को नहीं जोड़ा गया है।
स्टैशेज़ के बीच अंतर दिखाएं
जब आप स्टैशेज़ के साथ काम कर रहे होते हैं, तो आप अपने कोडबेस में कई कमिट्स में कई अलग-अलग परिवर्तन करने की संभावना रखते हैं इससे पहले कि आप उस कोड पर वापस आएं जिसे आपने स्टैश किया था।
उदाहरण के लिए, यदि आपने अपना कोड स्टैश किया है और बग ठीक करने चले गए हैं, तो आप अपने स्टैश किए गए कोड पर वापस आने से पहले बग ठीक करने के लिए कुछ कमिट्स पुश कर सकते हैं। इसका मतलब है कि आप अपने स्टैश और अपने कोड के सबसे हालिया कमिट के बीच अंतर का सारांश देखना चाह सकते हैं (ताकि आप जान सकें कि आपने अपना कोड स्टैश करने के बाद से क्या परिवर्तन किए हैं)।
किसी स्टैश और आपके सबसे हालिया कमिट के बीच अंतर देखने के लिए, आप git stash show कमांड का उपयोग कर सकते हैं। इस कमांड के लिए सिंटैक्स है:
git stash show <stash-id>
"stash-id" पैरामीटर उस स्टैश की ID है जिसके परिवर्तनों की आप अपने ब्रांच के सबसे हालिया कमिट से तुलना करना चाहते हैं। मान लें कि हम अपने stash@{1} स्टैश में कोड की तुलना अपने कोड की वर्तमान स्थिति से करना चाहते हैं। हम ऐसा इस कमांड का उपयोग करके कर सकते हैं:
git stash show stash@{1}
कमांड लौटाता:
index.html | 2 +- index.js | 0 2 files changed, 1 insertion(+), 1 deletion(-)
यह आउटपुट हमें बताता है कि हमने अपने कोड में दो परिवर्तन किए हैं: एक इंसर्शन और एक डिलीशन। यदि हम अपनी फ़ाइलों के बीच अंतर देखना चाहते हैं, तो हम उन्हें -p स्टैश फ्लैग का उपयोग करके देख सकते हैं। इस फ्लैग के लिए सिंटैक्स इस प्रकार है:
git stash show -p stash@{1}
उपरोक्त कमांड, जब निष्पादित किया जाता है, तो लौटाता है:
diff --git a/index.html b/index.html index 4dd1ef7..e859c68 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -