
Andrew Hanna

Andrew Hanna

الإجابة باختصار: احفظ كل Flow كملف .flow-meta.xml واحد
بلا رقم إصدار، واجعل لكل Flow مالكًا واحدًا في كل تغيير، وامنع Git من دمج XML الخاص
بالـ Flow تلقائيًا. وإذا عدّل فرعان الـ Flow نفسه، فاحتفظ بجانب واحد وأعد بناء التغيير
الآخر في Flow Builder بدل تعديل XML يدويًا. معظم معاناة الدمج مع الـ Flows سببها
التعديلات المتوازية وضوضاء التخطيط، لا Git نفسه.
الـ Flow ليس كودًا تكتبه سطرًا بسطر، بل XML يولّده Flow Builder، وفيه بعض الفخاخ:
locationX وlocationY، فسحب مربع واحد ينتج diff بلا أي
تغيير في المنطق. وتحويل الـ Flow بين free-form وauto-layout يعيد كتابة مواضع كل
العناصر.
force-app/main/default/flows/، باسم الـ API الخاص بالـ Flow دون لاحقة
إصدار.
status في الـ Flow نفسه هو ما يحدد إن كان نشطًا، ولم تعد Salesforce
توصي باستخدام Flow Definitions للتفعيل.
sf project retrieve start --metadata Flow:Case_Escalation. راجع قيمة
status قبل الـ commit حتى لا تُشحن مسودة بالخطأ.
force-app/**/flows/*.flow-meta.xml -merge إلى
.gitattributes. وبحسب
توثيق gitattributes، فإن إلغاء
merge يحتفظ بنسخة فرعك ويعلن وجود تعارض. وتجنّب اختصار
binary هنا، لأنه يوقف الـ diffs أيضًا، وأنت ما زلت تريد مراجعة تغييرات
الـ Flow.
هذه الخطوة الأخيرة هي الأهم. الدمج القائم على الأسطر قد ينتج XML صالحًا تمامًا لكنه خاطئ منطقيًا، مثل connector يشير إلى عنصر حذفه الفرع الآخر. والتعارض المفروض أرخص من تعارض صامت. ولهذا يُبقي دليلنا لإعداد merge driver يفهم Salesforce الـ Flows خارج أنماط الـ driver: الـ profiles والـ permission sets تندمج جيدًا على مستوى العُقد، أما منطق الـ Flow فلا.
git checkout --ours أو --theirs على ملف الـ Flow.
ولتعارضات أنواع الـ metadata الأخرى، راجع كيف تحل تعارضات metadata في Salesforce أثناء الدمج.
ما زلت تنشر الـ Flows عبر change sets؟ ابدأ بـ الانتقال من change sets إلى source control، ثم طبّق الخطوات السابقة.
منصات DevOps مثل Gearset وFlosum تضيف مقارنة ونشرًا يفهمان الـ Flows فوق Git، كما يقدّم Lifecycle Center من Salesforce (المعروف سابقًا باسم DevOps Center) توصيات بالذكاء الاصطناعي لحل التعارضات عبر أدوات MCP الخاصة به. أما Serpent فيحل التعارضات داخل الـ pull request نفسه: يقترح Serpent AI حلًا وينتظر مراجعتك قبل تطبيقه، ومراجعة الكود بالذكاء الاصطناعي متاحة في كل الخطط. اطّلع على خطط Serpent، أو تصفّح المزيد من أدلة Salesforce DevOps.
هل يجب أن أحفظ ملفات FlowDefinition في Git؟
لا. منذ Metadata API v44 أصبح حقل status في الـ Flow نفسه هو ما يتحكم في
التفعيل، ولم تعد Salesforce توصي بـ Flow Definitions لهذه المهمة.
هل يستطيع Git دمج إصدارين من الـ Flow نفسه تلقائيًا؟
قد ينتج دمجًا نظيفًا نصيًا، لكن Git لا يفهم منطق الـ Flow. افرض تعارضًا باستخدام
-merge وأعد تطبيق أحد التغييرين في Flow Builder.
لماذا وصلت مسودة Flow إلى الـ repository عندي؟
الـ retrieve يعيد أحدث إصدار من الـ Flow، نشطًا كان أو مسودة. راجع قيمة
status قبل الـ commit.
هل تهم تغييرات locationX وlocationY؟
هي تغيّر التخطيط فقط لا السلوك. راجعها كضوضاء، وتجنّب تبديل وضع الـ canvas حتى تبقى ثابتة.
بدون التزام.