يا مساء الخير يا جماعة،
خلوني أحكيلكم قصة صارت معي زمان، بس لليوم بتذكرها كأنها مبارح. كانت الساعة حوالي أربعة العصر يوم خميس، وأنا غرقان في كود لميزة جديدة ومعقدة في مشروع بنشتغل عليه. القهوة جنبي، والمزاج عال العال، وكنت على وشك إني أعمل 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 هو صديقكم الوفي. صدقوني، صحتكم النفسية وإنتاجيتكم كمطورين راح تشكركم.
يلا، روحوا جربوها وخبروني بالنتائج!