git stash
تخبئة تغييرات مجلد عمل معدَّل جانبًا
يأخذ الأمر 'git stash' تغييراتك غير المحفوظة (المجهّزة وغير المجهّزة)، ويحفظها لاستخدام لاحق، ثم يعيد نسخة عملك إلى حالتها. يمكنك إعادة تطبيق التغييرات المخبّأة لاحقًا بـ 'git stash pop' أو 'git stash apply'. التخبئة مفيدة حين تحتاج إلى تبديل السياق بسرعة للعمل على شيء آخر وأنت في منتصف تغيير غير جاهز للحفظ. الـ stash مكدّس، فيمكن أن يكون لديك أكثر من واحد.
الصيغة
git stash list [<log-options>]
git stash show [-u | --include-untracked | --only-untracked] [<diff-options>] [<stash>]
git stash drop [-q | --quiet] [<stash>]
git stash pop [--index] [-q | --quiet] [<stash>]
git stash apply [--index] [-q | --quiet] [<stash>]
git stash branch <branchname> [<stash>]
git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet] [-u | --include-untracked] [-a | --all] [(-m | --message) <message>] [--] [<pathspec>...]]
git stash clearالخيارات
اختيار الخيار المناسب
استعادة التغييرات المخبّأة
اختر الأمر المناسب لاستعادة عملك المخبّأ
| الأمر | يُبقي الـ stash؟ | يُطبَّق على | عند التعارض |
|---|---|---|---|
git stash pop | لا - يُزال بعد التطبيق | الفرع الحالي | يبقى الـ stash، ويجب الحل |
git stash apply | نعم - يبقى في المكدّس | الفرع الحالي | يبقى الـ stash، ويجب الحل |
git stash branch <name> | لا - يُزال بعد التطبيق | فرع جديد عند أساس الـ stash | لا تعارضات (فرع جديد) |
ما الذي يُخبَّأ؟
التحكم في الملفات المضمَّنة في الـ stash
| الأمر | المتتبَّعة المعدّلة | مجهّزة | غير متتبَّعة | المتجاهَلة |
|---|---|---|---|---|
git stash | نعم | نعم | No | No |
git stash -u | نعم | نعم | نعم | No |
git stash -a | نعم | نعم | نعم | نعم |
git stash -k | نعم | نعم (وتبقى مجهّزة أيضًا) | No | No |
الـ stash مقابل طرق الحفظ الأخرى
متى تستخدم الـ stash ومتى البدائل
| الأمر | أين يُحفظ | قابل للمشاركة | الأنسب لـ |
|---|---|---|---|
git stash | الـ reflog المحلي | No | تبديل سياق سريع، حفظ مؤقت |
git commit (WIP) | تاريخ الفرع | نعم (إن دُفع) | عمل قد تريد مشاركته أو الرجوع إليه |
git worktree | مجلد منفصل | N/A | العمل على عدة فروع في الوقت نفسه |
إدارة عدة stash
أوامر للتعامل مع مكدّس الـ stash
| الأمر | يعرض المحتوى | يعدّل المكدّس | حالة الاستخدام |
|---|---|---|---|
git stash list | الفهرس + الرسالة | No | عرض كل الـ stash |
git stash show | Diffstat | No | معاينة سريعة للتغييرات |
git stash show -p | الـ diff الكامل | No | مراجعة مفصّلة قبل التطبيق |
git stash drop | No | نعم (يزيل واحدًا) | حذف stash محدد |
git stash clear | No | نعم (يزيل الكل) | البدء من جديد (خطير) |
أمثلة
خبّئ التغييرات الحالية
git stashيحفظ كل التغييرات غير المحفوظة (المجهّزة وغير المجهّزة) في مكدّس الـ stash ويعيد مجلد العمل إلى HEAD.
stash برسالة وصفية
git stash push -m "WIP: login feature"يخبّئ التغييرات برسالة مخصّصة لتعرّفها بسهولة حين يكون لديك أكثر من stash.
طبّق آخر stash وأزله
git stash popيطبّق أحدث stash (stash@{0}) على مجلد عملك ويزيله من المكدّس.
اسرد كل الـ stash
git stash listيعرض كل مدخلات الـ stash مع فهرسها واسم الفرع والرسالة. مفيد عند إدارة أكثر من stash.
أمثلة على سير العمل
git stashخبّئ التغييرات الحالية
git checkout other-branchانتقل إلى الفرع الآخر
(do work, commit if needed)أنجز العمل العاجل
git checkout original-branchعُد إلى فرعك
git stash popاستعد التغييرات المخبّأة
git stash push -m "WIP: login validation"خبّئ برسالة وصفية
(days later...)يمر الوقت
git stash listاعرض كل الـ stash مع رسائلها
git stash show stash@{0}عاين محتوى الـ stash
git stash popطبّقه وأزله حين تكون جاهزًا
git stashخبّئ تغييراتك
git checkout branch-aانتقل إلى الفرع الأول
git stash applyطبّق (يُبقي الـ stash)
git commit -m "Add feature"نفّذ commit على branch-a
git checkout branch-bانتقل إلى الفرع الثاني
git stash applyطبّق الـ stash نفسه مجددًا
git stash dropنظّف حين تنتهي
git add ready-file.jsجهّز التغييرات الجاهزة
git stash -kخبّئ غير المجهَّز وأبقِ المجهَّز
git commit -m "Ready feature"احفظ التغييرات المجهّزة في commit
git stash popاستعد بقية عملك
حل المشكلات
error: Your local changes to the following files would be overwritten by merge
السبب: محاولة تطبيق stash يتعارض مع مجلد العمل الحالي
احفظ التغييرات الحالية أو خبّئها أولًا، أو استخدم 'git stash branch <name>' لإنشاء فرع جديد من الـ stash
No stash entries found
السبب: مكدّس الـ stash فارغ أو أنك تنظر إلى الفهرس الخطأ
شغّل 'git stash list' لرؤية الـ stash المتاحة. وتذكّر أن stash@{0} هو الأحدث.
الـ stash لم يحفظ ملفاتي الجديدة
السبب: افتراضيًا لا يحفظ git stash إلا الملفات المتتبَّعة
استخدم 'git stash -u' لتضمين الملفات غير المتتبَّعة، أو 'git stash -a' لتضمين الملفات المتجاهَلة أيضًا
طبّقت الـ stash الخطأ / أريد التراجع عن pop
السبب: نفّذت pop على مدخل الـ stash الخطأ بالخطأ
إن فشل pop بتعارضات فالـ stash ما زال موجودًا. وإن نجح فتغييراتك في مجلد العمل - نفّذ 'git stash' من جديد إن لزم
ضاع الـ stash بعد clear/drop
السبب: يحذف git stash clear/drop مدخلات الـ stash نهائيًا
جرّب 'git fsck --unreachable | grep commit' ثم 'git show <hash>' لإيجاد commits الـ stash الضائعة. الاستعادة غير مضمونة.
نصائح وأخطاء شائعة
أفضل الممارسات
- ✓استخدم دائمًا رسائل وصفية مع 'git stash push -m "description"' - ستشكر نفسك لاحقًا
- ✓فضّل 'git stash apply' على 'git stash pop' حين قد تحتاج إلى الـ stash مجددًا
- ✓استخدم 'git stash -u' إن كانت لديك ملفات جديدة غير متتبَّعة تريد حفظها
- ✓لا تدع الـ stash تتراكم - نظّف القديمة بانتظام بـ 'git stash drop'
- ✓للحفظ طويل الأمد، فكّر في commit مؤقت (WIP) بدل stash
- ✓استخدم 'git stash show -p' لمراجعة محتوى الـ stash قبل تطبيقه
- ✓حين يفشل stash pop بسبب تعارضات، يبقى الـ stash محفوظًا - حلّ التعارضات ثم احذفه يدويًا
أخطاء متكررة
- ✗نسيان أن 'git stash' لا يحفظ افتراضيًا إلا الملفات المتتبَّعة. استخدم '-u' أو '--include-untracked' لتخبئة الملفات الجديدة غير المتتبَّعة.
- ✗استخدام 'git stash pop' بينما قد تريد تطبيق الـ stash نفسه على عدة فروع. استخدم 'git stash apply' بدلًا منه لإبقاء الـ stash.
- ✗عدم إعطاء الـ stash رسائل وصفية ثم نسيان محتوى كل منها. استخدم دائمًا 'git stash push -m "description"'.
- ✗تشغيل 'git stash clear' دون إدراك أنه يحذف كل الـ stash دون تأكيد. الاستعادة ممكنة فقط باستخراج الـ commits المعلّقة بـ 'git fsck'.
- ✗الخلط في ترتيب المكدّس: stash@{0} هو الأحدث، لا الأقدم.
الأسئلة الشائعة
يطبّق pop الـ stash ويزيله من المكدّس. أما apply فيطبّقه فقط ويُبقيه متاحًا. استخدم apply حين قد تحتاج إلى الـ stash نفسه في مكان آخر.
افتراضيًا لا يحفظ الـ stash إلا الملفات المتتبَّعة. استخدم 'git stash -u' لتضمين الملفات غير المتتبَّعة، أو 'git stash -a' لتضمين الملفات المتجاهَلة أيضًا.
استخدم 'git stash show' لملخّص سريع، أو 'git stash show -p' للـ diff الكامل. أضف stash@{n} لعرض stash محدد.
نعم! استخدم 'git stash push -m "message" -- file1.js file2.js' لتخبئة ملفات محددة فقط، أو 'git stash -p' لاختيار الأجزاء تفاعليًا.
لا يُزال الـ stash عند حدوث تعارضات. حلّ التعارضات يدويًا، ثم استخدم 'git stash drop' لإزالة الـ stash حين تنتهي.
الـ stash لا يرتبط بفرع. اسحب الفرع الهدف وشغّل 'git stash apply'. أو استخدم 'git stash branch <name>' لإنشاء فرع جديد.