كان كل طلب ‘تعديل عاجل’ يفسد عملي: كيف أنقذني git worktree من جحيم الـ stash المفقود؟

يا مساء الخير يا جماعة،

خلوني أحكيلكم قصة صارت معي زمان، بس لليوم بتذكرها كأنها مبارح. كانت الساعة حوالي أربعة العصر يوم خميس، وأنا غرقان في كود لميزة جديدة ومعقدة في مشروع بنشتغل عليه. القهوة جنبي، والمزاج عال العال، وكنت على وشك إني أعمل commit لجزء كبير من الشغل اللي صارلي يومين بشتغل عليه. وفجأة… رنّة من مدير المشروع على Slack: “أبو عمر، يعطيك العافية، بس في عنا مشكلة طارئة على الـ production، في bug خطير لازم نحله هسّا ضروري!”.

قلبي وقع في رجلي. كيف “هسّا”؟ وشغلي اللي فاتحه قدامي؟ الملفات كلها معدّلة، والدنيا مخبوصة، نصه شغال ونصه لأ. طبعًا، أول إشي خطر في بالي هو المنقذ المعتاد: git stash. بسرعة وبدون تفكير، كتبت الأمر، وخبّيت كل شغلي في غياهب الـ stash، وعملت checkout للفرع الرئيسي عشان أحل المشكلة الطارئة.

صلّحت الـ bug، عملت push، وتنفست الصعداء. رجعت للفرع تبعي، وكتبت بكل ثقة: git stash pop. وهون بلشت الكارثة. طلعلي conflict في كل ملف تقريبًا! والأسوأ من هيك، لأني كنت مستعجل، كنت عامل stash لكم شغلة فوق بعض، وصرت مش عارف أي stash فيه الشغل الصح. ضيعت وقت أطول وأنا بحاول أصلح الكونفليكت وأتذكر “أنا شو كنت عامل هون؟” أكتر من الوقت اللي أخدته في حل المشكلة الطارئة. يومها حسيت بإحباط كبير وحكيت لحالي: “مستحيل، لازم يكون في طريقة أحسن من هيك!”.

وهي القصة يا جماعة، كانت بداية رحلتي لاكتشاف الأداة السحرية اللي غيرت طريقة شغلي تمامًا: git worktree.

ما هي مشكلة الـ stash أصلًا؟

قبل ما نحكي عن الحل، خلينا نفهم ليش الـ git stash، على الرغم من فائدته، ممكن يكون كابوس في بعض الأحيان. الـ stash مصمم لتخزين التغييرات المؤقتة اللي لسا مش جاهزة للـ commit، وهو بيعمل هالشغلة منيح. لكن المشكلة بتبلش لما نعتمد عليه في التنقل بين المهام الكبيرة والمعقدة.

  • إنه مجرد “كومة” (Stack): الـ stash بيشتغل بنظام LIFO (Last-In, First-Out). يعني آخر إشي خبيته هو أول إشي بتقدر ترجّعه. لو عندك أكتر من stash، راح تبلش تضيع بين stash@{0} و stash@{1}، وخصوصًا لو ما كنت كاتب رسالة توضيحية مع كل واحد.
  • صديق الكونفليكت (Conflicts): تطبيق stash معمول على فرع معين، على فرع ثاني مختلف تمامًا، هو وصفة شبه مؤكدة للكونفليكتس اللي بتوجع الراس.
  • النسيان: لو خبّيت شغلك ورجعتله بعد يومين، ممكن تنسى تمامًا شو السياق اللي كنت بتشتغل فيه. الـ stash بيفصلك عن بيئة عملك.
  • خطر الضياع: مع كتر الاستعجال، ممكن بالغلط تعمل git stash drop بدل pop، أو تنسى stash مهم موجود من زمان. باختصار، هو لا يُشعر بالأمان للمهام الكبيرة.

الضوء في نهاية النفق: تعرف على git worktree

في خضم إحباطي من حكاية الـ stash المفقود، قعدت أبحث وأقرأ، ووقعت عيني على مقالة بتحكي عن أمر اسمه git worktree. قرأت الوصف تبعه وحسيت كأني لقيت الكنز المفقود. الوصف كان بسيط ومبهر: “هي أداة تسمح لك بالعمل على عدة فروع من نفس المستودع (repository) في نفس الوقت، عن طريق إنشاء مجلدات عمل منفصلة لكل فرع”.

استوعبت الفكرة بسرعة. قلت لحالي: “يعني بدل ما أخبّص الدنيا في نفس المجلد وأعمل stash، بقدر ببساطة أفتح مجلد جديد لنفس المشروع، يكون شغال على فرع ثاني، وأشتغل عليه براحتي، ومجلدي الأصلي يضل زي ما هو بدون ما ألمسه؟”.

بالضبط! هذا هو سحر الـ worktree. كل worktree هو نسخة كاملة من ملفات مشروعك، لكنهم كلهم بيشاركوا نفس قاعدة بيانات Git (مجلد .git). هذا يعني أن التغييرات والـ commits في أي worktree بتنعكس على المستودع ككل.

كيف نبدأ مع الـ worktree؟ دليل عملي خطوة بخطوة

الكلام النظري حلو، بس خلينا نشوف التطبيق العملي. تخيلوا معي نفس السيناريو السابق: أنا شغال على فرع اسمه feature/user-profile في مجلد مشروعي ~/projects/my-app، وإجاني طلب تعديل عاجل لازم أعمله على فرع جديد اسمه hotfix/login-bug.

1. إنشاء Worktree جديد

بدل ما أعمل git stash، وأنا في مجلدي الأصلي، كل اللي علي أعمله هو إني أكتب هذا الأمر في الـ terminal:

git worktree add ../my-app-hotfix hotfix/login-bug

خلينا نحلل الأمر:

  • add: لإنشاء worktree جديد.
  • ../my-app-hotfix: هذا هو المسار والمجلد الجديد اللي راح يتم إنشاؤه. أنا بحب أحطه جنب مجلد المشروع الأصلي عشان التنظيم.
  • hotfix/login-bug: هذا هو اسم الفرع اللي بدي أعمل عليه checkout في المجلد الجديد. لو الفرع مش موجود، Git راح ينشئه لك من الفرع الحالي اللي أنت عليه.

النتيجة؟ Git أنشأ مجلد جديد اسمه my-app-hotfix، وداخله نسخة كاملة من المشروع عاملة checkout على الفرع hotfix/login-bug. ومجلدي الأصلي my-app بقي كما هو، مفتوح على فرع feature/user-profile بكل تغييراتي اللي لسا ما عملتلها commit.

2. العمل في الـ Worktree الجديد

الآن صارت المهمة سهلة جدًا. بفتح نافذة terminal جديدة، أو بفتح الـ IDE تبعي (مثل VS Code) على المجلد الجديد:

cd ../my-app-hotfix
code .

صار عندي نافذتين من الـ IDE مفتوحين، كل واحدة على مجلد وفرع مختلفين. في المجلد الجديد، بشتغل على حل المشكلة الطارئة براحتي، بعمل تعديلاتي، وبعمل commit و push كأني بشتغل في أي مشروع عادي.

# ... أعمل التعديلات اللازمة ...
git add .
git commit -m "Fix: Corrected the login validation logic"
git push origin hotfix/login-bug

خلصت المهمة الطارئة؟ ممتاز. برجع لنافذة الـ IDE الأولى وبكمل شغلي على ميزة الـ user profile وكأنه لم يحدث شيء!

3. إدارة وعرض الـ Worktrees

إذا نسيت شو في عندك worktrees مفتوحة، بكل بساطة اكتب:

git worktree list

راح يطلعلك نتيجة شبيهة بهاي:

/path/to/my-app         a1b2c3d [feature/user-profile]
/path/to/my-app-hotfix  e4f5g6h [hotfix/login-bug]

هذا بيورجيك كل worktree، وين مساره، وآخر commit عليه، وعلى أي فرع هو شغال.

4. تنظيف الأمور: إزالة الـ Worktree

بعد ما تخلص من مهمة الـ hotfix ويتم دمجها (merge) في الفرع الرئيسي، ما عاد في داعي للمجلد الإضافي. لإزالته، الموضوع بسيط جدًا:

git worktree remove my-app-hotfix

هذا الأمر بحذف الـ worktree من سجلات Git وبتقدر بعدها تحذف المجلد يدويًا بكل أمان. Git ذكي، فلو حاولت تحذف worktree وفي تغييرات مش معمولة commit، راح يرفض ويحميك من ضياع الشغل.

نصيحة: بعد ما تدمج فرع الـ hotfix، لا تنسى تحذفه من المستودع باستخدام git branch -d hotfix/login-bug عشان تحافظ على نظافة المستودع.

نصائح من “أبو عمر” لاستخدام الـ worktree كالمحترفين

من يوم ما اكتشفت الـ worktree، صار جزء لا يتجزأ من شغلي اليومي. وهي شوية نصائح من تجربتي:

  • استخدمه لمراجعة الكود (Code Reviews): لما زميلك يطلب منك تراجع Pull Request، بدل ما تعمل checkout للفرع تبعه وتخبّص شغلك، أنشئ worktree جديد للفرع تبعه. راجع الكود، جرب التغييرات، وبعد ما تخلص احذف الـ worktree.
  • لتشغيل الاختبارات الطويلة: لو عندك اختبارات بتاخد وقت طويل (End-to-End tests)، بتقدر تعمل worktree مخصوص عشان تشغل عليه الاختبارات، وبنفس الوقت تكمل شغلك في الـ worktree الرئيسي بدون ما تستنى.
  • اتبع تسمية موحدة: عشان ما تضيع، حاول تتبع نمط معين في تسمية مجلدات الـ worktree، مثل ../-.
  • احذر من مساحة التخزين: تذكر أن كل worktree هو نسخة من ملفات المشروع. إذا كان مشروعك حجمه بالجيجابايت (مثل مشاريع الألعاب أو البيانات الضخمة)، قد يكون لهذا تأثير على مساحة القرص الصلب. لكن لمعظم مشاريع الويب والتطبيقات، الأمر لا يكاد يذكر.

الخلاصة: من الفوضى إلى النظام بـ 3 أوامر بسيطة 🙏

رحلتي من جحيم الـ stash المفقود إلى نعيم الـ git worktree المنظم علمتني درس مهم: دائمًا في أداة أفضل وطريقة أذكى لإنجاز العمل. الـ git worktree حوّل لحظات الضغط والطلبات العاجلة من مصدر للفوضى والإحباط إلى مجرد مهمة جانبية منظمة لا تؤثر على سير عملي الأساسي.

جربوها يا جماعة، ومش راح تندموا. خلوا الـ stash للأمور البسيطة والسريعة جدًا، مثل حفظ تغيير بسيط عشان تعمل pull للتحديثات. لكن لأي شيء يتطلب تبديل سياق العمل بشكل كامل، مثل حل bug طارئ أو العمل على ميزة أخرى بالتوازي، فإن git worktree هو صديقكم الوفي. صدقوني، صحتكم النفسية وإنتاجيتكم كمطورين راح تشكركم.

يلا، روحوا جربوها وخبروني بالنتائج!

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

برمجة وقواعد بيانات

تحديثات قاعدة البيانات بدون توقف: كيف أنقذنا نمط التوسيع والتعاقد (Expand/Contract) من جحيم التوقفات المجدولة؟

هل سئمت من إيقاف الخدمة مع كل تحديث لهيكلة قاعدة البيانات؟ أشارككم قصة حقيقية وكيف أنقذنا نمط التوسيع والتعاقد (Expand/Contract) من ليالي النشر الطويلة والمُجهدة،...

4 يونيو، 2026 قراءة المزيد
الشبكات والـ APIs

كانت إعادة المحاولة كارثة: كيف أنقذتنا مفاتيح عدم تكرار العمليات (Idempotency Keys) من جحيم الفواتير المزدوجة؟

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

4 يونيو، 2026 قراءة المزيد
الحوسبة السحابية

من التوقف التام إلى النجاة: كيف أنقذتنا استراتيجية “الضوء المرشد” (Pilot Light) يوم انقطعت السحابة؟

أتذكر ذلك اليوم جيدًا، فنجان القهوة الصباحي، وصوت تنبيهات المراقبة يصرخ كأنه يوم القيامة. كانت منطقة سحابية كاملة قد توقفت عن العمل، لكن بفضل استراتيجية...

4 يونيو، 2026 قراءة المزيد
التوظيف وبناء الهوية التقنية

كانت مهمتي البرمجية للاختبار مجرد كود: كيف أنقذني توثيق القرارات من جحيم الصمت بعد المقابلة؟

أشارككم قصة حقيقية من بداياتي، وكيف تعلمت بالطريقة الصعبة أن المهمة البرمجية ليست مجرد كتابة كود، بل هي فرصة لإظهار طريقة تفكيرك. اكتشف كيف يمكن...

4 يونيو، 2026 قراءة المزيد
التكنلوجيا المالية Fintech

من الانتظار لأيام إلى الدفع في ثوانٍ: كيف أنقذتنا شبكات الدفع الفوري من جحيم التحويلات البنكية؟

أسرد لكم من واقع تجربتي كـ "أبو عمر"، كيف عانينا من بطء وتكلفة التحويلات البنكية الدولية، وكيف جاءت شبكات الدفع الفوري ومعيار ISO 20022 لتكون...

4 يونيو، 2026 قراءة المزيد
البنية التحتية وإدارة السيرفرات

كان كل خادم لدينا ‘ندفة ثلج’ فريدة: كيف أنقذنا ‘الكود كبنية تحتية’ (IaC) من جحيم الانجراف اليدوي؟

في هذه المقالة، أشارككم قصة حقيقية من قلب المعركة التقنية مع "خوادم ندفات الثلج" الفوضوية. سنغوص في مفهوم "الكود كبنية تحتية" (IaC) وكيف أن أدوات...

4 يونيو، 2026 قراءة المزيد
اختبارات الاداء والجودة

كانت تغطية الاختبارات 100% لكن الأخطاء تتسرب: كيف أنقذنا “الاختبار الطفري” من جحيم الثقة الزائفة؟

كنا نظن أن تغطية الاختبار بنسبة 100% هي درعنا الواقي، لكن الأخطاء كانت تتسلل إلى الإنتاج كاللصوص في ليل بهيم. اكتشف كيف أنقذنا "الاختبار الطفري"...

4 يونيو، 2026 قراءة المزيد
البودكاست