कोड रिव्यू आ गया और तीन फ़ाइलें आधी-अधूरी हैं, जबकि टस-से-मस सिर्फ़ एक हो सकती है। सब कुछ stash करके बाकी दो फ़ाइलें फिर से टाइप करना — वह रस्म जिसका किसी को नफ़रत नहीं।
TL;DR: git stash push -m "वजह" -- <path> ठीक नामित पाथ ही stash करता है और आपके गंदे ट्री के बाकी हिस्से को चैन से छोड़ देता है। बदलाव git stash pop से वापस लाएँ (या किसी भी stash से एक फ़ाइल अलग से git restore --source stash@{0} -- <path> से निकालें)। pathspec रूप git 2.13 (मई 2017) के साथ आया — पिछले आठ साल का हर टूलचेन इसे रखता है।
git stash push -m "app.conf prod tweak" -- app.conf
git stash list
# stash@{0}: On main: app.conf prod tweak
git stash pop ट्री नहीं, फ़ाइल stash करो।
git में एक फ़ाइल ही stash कैसे करें?
खाली git stash पूरा वर्किंग ट्री बुहार देता है — हर ट्रैक किया बदलाव stash में चला जाता है और सब HEAD पर लौट आता है। जब गंदा ट्री मिश्रित हो, तो यह गलत आकार है: एक फ़ाइल सौंपने लायक है, बाकी सचमुच अधूरी। जवाब है pathspec के साथ push, git-stash दस्तावेज़ के मुताबिक़:
# पहले: तीन गंदी फ़ाइलें
$ git status --short
M app.conf
M notes.md
M main.py
# सिर्फ़ app.conf stash करें
$ git stash push -m "app.conf prod tweak" -- app.conf
Saved working directory and index state On main: app.conf prod tweak
$ git status --short
M notes.md
M main.py app.conf कमिट की हुई स्थिति में लौट आया और stash@{0} में जा बैठा; notes.md और main.py हिले तक नहीं। -m का संदेश वैकल्पिक है, पर जिस पल git stash list में दूसरी एंट्री दिखे, वे तीन सेकंड वसूल हैं — “WIP” नाम के stash जल्दी बूढ़े होते हैं।
दो काम के ब्योरे:
- pathspec
--के बाद आता है। दोहरे डैश के बाद सब कुछ पाथ है, फ़्लैग नहीं।git checkout -- <path>वही परंपरा है और यह सजावटी नहीं: पुराने वर्ज़न मेंgit stash push -- main.pyऔरgit stash push main.pyअलग बर्ताव करते थे, जहाँ नंगा पाथ गलत पढ़ा जा सकता था। - बिना ट्रैक की फ़ाइलों को
-uचाहिए। एकदम नई फ़ाइल के पास stash करने लायक कोई ट्रैक्ड इतिहास नहीं होता, इसलिए साधारणpushउसे छोड़ देता है।git stash push -u -- newfile.pyउसे शामिल करता है;-aऔर आगे जाकर ignored फ़ाइलों को भी बुहार लेता है।
एक ही फ़ाइल का कुछ हिस्सा कैसे stash करें?
जब खुद फ़ाइल आधी तैयार हो — तीन अच्छे hunk, एक शर्मनाक — तो इंटरैक्टिव फ़्लो उसे काटता है:
git stash -p # या: git stash push -p Git हर hunk पर पूछता है Stash this hunk [y,n,q,a,d,j,g,/,e,p,?]?। जो hunk stash जाएँ उन पर y, जो रहें उन पर n। नतीजा: ऐसा stash जिसमें सिर्फ़ मंज़ूर-शुदा है, और फ़ाइल का बाकी हिस्सा ट्री में गंदा तस-व-तस। वही hunk-दर-hunk मशीन git add -p भी चलाती है, सो रिफ़्लेक्स सीधा ट्रांसफ़र होता है।
git stash push -- <path> | git stash -p | |
|---|---|---|
| कण | पूरी फ़ाइलें | अलग-अलग hunk |
| गति | एक कमांड, स्क्रिप्ट के लायक | इंटरैक्टिव, hunk-दर-hunk |
| CI में दोहराव | हाँ (पाथ तर्क के रूप में) | नहीं — प्रॉम्प्ट पर इंसान चाहिए |
| सबसे उपयुक्त | “यह फ़ाइल, बाकी नहीं” | “यह बदलाव, वह नहीं” |
| से | git 2.13 (मई 2017) | बरसों से मौजूद |
दस्तावेज़ के अपने मॉडल से प्रयोग का नियम: जब सीमा ही फ़ाइल हो तो pathspec, जब फ़ाइल के भीतर हो तो -p।
stash की हुई फ़ाइल वापस कैसे लाएँ?
git stash pop stash@{0} बहाल करता है और एंट्री हटा देता है। सामान्य रास्ता — पर pop हर stash पर सब-या-कुछ-नहीं है, और कॉन्फ़्लिक्ट पर pop रुक जाता है, एंट्री सुरक्षित रहती है। दो महीन विकल्प:
# 1. बिना हटाए लागू करें (बेख़ौफ़ दोहराया जा सकता है)
git stash apply stash@{0}
# 2. किसी stash से एक फ़ाइल निकालें, एंट्री क़ायम रहे
git restore --source stash@{0} -- app.conf
# उसी ऑपरेशन की 2.23 से पुरानी लिखावट:
git checkout stash@{0} -- app.conf restore/checkout रूप उस हालत का जवाब है जब “तीन बदलाव साथ stash किए थे, अब सिर्फ़ एक चाहिए” — वह stash’d सामग्री वर्किंग ट्री में कॉपी करता है और stash@{0} खड़ा रहता है। ध्यान दें: यह वर्किंग ट्री की कॉपी को ओवरराइट करता है; अगर उस पाथ के मौजूदा बदलाव अहम हैं, पहले diff लें:
git diff stash@{0} -- app.conf stash reflog जैसे स्टैक पर सच्चे कमिट की तरह सँभाले रहते हैं — इसीलिए stash@{0} कोई भी commit-ish सिंटैक्स चलाता है, और ग़लती से गिराया stash भी अगली गारबेज कलेक्शन तक reflog से वापस आ सकता है।
stash कब ग़लत औज़ार है?
stash खता है, ब्रांच नहीं: git branch में कोई नाम नहीं, कोई रिव्यू नहीं, डिफ़ॉल्ट में कोई diff नहीं दिखता, और एंट्रियाँ चुपचाप इतनी जमा होती हैं कि भूल जाएँ। अगर चालू काम को मशीनों या दिनों के संदर्भ-बदलाव झेलने हों, तो ब्रांच पर कमिट करें — साथ लगा इतिहास बेनाम ढेर से बेहतर है। जब वे खड़े किए कमिट कहीं और उतरने हों तो git cherry-pick ढो लेता है। और अगर मक़सद पार्क करना नहीं बल्कि वापस लाना है, तो अंतिम कमिट रद्द करने का निर्णय-वृक्ष लागू होता है।
दस्तावेज़ किए व्यवहार से निकाला ईमानदार खराबी-बहीखाता:
| लक्षण | वजह | इलाज |
|---|---|---|
| stash के बाद फ़ाइल नहीं | untracked पाथ छोड़ दिए जाते हैं | git stash push -u -- <path> |
pop पर error: Your local changes ... would be overwritten | stash के बाद पाथ बदल गया | नई स्थिति कमिट या stash करें, फिर pop |
| निकाले बदलाव ग़ायब | pop कॉन्फ़्लिक्ट से रुक गया | सुलझाएँ, फिर git stash apply |
| “कौन-सा stash था?” | बेनाम stash का ढेर | हर बार -m संदेश |
git stash push में pathspec जोड़ने वाली मई 2017 की रिलीज़-नोट आज आठ साल की है, और ज़्यादातर git stash की मांसपेशी-स्मृति उससे भी पुरानी। एक बार फिर सीखने लायक है: आज पूरे ट्री की बुहारी ही विशेष स्थिति है, डिफ़ॉल्ट नहीं।
FAQ
git में सिर्फ़ एक फ़ाइल को stash कैसे करें?
git stash push -m "नोट" -- path/to/file — pathspec रूप केवल नामित पाथ को stash करता है और बाकी गंदी फ़ाइलों को अछूता छोड़ता है। git 2.13 या नया चाहिए (मई 2017)।
किसी stash से एक फ़ाइल अलग से कैसे निकालें?
git restore --source stash@{0} -- path/to/file (या पुराना रूप git checkout stash@{0} -- path/to/file)। stash एंट्री हटाए बिना stash किया हुआ वर्ज़न आपके वर्किंग ट्री में कॉपी हो जाता है।
git stash मेरी नई फ़ाइल को क्यों छोड़ देता है?
बिना ट्रैक की गई (untracked) फ़ाइलें साधारण stash का हिस्सा नहीं होतीं। -u जोड़ें: git stash push -u -- path/to/file। ignored फ़ाइलों के लिए -a चाहिए।
— mrsaynothing
— mrsaynothing
AI, Linux और self-hosting पर फ़ील्ड नोट्स।
अगला how-to ईमेल पर पाएं
हर पोस्ट पर एक ईमेल। ठीक कीजिए, आगे बढ़िए।
यह क्या है?Field Notes, एजेंट-चालित साइट #1: मशीन डिप्लॉय करती है। मंज़ूरी मेरी।
लेख पसंद आए? मैं पेशेवर रूप से ऐसे ही काम करता हूँ। मुझे हायर करें