Git و GitHub

تخزين التغييرات مؤقتاً

13 دقيقة الدرس 17 من 35

تخزين التغييرات مؤقتاً

التخزين المؤقت (Stashing) هو أحد أكثر ميزات Git فائدة لإدارة العمل قيد التقدم. يسمح لك بحفظ التغييرات غير المُلتزم بها مؤقتاً (المُجهزة وغير المُجهزة) والعودة إلى دليل عمل نظيف. هذا لا يقدر بثمن عندما تحتاج إلى تبديل السياقات بسرعة دون الالتزام بعمل غير مكتمل.

فهم Git Stash

فكر في التخزين المؤقت كحافظة لعملك:

ما هو التخزين المؤقت؟ - تخزين الملفات المُتتبعة المُعدّلة مؤقتاً - حفظ التغييرات المُجهزة وغير المُجهزة - إعادة دليل العمل إلى حالة الالتزام الأخير - يسمح لك بتبديل الفروع أو سحب التحديثات - يمكن إعادة تطبيق التغييرات لاحقاً - التخزين المؤقت محلي (لا يُدفع أبداً إلى البعيد)
متى تستخدم التخزين المؤقت: أنت تعمل على ميزة ولكن تحتاج بشكل عاجل إلى إصلاح خطأ، أو يطلب منك مديرك عرضاً سريعاً لفرع آخر، أو تحتاج إلى سحب التحديثات لكن لديك عمل غير مُلتزم به.

إنشاء تخزين مؤقت

الأمر الأساسي لتخزين تغييراتك مؤقتاً:

# تخزين جميع الملفات المُتتبعة المُعدّلة مؤقتاً git stash # تخزين مع رسالة وصفية git stash save "WIP: user authentication feature" # البناء الحديث (Git 2.13+) git stash push -m "WIP: working on login form" # تخزين ملفات محددة فقط git stash push -m "Config changes" config.php database.php

بعد التخزين المؤقت، يصبح دليل العمل الخاص بك نظيفاً ويطابق الالتزام الأخير.

ملاحظة: git stash هو اختصار لـ git stash push. كلا الأمرين يفعلان نفس الشيء.

ما الذي يتم تخزينه مؤقتاً؟

فهم ما يشمله ويستثنيه التخزين المؤقت:

✓ مُضمَّن افتراضياً: - الملفات المُتتبعة المُعدّلة (في دليل العمل) - التغييرات المُجهزة (المُضافة باستخدام git add) ✗ غير مُضمَّن افتراضياً: - الملفات غير المُتتبعة (ملفات جديدة لم تُضف) - الملفات المُتجاهلة (.gitignore) تضمين الملفات غير المُتتبعة: git stash -u git stash --include-untracked تضمين كل شيء (حتى الملفات المُتجاهلة): git stash -a git stash --all
تحذير: git stash --all يتضمن ملفات .gitignore. كن حذراً من عدم تخزين مصنوعات البناء الكبيرة أو التبعيات مؤقتاً. استخدم -u للملفات غير المُتتبعة فقط.

عرض التخزينات المؤقتة

يحتفظ Git بمكدس من التخزينات المؤقتة - يمكن أن يكون لديك تخزينات متعددة محفوظة:

# سرد جميع التخزينات المؤقتة git stash list # مثال على المخرجات: stash@{0}: WIP on main: abc1234 Add user login stash@{1}: WIP on feature: def5678 Update database schema stash@{2}: On main: ghi9012 Emergency bug fix prep # عرض محتويات التخزين المؤقت git stash show # عرض الفرق التفصيلي للتخزين المؤقت git stash show -p git stash show -p stash@{1} # عرض تخزين محدد git show stash@{0}

تطبيق التغييرات المُخزنة مؤقتاً

لديك طريقتان لاستعادة التغييرات المُخزنة مؤقتاً:

Apply (يحتفظ بالتخزين في القائمة): git stash apply # تطبيق أحدث تخزين git stash apply stash@{1} # تطبيق تخزين محدد Pop (يزيل من القائمة): git stash pop # تطبيق وإزالة الأحدث git stash pop stash@{1} # تطبيق وإزالة تخزين محدد

الفرق بين apply و pop:

git stash apply: - يطبق التغييرات على دليل العمل - يحتفظ بالتخزين في قائمة التخزين - استخدم عندما قد تحتاج للتخزين مرة أخرى - خيار أكثر أماناً git stash pop: - يطبق التغييرات على دليل العمل - يزيل التخزين من القائمة - استخدم عندما تنتهي من التخزين - قائمة تخزين أنظف
أفضل ممارسة: استخدم git stash pop عندما تكون متأكداً من أنك لن تحتاج التخزين مرة أخرى. استخدم git stash apply إذا كنت تريد محاولة تطبيقه دون فقدانه.

معالجة تعارضات التخزين المؤقت

في بعض الأحيان يتسبب تطبيق تخزين مؤقت في تعارضات:

# حاول تطبيق التخزين git stash pop # إذا حدثت تعارضات: Auto-merging index.php CONFLICT (content): Merge conflict in index.php # حل التعارضات يدوياً # عدّل index.php لإصلاح التعارضات # ثم: git add index.php # تم مقاطعة stash pop، لذا احذفه يدوياً git stash drop
ملاحظة: عندما يواجه git stash pop تعارضات، فإنه لا يزيل التخزين تلقائياً. يجب استخدام git stash drop بعد حل التعارضات.

إنشاء فرع من التخزين المؤقت

في بعض الأحيان تدرك أن العمل المُخزن مؤقتاً يجب أن يكون فرعاً جديداً:

# إنشاء فرع جديد وتطبيق التخزين في أمر واحد git stash branch new-feature-branch # إنشاء فرع من تخزين محدد git stash branch bug-fix stash@{2} # هذا يعادل: git checkout -b new-feature-branch git stash pop

هذا مفيد بشكل خاص عندما:

  • تتعارض تغييراتك المُخزنة مؤقتاً مع الفرع الحالي
  • تدرك أن العمل يجب أن يكون معزولاً
  • تريد نقطة بداية نظيفة للعمل المُخزن مؤقتاً

إدارة مكدس التخزين المؤقت

أوامر لتنظيف وتنظيم التخزينات المؤقتة:

# حذف تخزين محدد git stash drop stash@{1} # حذف أحدث تخزين git stash drop # مسح جميع التخزينات (كن حذراً!) git stash clear # إعادة التسمية غير ممكنة، لكن يمكنك: # 1. تطبيق التخزين # 2. حذفه # 3. إنشاء تخزين جديد بوصف أفضل git stash apply stash@{2} git stash drop stash@{2} git stash save "Better description of changes"
تحذير: git stash clear يحذف جميع التخزينات بشكل دائم. لا يمكن التراجع عن هذا. استخدمه بحذر شديد!

التخزين الجزئي

خزن جزءاً فقط من تغييراتك باستخدام الوضع التفاعلي:

# اختيار ما سيتم تخزينه بشكل تفاعلي git stash -p git stash --patch # لكل تغيير، سيُسأل: Stash this hunk [y,n,q,a,d,e,?]? y - خزن هذه القطعة n - لا تخزن هذه القطعة q - إنهاء (لا تخزن القطع المتبقية) a - خزن هذه وجميع القطع المتبقية d - لا تخزن هذه أو القطع المتبقية e - تحرير القطعة يدوياً ? - مساعدة

سير عمل التخزين المؤقت العملي

سيناريوهات شائعة حيث يتألق التخزين المؤقت:

السيناريو 1: إصلاح خطأ طارئ # أنت تكتب ميزة عندما يُبلغ عن خطأ حرج git stash save "WIP: feature half done" git checkout main git checkout -b hotfix # أصلح الخطأ، التزم، ادمج git checkout feature-branch git stash pop السيناريو 2: سحب التحديثات # لديك عمل غير مُلتزم به وتحتاج للسحب git stash git pull origin main git stash pop # حل أي تعارضات السيناريو 3: تجربة بأمان # جرب شيئاً دون الالتزام git stash save "Current stable state" # إجراء تغييرات تجريبية # إذا نجح: التزم # إذا فشل: git stash pop (استعادة الحالة السابقة) السيناريو 4: تبديل الفروع # تحتاج لمراجعة PR لزميل git stash save "Feature progress" git checkout colleague-branch # راجع عملهم git checkout your-branch git stash pop

تقنيات التخزين المؤقت المتقدمة

# تخزين مع الحفاظ على معلومات التجهيز git stash save --keep-index # يحافظ على التغييرات المُجهزة مُجهزة عند إعادة التطبيق # تخزين التغييرات غير المُجهزة فقط git stash --keep-index # تطبيق التخزين دون التأثير على التجهيز git stash apply --index # عرض التخزين كفرق git diff stash@{0} # مقارنة التخزين مع العمل الحالي git diff stash@{0}..HEAD

أفضل ممارسات التخزين المؤقت

✓ افعل: - استخدم رسائل وصفية مع git stash save - نظف التخزينات القديمة بانتظام - استخدم التخزين للتخزين قصير المدى فقط - طبق أو استرجع التخزينات بعد الإنشاء بوقت قصير ✗ لا تفعل: - استخدم التخزين كمخزن طويل المدى (استخدم الفروع) - خزن بدون رسالة (ستنسى ما فيه) - تراكم عشرات التخزينات - تعتمد على stash@{0} في النصوص (تتغير الأرقام)

تمرين عملي:

إتقان سير عمل التخزين المؤقت:

  1. أنشئ ملفاً جديداً وعدّل ملفاً موجوداً
  2. جهز تغييراً واحداً واترك الآخر غير مُجهز
  3. خزن جميع التغييرات مع رسالة
  4. تحقق من أن دليل العمل نظيف
  5. قم بالتزام جديد على الدليل النظيف
  6. اعرض قائمة التخزين الخاصة بك
  7. طبق التخزين وشاهد التغييرات المُستعادة
  8. أنشئ تخزيناً جديداً مع الملفات غير المُتتبعة
  9. تدرب على إنشاء فرع من تخزين

الأوامر للتجربة:

echo "new file" > test.txt
echo "changes" >> README.md
git add README.md
git stash save "Testing stash workflow"
git status
git commit -m "Clean state commit"
git stash list
git stash show -p
git stash pop

استكشاف مشاكل التخزين المؤقت وإصلاحها

المشكلة: تطبيق التخزين يسبب تعارضات الحل: حل التعارضات يدوياً، ثم git stash drop المشكلة: فقدت تتبع ما في التخزين الحل: git stash show -p stash@{N} المشكلة: مسح جميع التخزينات عن طريق الخطأ الحل: تحقق من git reflog لالتزامات التخزين (متقدم) المشكلة: التخزين لا يتضمن ملفات جديدة الحل: استخدم git stash -u لتضمين الملفات غير المُتتبعة المشكلة: لا يمكن استرجاع التخزين على فرع مختلف الحل: استخدم git stash branch new-branch-name

الملخص

في هذا الدرس، تعلمت:

  • التخزين المؤقت يحفظ التغييرات غير المُلتزم بها مؤقتاً دون الالتزام
  • استخدم git stash لحفظ التغييرات و git stash pop للاستعادة
  • التخزينات المؤقتة مخزنة في مكدس - يمكن أن يكون لديك تخزينات متعددة
  • قم بتضمين الملفات غير المُتتبعة باستخدام علامة -u
  • أنشئ فروعاً من التخزينات المؤقتة لتنظيم أفضل
  • استخدم رسائل وصفية لتذكر محتويات التخزين
  • التخزين المؤقت محلي ومثالي لتبديل السياق السريع
التالي: في الدرس التالي، سنغوص في GitHub - أكبر منصة لاستضافة الأكواد في العالم وكيف تمتد قدرات Git!