Git stash لملف واحد: أرسِ الملف، لا الشجرة
stash push مع pathspec يُرسل الملف المسمّى فقط، و-p يقسّم بالهنكات، وrestore --source stash@{0} يرفع ملفًا واحدًا مع بقاء اللمحة سليمة.
■ space · حارة النثر
git stash push -m "why" -- <path> يُرسل الملف المسمّى وحده؛ وكل ملف متسخ آخر لا يتحرك قط.
ملف واحد إلى خارج أي ستش: git restore --source stash@{0} -- <path> — واللمحة تبقى.
صيغة المسار موجودة منذ git 2.13 (مايو 2017)؛ الملفات غير المتتبَّعة تحتاج -u.
الشطر
ثلاثة ملفات متسخة، واحدٌ يجب أن يتحرك. شاهد الشجرة تنقسم — ملفٌ إلى الستش، اثنان لا يتحركان:
قبل · git status --short
M app.conf ← must move
M notes.md
M main.py
بعد
M notes.md ← never moved
M main.py ← never moved
stash@{0}: On main: app.conf prod tweak
عاد app.conf إلى حالته المرسَّلة وجلس في stash@{0} — رسالة -m تكسب ثوانيها الثلاثة لحظة أن يضم git stash list أكثر من لمحة؛ أسماء مثل «WIP» تشيخ بسرعة
المسار هو الفخ كله
الستش العاري git stash يقمح الشجرة العاملة كلها — كل تعديل متتبَّع يدخل، وكل شيء يعود إلى HEAD. الصياغة الخطأ حين تكون الشجرة المتسخة مختلطة: ملف واحد جاهز للتسليم، والبقية غير منجزة بحق. تفصيلان يستحقان المعرفة:
- المسار يأتي بعد
--. كل ما بعد الشرطة المزدوجة مساراتٌ لا عَلَمات — الاتفاق نفسه عندgit checkout -- <path>، وليس ترفًا: إصدارات git الأقدم قد تسيء قراءة مسار عارٍ. - الملفات غير المتتبَّعة تحتاج
-u. الملف حديث الولادة ليس له تاريخ متتبَّع يُرسل، فالـpushالعارية تتجاوزه.git stash push -u -- newfile.pyتُدخله؛-aأبعد من ذلك وتقمح الملفات المتجاهلة أيضًا.
نصف ملف: الشطر التفاعلي
حين يكون الملف نفسه في نص جاهزيته — ثلاثة هنكات طيبة، وأحدهم محرج — git stash -p (أو git stash push -p) يعبر كل هك ويسأل Stash this hunk [y,n,q,a,d,j,g,/,e,p,?]?. جاوب y للهنكات التي تعود للستش، n لمن يبقى؛ الحصاد ستش لا يضم إلا ما أجزنت. المحرك الهنكيُّ نفسه يشغّل git add -p، فالمنعكس ينتقل. دقيقتا الحبيبات جانبًا لجانب:
git stash push -- <path> | git stash -p | |
|---|---|---|
| الحبيبية | ملفات كاملة | هنكات مفردة |
| السرعة | أمر واحد، يُسكرِب | تفاعلي، هكًا هكًا |
| قابل للتكرار في CI | نعم (المسارات وسائط) | لا — يحتاج إنسانًا أمام السؤال |
| أفضل لـ | «هذا الملف، لا البقية» | «هذا التغيير، لا ذاك» |
| منذ | git 2.13 (مايو 2017) | متاح منذ زمن طويل |
قاعدة الإبهام من نموذج التوثيق نفسه: المسار حين تكون الحافة الملف، -p حين تكون الحافة في جوفه.
ملف واحد إلى الخارج
git stash pop يعيد stash@{0} ويمحو اللمحة — الطريق الاعتيادي، لكن pop إما الكل أو لا شيء في كل ستش، والتعارض يجهض الـpop مع بقاء اللمحة. خياران أدق:
# 1. apply without dropping (safe re-run)
git stash apply stash@{0}
# 2. pull ONE file out of a stash, leave the entry intact
git restore --source stash@{0} -- app.conf
# pre-2.23 spelling of the same operation:
git checkout stash@{0} -- app.conf
تحقّق: git stash list بعد الـrestore → stash@{0} ما يزال واقفًا — الـpop وحده يمحو اللمحة
حين يكون الستش الأداة الخطأ
الستش ورقة مسودّة، لا فرع. الستشات لا تعيش إلا على جهازك، لا تحمل رسالة تتجاوز السطر الواحد، وسهولة نسيانها مشهورة — git stash list بعثرياتٌ قائمة بذاتها.git switch -c wip-labels العمل الذي عليه أن يصمد أيامًا، أو يتنقل بين الأجهزة، أو يحمل رسالة إرسال حقيقية، عقده فرعٌ:
نهاية الملف الواحد · لم يُجلب شيء · كل شيء محلي