تخطَّ إلى المحتوى
GitTree

الدرس 26 · الاستعادة

تخبئة العمل واستئنافه بأمان

اترك تعديلًا غير منته وملاحظة جديدة جانبًا بالتخبئة، وأعدهما بتطبيق المخبأ، وانظر ماذا يفعل تطبيق المخبأ وحذفه حين يتعارض: يبقى المخبأ حتى تقرر.

حُفظ التقدّم في هذا المتصفح.

يحمّل التشغيل الفيديو من YouTube (وضع الخصوصية المحسّنة).

تعليق صوتي بالإنجليزية · ترجمة إنجليزية وعربية

افتح صفحة الفيديوشاهد على YouTube

ما ستتعلمه

  • أن تختار ما يدخل المخبأ: التعديلات المتتبَّعة أو الملفات غير المتتبَّعة أو المُجهَّز فقط.
  • أن تشرح لماذا يُبقي تطبيق المخبأ مدخله وأن تطبيق المخبأ وحذفه لا يزيله إلا بعد تطبيق نظيف.
  • أن تتحقق أن التعديل والملاحظة عادا وأن الفرع لم يتحرك.
  • أن تتعافى من تعارض تطبيق المخبأ وحذفه دون أن تفقد المخبأ.

قبل البدء

أنت على private/stash-hint، وهو فرع من ناتج الدرس 18 فيه إيداع واحد يضيف docs/stash-conflict.md («Use a fictional address.»). في مجلد عملك تعديل غير منته على هذا الملف وملف جديد docs/signup-hint.md لم يره Git قط. يطلب منك أحدهم الانتقال إلى شيء آخر، فتريد تنحية الاثنين دون إيداع عمل نصف منجز.

كل شيء هنا محلي وضمن الخطة المجانية (يطلب GitTree تسجيل الدخول): دون حساب استضافة أو مزوّد أو إنترنت. كل الهويات خيالية (example.com). لا تنفّذ الدرس في مشروع حقيقي.

نفّذ التغييرات في GitTree أو بأوامر Git الأصلية، لا بالطريقتين في النسخة نفسها. القراءة بعد التنفيذ آمنة دائمًا. تسميات القوائم مأخوذة من نصوص GitTree 2.0 نفسها، وشُغّلت الأوامر الأصلية بـ Git 2.43 في نسخ مؤقتة. لم تُشغَّل خطوات GitTree على macOS أو Windows أو Linux.

الفكرة وأثر الأفعال

تخزّن التخبئة تغييراتك المحلية كائنات في Git ثم تعيد مجلد العمل إلى آخر إيداع. هي أداة مقاطعة قصيرة، لا نسخة احتياطية ولا بديلًا عن فرع تريد الاحتفاظ به.

يحمل المخبأ بالافتراض التعديلات المتتبَّعة. أما الملفات غير المتتبَّعة فتبقى خلفك ما لم تطلبها، وهذا ما يفعله Git بالخيار --include-untracked. يفتح حوار تخبئة التغييرات… (Stash Changes…) وخيار تضمين الملفات غير المتتبَّعة (Include untracked files) مفعَّل، ومع ذلك تحقق منه. الملفات المتجاهَلة فئة أخرى ولا تُخبَّأ هنا. والتغييرات المُجهَّزة فقط (Only staged changes) تخبّئ ما في الفهرس وحده، وإبقاء التغييرات المُجهَّزة في مكانها أيضًا (Keep staged changes in place too) تترك الفهرس كما هو.

تطبيق المخبأ (Apply Stash) يعيد التغييرات ويُبقي المخبأ في القائمة. وتطبيق المخبأ وحذفه (Pop Stash) يطبّقه ولا يزيل المدخل إلا إن كان التطبيق نظيفًا. فإن تعارض بقي المخبأ وتحلّ التعارض في مجلد العمل. لا يستعيد GitTree حالة التجهيز عند تطبيق المخبأ: الخيار git stash apply --index يفعل ذلك لكن GitTree لا يستخدمه، فتعود التعديلات المجهَّزة غير مجهَّزة.

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

إعداد حالة المشروع المحددة

ابدأ من نسخة عادية منفصلة من المشروع كما تركه الدرس 18 وأبقِ gittree-features الأصلي دون مساس. أنشئ الفرع واحفظ DOC_STASH_BASE وأودِعه. ثم احفظ DOC_STASH_WORK فوق الملف نفسه وDOC_HINT ملفًا جديدًا، دون تجهيز أي منهما. أما DOC_STASH_OTHER وSTASH_RESOLVED فتُستخدمان في نسخة التعارض المنفصلة فقط.

مدخلات الملفات كاملة

احفظ في المرحلة المحددة فقط بصيغة UTF-8 وLF وسطر نهائي. لا تلصق أسوار Markdown. ترث الملفات الثابتة نقطة البداية؛ لا تستبدل الأصل بنسخة إعادة منفصلة.

docs/stash-conflict.md — DOC_STASH_BASE

الناتج
Use a fictional address.

docs/stash-conflict.md — DOC_STASH_WORK

الناتج
Use a complete fictional email address.

docs/signup-hint.md — DOC_HINT

الناتج
Unfinished signup hint: use fictional data only.

docs/stash-conflict.md — DOC_STASH_OTHER

الناتج
Do not send the address anywhere.

docs/stash-conflict.md — STASH_RESOLVED

الناتج
Use a complete fictional email address. Nothing is sent.

في GitTree

افتح لوحة الأوامر بـ Command+Shift+P (وCtrl+Shift+P على Ubuntu). تُسرد المخابئ في اللوحة اليسرى تحت المخابئ (Stashes)، وأفعال كل مخبأ في قائمة النقر بزر الفأرة الأيمن عليه.

  1. ابنِ الفرع والتغييرين غير المجهَّزين كما يبيّن القسم التالي. اقرأ قائمة التغييرات: docs/stash-conflict.md معدَّل وdocs/signup-hint.md جديد.
  2. افتح لوحة الأوامر ونفّذ تخبئة التغييرات… (Stash Changes…). في الحوار اكتب في الرسالة (Message) signup hint rehearsal. التغييرات المُجهَّزة فقط معطّل. تضمين الملفات غير المتتبَّعة مفعَّل. إبقاء التغييرات المُجهَّزة في مكانها أيضًا معطّل. اختر تخبئة (Stash).
  3. انتظر الإشعار «تمت تخبئة تغييراتك.» قائمة التغييرات خالية، والملاحظة اختفت من القرص، ويظهر المخبأ تحت المخابئ.
  4. مرّر المؤشر على صف المخبأ: تقول تلميحته «يتضمّن الملفات غير المتتبَّعة». انقره بزر الفأرة الأيمن واختر عرض المخبأ (Show Stash): يحدّد المخطط المخبأ وتسرد اللوحة اليمنى تغييره المتتبَّع docs/stash-conflict.md. أما الملاحظة غير المتتبَّعة فتُحفظ في جزء منفصل من المخبأ.
  5. انقره بزر الفأرة الأيمن مرة أخرى واختر تطبيق المخبأ. يقول الإشعار «تم تطبيق المخبأ؛ وما زال في القائمة.»
  6. افحص النتيجة: docs/stash-conflict.md معدَّل من جديد، وdocs/signup-hint.md عاد ملفًا غير متتبَّع، ورأس الفرع هو الإيداع نفسه، والمخبأ ما زال في القائمة.
  7. نسخة التعارض المنفصلة. في نسخة ثانية، بعد التخبئة، أودِع DOC_STASH_OTHER في الملف نفسه. انقر المخبأ بزر الفأرة الأيمن واختر تطبيق المخبأ وحذفه (Pop Stash). يقول التحذير «يتعارض المخبأ مع تغييراتك: حُلّ التعارضات. المخبأ محفوظ.»
  8. يُسرد الملف المتعارض ويحمل وسم متعارض (Conflicted). افتحه واكتب STASH_RESOLVED في النتيجة واختر حفظ وتعليم كمحلول (Save and Mark Resolved). المخبأ ما زال موجودًا. وحين تطمئن إلى أن العمل بأمان انقر المخبأ بزر الفأرة الأيمن واختر حذف المخبأ… (Delete Stash…)؛ يقول الحوار إنه يُزال من القائمة ويُحفظ في لقطات الاستعادة. ولا يستعيد «تراجع» في GitTree مخبأً محذوفًا بعد (الدرس 30)، فعدّ الحذف نهائيًا.

لكل إيداع عادي في الدورة: الملخّص (Summary) هو العنوان المحدد، والوصف (Description) خالٍ، وتبقى الخيارات تعديل الإيداع الأخير وتخطّي الخطّافات وإضافة Signed-off-by ومؤلف مختلف والدفع بعد الإيداع والسماح بإيداع فارغ معطّلة.

في الطرفية

في نسخة منفصلة من ناتج الدرس 18:

الأمر · bash
git switch --create private/stash-hint

احفظ DOC_STASH_BASE باسم docs/stash-conflict.md ثم:

الأمر · bash
git add -- docs/stash-conflict.md
git commit --quiet -m "docs: establish the stash conflict baseline"

احفظ DOC_STASH_WORK فوق docs/stash-conflict.md وDOC_HINT باسم docs/signup-hint.md دون تجهيز. ثم خبّئهما معًا:

الأمر · bash
git stash push --include-untracked --message "signup hint rehearsal"
git status --short
git stash list --format=%s
الناتج
On private/stash-hint: signup hint rehearsal

لا يطبع الأمر git status --short شيئًا: المجلد نظيف. احتفظ بنسخة لم تُمَسّ من هذه الحالة للتعارض، ثم طبّق:

الأمر · bash
git stash apply 'stash@{0}'
git status --short
git stash list --format=%s
git rev-parse HEAD
الناتج
 M docs/stash-conflict.md
?? docs/signup-hint.md
On private/stash-hint: signup hint rehearsal

عاد النصان كاملين، والمخبأ ما زال في القائمة، وHEAD هو الإيداع نفسه. وبدون --include-untracked يترك الأمر نفسه docs/signup-hint.md على القرص ويخبّئ التعديل وحده.

في النسخة المنفصلة احفظ DOC_STASH_OTHER وأودِعه ثم نفّذ تطبيق المخبأ وحذفه:

الأمر · bash
git add -- docs/stash-conflict.md
git commit --quiet -m "docs: change the stash target"
git stash pop 'stash@{0}'
git ls-files --unmerged
git stash list --format=%s

ينتهي الأمر برمز 1 ويطبع «CONFLICT (content)» و«The stash entry is kept in case you need it again». تُسرد ثلاثة مدخلات غير مدمجة، ويحمل الملف علامات التعارض، ويُستعاد docs/signup-hint.md، والمخبأ ما زال في القائمة. لا دمج ولا إعادة تأسيس لتتابعهما: احفظ STASH_RESOLVED ونفّذ git add -- docs/stash-conflict.md. وإن أردت ركن العمل في فرع خاص فالأمر git stash branch rescue-hint 'stash@{0}' ينشئ الفرع عند الإيداع الذي صُنع عنده المخبأ ويطبّقه ولا يزيل المخبأ إلا بعد ذلك.

النتيجة

أين تنتهي: في النسخة الأولى يحمل المجلد التعديل والملاحظة من جديد، ولم يتحرك HEAD، والمخبأ ما زال في القائمة. وفي نسخة التعارض أبلغ تطبيق المخبأ وحذفه عن التعارض، ونجا المخبأ، وحلّك مجهَّز. لم ينشئ أي أمر تخبئة إيداعًا، ولم يُدفع شيء.

أخطاء شائعة

  • نسيان أن الملفات غير المتتبَّعة لا تُخبَّأ ما لم تُضمَّن.
  • افتراض أن المخبأ حُذف بعد تعارض. لم يُحذف.
  • تطبيق المخبأ مرتين بعد أن نجح الأول، ثم السؤال عن تغييرات مكررة.
  • استخدام المخبأ مخزنًا طويل الأمد. سمِّ العمل المفيد بفرع.

إن حدث خطأ

بعد تعارض تطبيق المخبأ وحذفه اترك المخبأ مكانه، وحلّ الملف، وافحص النتيجة قبل أن تحذف شيئًا. وإن طبّقت على الفرع الخطأ فتخلَّ عن ذلك العمل بعد أن تتأكد أن المخبأ ما زال يحمله. إنشاء فرع من المخبأ… (Create Branch from Stash…) يمنح المخبأ فرعه الخاص عند الإيداع الذي صُنع عنده.

اختبر فهمك

أجب عن كل سؤال ثم اقرأ السبب. الأسئلة المعلَّمة «مطلوب» تُحتسب لإكمال الدرس.

  1. السؤال 1 من 6

    ماذا يفعل تطبيق المخبأ وحذفه مما لا يفعله تطبيق المخبأ؟

    اختر إجابة واحدة.

  2. السؤال 2 من 6

    تنفّذ تخبئة التغييرات… مع تضمين الملفات غير المتتبَّعة مفعَّلًا. أي مما يلي صحيح؟

    اختر كل إجابة صحيحة.

  3. السؤال 3 من 6
    مطلوب

    بعد التخبئة تختار تطبيق المخبأ عليه. ماذا ترى؟

    اختر إجابة واحدة.

  4. السؤال 4 من 6

    غيّر المُدخل: في نسخة عطّل تضمين الملفات غير المتتبَّعة قبل التخبئة. ماذا يحدث لـ docs/signup-hint.md؟

    اختر إجابة واحدة.

  5. السؤال 5 من 6
    مطلوب

    في نسخة التعارض يحذّر تطبيق المخبأ وحذفه: «يتعارض المخبأ مع تغييراتك: حُلّ التعارضات. المخبأ محفوظ.» تخشى أن العمل ضاع. ما الصحيح وماذا تفعل؟

    اختر إجابة واحدة.

  6. السؤال 6 من 6
    مطلوب

    بعد تطبيق المخبأ في النسخة الأولى، أي قراءات تبيّن أنه عمل كما يقول الدرس؟

    اختر كل إجابة صحيحة.

0 من 6 صحيحة

أجب عن الأسئلة المطلوبة إجابة صحيحة لتكمل الدرس.

جرى التحقق في هذا المتصفح.

تدريب

أثبت أن المجلد كان نظيفًا بعد التخبئة، وأن تطبيق المخبأ أعاد الملفين، وأن المخبأ ما زال في القائمة. وتوقّع ما يختلف لو كان تضمين الملفات غير المتتبَّعة معطّلًا. وفي نسخة التعارض أثبت أن المخبأ نجا من تطبيق المخبأ وحذفه.

تأكيد منك أنت: لا يستطيع الموقع رؤية جهازك.

لإكمال الدرس، أجب عن الأسئلة المطلوبة إجابة صحيحة وأكّد تنفيذ التمرين العملي.

خلاصة

  • اختر خيارات التخبئة عن قصد.
  • تطبيق المخبأ يُبقي مدخله.
  • وتطبيق المخبأ وحذفه يُبقيه أيضًا عند التعارض.

المصطلحات الجديدة

Stash — مخبأ; apply — تطبيق; pop — تطبيق وحذف; untracked — غير متتبَّع.

نص الفيديو

ترجمة التعليق الصوتي الإنجليزي للفيديو، مقطعًا بعد مقطع.

اعرض النص
  1. اترك العمل غير المنتهي جانبًا، وأعده بأمان.
  2. يحمل المخبأ تعديلاتك على رفّ، وينظّف مجلد العمل.
  3. تطبيق المخبأ يعيد التغييرات ويُبقي المدخل. وتطبيقه وحذفه يزيله إن كان نظيفًا.
  4. ابنِ فرعًا بإيداع واحد. ثم عدّل الملف وأضف ملاحظة لم يرها Git قط.
  5. في قائمة التغييرات: ملف معدَّل وملف جديد.
  6. دوّن الإيداع الحالي. يجب ألا يتحرك.
  7. افتح لوحة الأوامر ونفّذ تخبئة التغييرات.
  8. اكتب رسالة ستتعرّف عليها.
  9. المجهَّز فقط معطّل. وتضمين غير المتتبَّع مفعَّل. وإبقاء المجهَّز معطّل.
  10. الملفات المتجاهَلة فئة أخرى ولا تدخل.
  11. اختر تخبئة وانتظر الإشعار.
  12. قائمة التغييرات خالية، والمخبأ مدرج.
  13. تقول التلميحة إن غير المتتبَّعة مضمَّنة. وعرض المخبأ يسرد ملفاته.
  14. انقر المخبأ بزر الفأرة الأيمن واختر تطبيق المخبأ.
  15. يقول الإشعار إن المخبأ ما زال في القائمة.
  16. عاد الاثنان: التعديل والملاحظة.
  17. رأس الفرع هو الإيداع نفسه. لم ينشئ أي أمر تخبئة إيداعًا.
  18. والمخبأ ما زال على الرفّ.
  19. في الطرفية: git stash push مع تضمين غير المتتبَّعة، ثم الحالة.
  20. تعرض القائمة الرسالة مسبوقة باسم الفرع.
  21. يعيد git stash apply الاثنين.
  22. المخبأ ما زال مدرجًا، و HEAD هو نفسه.
  23. بدون ذلك الخيار تبقى الملاحظة على القرص.
  24. في نسخة التعارض نودِع تغييرًا آخر أولًا ثم نطبّق ونحذف.
  25. يقول التحذير إن المخبأ محفوظ. والملف متعارض.
  26. حلّ الملف وعلّمه محلولًا. المخبأ ما زال هناك.
  27. احذف المخبأ فقط حين تتأكد. أو امنحه فرعه الخاص.
  28. تدريب: أثبت النظافة والاستعادة والبقاء. ثم توقّع الحال دون تضمين غير المتتبَّعة.
  29. التالي: ماذا يغيّر كل من reset soft وmixed وhard.