Worktree المدمج في Cursor: استخدام متقدّم

4 min read

06-cursor-cli-with-worktree يغطي يدوياً worktree + CLI بالتوازي؛ هذا المنشور يركز على الاستخدام المتقدّم لـ worktrees التي ينشئها Cursor تلقائياً (Agent متوازي / Apply): كيفية إدراج مهام متعددة، هل ندمج أم نستبدل بالكامل عند Apply، حل التعارضات، واستخدام git worktree list للإدارة اليومية. نترك المفاهيم التمهيدية وننتقل مباشرة للممارسة.

سيناريو متقدّم 1: مهام متعددة بالتوازي، مراجعة ثم Apply

ميزة واحدة يمكن تقسيمها إلى عدة "مهام فرعية"، كل واحدة يشغّلها Agent في worktree خاص؛ أنت تطبّق فقط ما تريده، وليس الكل دفعة واحدة.

مثال: تريد تنفيذ "إعادة هيكلة utils"، "إضافة اختبارات وحدة"، و"توليد وثائق API" في الوقت نفسه:

  • شغّل ثلاثة Agents متوازيين (أو شغّلهم واحداً تلو الآخر، كل واحد في worktree) بتعليمات مختلفة
  • عند الانتهاء لديك ثلاث نتائج: ربما "إعادة الهيكلة" ممتازة، "الاختبارات" تحتاج تعديلاً، "الوثائق" تتجاهلها
  • طبّق فقط بطاقة "إعادة الهيكلة"؛ اترك الباقي دون تطبيق بحيث فقط إعادة الهيكلة تندمج في main — الاثنتان الأخريان لا تلمسان المجلد الرئيسي

نقطة متقدّمة: لا تحتاج أن تلتزم بكل شيء دفعة واحدة؛ يمكنك "Apply حسب المهمة، Apply حسب البطاقة"، وmain يحصل فقط على ما قبلته.

سيناريو متقدّم 2: Merge أم Full Overwrite عند Apply؟

عند Apply، يحاول Cursor الدمج بسلاسة. إن تسبّب Best-of-N نفسه أو عدة Apply في تعارضات، سيسأل:

الخيار متى تستخدمه
Merge (واجهة حل التعارضات) عندما تريد الإبقاء على جزء من محتوى main وإدخال جزء فقط من تغييرات worktree، أو عند دمج تغييرات من عدة worktrees "فقرة بفقرة"
Full Overwrite عندما تكون متأكداً أن ملف worktree يجب أن يربح وأن يُستبدل ملف main بالكامل، أو عندما تكون التعارضات كثيرة وتريد أن تكون "هذه البطاقة" المصدر الوحيد للحقيقة

عملياً: مهمة واحدة، Agent واحد، ملفات قليلة → الدمج عادة ينجح. نفس الطلب يُشغّل بنماذج متعددة (Best-of-N)، وتطبّق جزءاً من البطاقة A وجزءاً من البطاقة B → التعارضات محتملة؛ إما طبّق بطاقة واحدة فقط، أو استخدم الدمج وحلّ ملفاً بملف. تجنّب Full Overwrite على نفس مجموعة الملفات من بطاقات متعددة — سيتستبدل بعضها بعضاً.

سيناريو متقدّم 3: السلوك عندما يكون لـ main تغييرات غير ملتزمة

عند إنشاء worktree، يجلب Cursor التغييرات المتتبعة والملفات الجديدة من المجلد الرئيسي إلى worktree (الملفات المُهملة في Git لا تُجلب). إذن:

  • غيّر شيئاً على main دون commit، ثم شغّل Agent في worktree → الـ Agent يعمل فوق "حالتك الحالية"؛ عند Apply للخلف، تدمج "تغييراتك غير الملتزمة + تغييرات الـ Agent"
  • إذا أردت أن تبدأ المهام المتوازية من main نظيف، شغّل git stash أو commit أولاً، ثم أنشئ worktree، حتى لا تخلط "WIP + تغييرات الـ Agent" وتحصل على تعارضات أكثر عند Apply

يمكنك استخدام ذلك عكسياً: عن قصد اترك بعض WIP على main، أنشئ worktree لتغييرات تجريبية، ثم استخدم الدمج عند Apply لإدخال الأجزاء التي تعجبك فقط؛ اترك الباقي في worktree ولا تطبّق.

سيناريو متقدّم 4: الفحص والتنظيف بـ git worktree list

worktrees التي ينشئها Cursor تظهر في git worktree list؛ المسارات عادة تحت .cursor/worktrees/<repo>/<id>:

git worktree list

عادات جيدة:

  • بعد Apply وعندما يبدو main جيداً، Cursor يدير العدد تلقائياً؛ إن كانت القائمة تحتوي worktrees كثيرة والقرص ضيق، راجع إعدادات Cursor (مثلاً cursor.worktreeMaxCount، فاصل التنظيف) أو أغلق نوافذ مشاريع Cursor غير المستخدمة لتنظيف worktrees القديمة
  • عند التصحيح: القائمة تظهر كم "ساندبوكس" موجود وعلى أي فرع كل واحد، حتى لا تخلط بين main وworktrees الـ Agent

تجنّب تشغيل git worktree remove يدوياً على مسارات أنشأها Cursor إلا إذا كنت متأكداً أن الـ Agent انتهى؛ وإلا قد يختلّ الحالة الداخلية لـ Cursor.

سيناريو متقدّم 5: عندما يلمس Agents متوازيون نفس الملفات

إن شغّلت Agentين، واحد يغيّر src/auth/ والآخر src/api/، عادة لا يتعارضان — طبّق واحداً ثم الآخر (الترتيب لا يهم كثيراً؛ الدمج يحل تلقائياً غالباً).

إن كلا الـ Agentين يعدّلان نفس الملف (مثلاً كلاهما يغيّر package.json أو نفس config.ts):

  • طبّق الأول → main يصبح لديه تلك التغييرات
  • طبّق الثاني → تدخل تدفق الدمج وقد ترى تعارضات
  • استخدم واجهة تعارضات Cursor لاختيار "أبقِ هذا الجزء من main، هذا من worktree"، أو إن أردت نسخة worktree الثانية بالكامل فاستخدم Full Overwrite

استراتيجية: عند تخطيط مهام متوازية، حاول أن تبقي مجموعات الملفات غير متداخلة لكل Agent (مثلاً مجلد frontend واحد، مجلد backend واحد);حينها نادراً ما تحتاج حل التعارضات يدوياً.

ملخص

  • مهام متعددة بالتوازي: قسّم إلى مهام فرعية في worktree، راجع، ثم طبّق فقط البطاقات التي تريد؛ main يحصل فقط على ما قبلته
  • اختيار Apply: استخدم Merge للإبقاء على جزء من محتوى main؛ استخدم Full Overwrite عندما يفوز ملف worktree؛ تجنّب Full Overwrite متكرر على نفس الملفات من بطاقات متعددة
  • حالة المجلد الرئيسي: التغييرات غير الملتزمة تُجلب إلى worktree؛ لخط أساس نظيف، stash/commit أولاً؛ أو اترك WIP عمداً من أجل "worktree تجريبي + دمج انتقائي"
  • الإدارة: استخدم git worktree list للفحص والتناسق مع تنظيف Cursor؛ أبقِ مجموعات الملفات لكل مهمة غير متداخلة لتقليل التعارضات

التالي: 09-worktree-advanced — مقارنة Best-of-N متعددة النماذج، إعداد worktrees.json، والتنظيف.