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
[ ] اختياري| أو<arg> قيمة تُستبدل... قابل للتكرار--flag خيار

الخيارات

انقر على أي خيار لتوسيعه

مبتدئ (7)

احفظ تعديلاتك المحلية في مدخل stash جديد وأعدها إلى حالة HEAD. استخدم -m لإضافة رسالة وصفية. هذا هو الإجراء الافتراضي عند تشغيل 'git stash'.

موصى بهاستخدمه مع -m ليمكن التعرّف على كل stash لاحقًا

مثال

git stash push -m "Work in progress"

طبّق أحدث stash ‏(stash@{0}) على مجلد عملك وأزله من المكدّس. إن ظهرت تعارضات عند التطبيق يبقى المدخل لتحلّها وتحذفه بنفسك.

موصى بهيستعيد آخر stash ويحذفه؛ ويبقيه إذا تعارض التطبيق

مثال

git stash pop

طبّق stash دون إزالته من المكدّس. بخلاف pop يبقى الـ stash متاحًا للاستخدام لاحقًا. يمكنك تحديد أي stash بـ stash@{n}.

عند الحاجةعندما تحتاج الـ stash نفسه مرة أخرى أو على عدة فروع

مثال

git stash apply stash@{1}

اسرد كل مدخلات الـ stash. يعرض كل مدخل فهرسه (stash@{n})، والفرع الذي أُنشئ عليه، والرسالة أو وصف الـ commit.

موصى بهتحقّق مما في الـ stash قبل pop أو drop

مثال

git stash list

اعرض التغييرات المسجّلة في مدخل stash كـ diff. يعرض stash@{0} افتراضيًا. أضف -p لعرض الـ patch الكامل.

موصى بهعاين بـ -p قبل التطبيق

مثال

git stash show -p stash@{0}

أزل مدخلًا واحدًا من المكدّس. دون وسائط يحذف stash@{0}. حدد stash@{n} لحذف stash محدد. انتبه للـ hash المطبوع - فهو الطريقة السهلة الوحيدة لاستعادته.

عند الحاجةنظّف بعد apply؛ واحفظ الـ hash المطبوع إن احتجت إليه لاحقًا

مثال

git stash drop stash@{1}

أزل كل مدخلات الـ stash دفعة واحدة دون تأكيد. الاستعادة ممكنة فقط بالبحث عن الـ commits المعلّقة بـ git fsck. استخدمه بحذر شديد.

غير موصى بهيحذف كل الـ stashes دفعة واحدة، دون تأكيد

مثال

git stash clear

متوسط (3)

ضمّن الملفات غير المتتبَّعة في الـ stash. افتراضيًا لا يحفظ git stash إلا الملفات المتتبَّعة. استخدمه لتخبئة الملفات الجديدة التي لم تُضف بعد أيضًا.

موصى بهمن دونه تُترك الملفات الجديدة غير المتتبَّعة

مثال

git stash -u

أبقِ منطقة التجهيز كما هي. لا تُزال من مجلد العمل إلا التغييرات غير المجهّزة؛ وتبقى المجهّزة مجهّزة (ويسجّلها الـ stash أيضًا).

عند الحاجةاختبار العمل المجهّز أو تسجيله مع وضع الباقي جانبًا

مثال

git stash -k

أنشئ فرعًا جديدًا من الـ commit الذي أُنشئ عنده الـ stash، وطبّق الـ stash، واحذفه إن نجح. مفيد حين يتعارض الـ stash مع الفرع الحالي.

عند الحاجةأفضل حل عندما لا ينطبق stash بسلاسة على الفرع الحالي

مثال

git stash branch new-feature stash@{0}

متقدم (1)

اختر تفاعليًا الأجزاء التي تُخبّأ. يتيح لك تخبئة أجزاء محددة من تغييراتك فقط وإبقاء غيرها في مجلد العمل.

عند الحاجةتخبئة الأجزاء المختارة فقط

مثال

git stash -p

اختيار الخيار المناسب

استعادة التغييرات المخبّأة

اختر الأمر المناسب لاستعادة عملك المخبّأ

الأمريُبقي الـ stash؟يُطبَّق علىعند التعارض
git stash popلا - يُزال بعد التطبيقالفرع الحالييبقى الـ stash، ويجب الحل
git stash applyنعم - يبقى في المكدّسالفرع الحالييبقى الـ stash، ويجب الحل
git stash branch <name>لا - يُزال بعد التطبيقفرع جديد عند أساس الـ stashلا تعارضات (فرع جديد)

ما الذي يُخبَّأ؟

التحكم في الملفات المضمَّنة في الـ stash

الأمرالمتتبَّعة المعدّلةمجهّزةغير متتبَّعةالمتجاهَلة
git stashنعمنعمNoNo
git stash -uنعمنعمنعمNo
git stash -aنعمنعمنعمنعم
git stash -kنعمنعم (وتبقى مجهّزة أيضًا)NoNo

الـ stash مقابل طرق الحفظ الأخرى

متى تستخدم الـ stash ومتى البدائل

الأمرأين يُحفظقابل للمشاركةالأنسب لـ
git stashالـ reflog المحليNoتبديل سياق سريع، حفظ مؤقت
git commit (WIP)تاريخ الفرعنعم (إن دُفع)عمل قد تريد مشاركته أو الرجوع إليه
git worktreeمجلد منفصلN/Aالعمل على عدة فروع في الوقت نفسه

إدارة عدة stash

أوامر للتعامل مع مكدّس الـ stash

الأمريعرض المحتوىيعدّل المكدّسحالة الاستخدام
git stash listالفهرس + الرسالةNoعرض كل الـ stash
git stash showDiffstatNoمعاينة سريعة للتغييرات
git stash show -pالـ diff الكاملNoمراجعة مفصّلة قبل التطبيق
git stash dropNoنعم (يزيل واحدًا)حذف stash محدد
git stash clearNoنعم (يزيل الكل)البدء من جديد (خطير)

أمثلة

خبّئ التغييرات الحالية

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.

أمثلة على سير العمل

1
git stash

خبّئ التغييرات الحالية

2
git checkout other-branch

انتقل إلى الفرع الآخر

3
(do work, commit if needed)

أنجز العمل العاجل

4
git checkout original-branch

عُد إلى فرعك

5
git stash pop

استعد التغييرات المخبّأة

1
git stash push -m "WIP: login validation"

خبّئ برسالة وصفية

2
(days later...)

يمر الوقت

3
git stash list

اعرض كل الـ stash مع رسائلها

4
git stash show stash@{0}

عاين محتوى الـ stash

5
git stash pop

طبّقه وأزله حين تكون جاهزًا

1
git stash

خبّئ تغييراتك

2
git checkout branch-a

انتقل إلى الفرع الأول

3
git stash apply

طبّق (يُبقي الـ stash)

4
git commit -m "Add feature"

نفّذ commit على branch-a

5
git checkout branch-b

انتقل إلى الفرع الثاني

6
git stash apply

طبّق الـ stash نفسه مجددًا

7
git stash drop

نظّف حين تنتهي

1
git add ready-file.js

جهّز التغييرات الجاهزة

2
git stash -k

خبّئ غير المجهَّز وأبقِ المجهَّز

3
git commit -m "Ready feature"

احفظ التغييرات المجهّزة في commit

4
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} هو الأحدث، لا الأقدم.

الأسئلة الشائعة

A:

يطبّق pop الـ stash ويزيله من المكدّس. أما apply فيطبّقه فقط ويُبقيه متاحًا. استخدم apply حين قد تحتاج إلى الـ stash نفسه في مكان آخر.

A:

افتراضيًا لا يحفظ الـ stash إلا الملفات المتتبَّعة. استخدم 'git stash -u' لتضمين الملفات غير المتتبَّعة، أو 'git stash -a' لتضمين الملفات المتجاهَلة أيضًا.

A:

استخدم 'git stash show' لملخّص سريع، أو 'git stash show -p' للـ diff الكامل. أضف stash@{n} لعرض stash محدد.

A:

نعم! استخدم 'git stash push -m "message" -- file1.js file2.js' لتخبئة ملفات محددة فقط، أو 'git stash -p' لاختيار الأجزاء تفاعليًا.

A:

لا يُزال الـ stash عند حدوث تعارضات. حلّ التعارضات يدويًا، ثم استخدم 'git stash drop' لإزالة الـ stash حين تنتهي.

A:

الـ stash لا يرتبط بفرع. اسحب الفرع الهدف وشغّل 'git stash apply'. أو استخدم 'git stash branch <name>' لإنشاء فرع جديد.