{"id":"l-git-3-3","courseId":"git-github","lang":"ar","kind":"lesson","summary":"افتح pull request من فرع مرفوع، واكتب وصفًا يستطيع المراجعون التصرّف بناءً عليه، وراجِع الكود وحدّثه عبر التعليقات والـ commits الجديدة، وادمج بالطريقة المناسبة.","html":"<p>حين تعمل وحدك، دمج الفرع مجرد أمر. أما في الفريق فهو حوار: يقرأ شخص آخر التغيير، ويطرح الأسئلة، ويكتشف الخطأ الذي لم تره، وبعد ذلك فقط يصل إلى <code dir=\"ltr\">main</code>. والـ <strong>pull request</strong> (طلب الدمج) على GitHub هو المكان الذي يجري فيه هذا الحوار. وحتى في موقع شخصي تعمل عليه وحدك يستحق الاستخدام، لأنك بعد بضعة دروس ستربط به فحوصًا آلية، ولأن أصحاب العمل ينظرون إلى طريقة عملك، لا إلى ما بنيته فقط.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">من الفرع إلى الـ pull request</h2>\n<p>بنيت مرشّحًا (filter) لصفحة المشاريع على فرع ورفعته:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"bash\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">Terminal</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">git</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> switch</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> -c</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> projects-filter</span></span>\n<span class=\"line\"><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># …commits…</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">git</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> push</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> -u</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> origin</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> projects-filter</span></span></code></pre></div>\n<p>يتضمّن ناتج الرفع رابطًا: <code dir=\"ltr\">Create a pull request for 'projects-filter' on GitHub by visiting: https://github.com/maya-okafor/portfolio/pull/new/projects-filter</code>. افتحه، أو انقر شريط “Compare &amp; pull request” في صفحة الـ repository. تحقّق من محدّدي الفرعين: <strong>base</strong> هو المكان الذي يجب أن يذهب إليه العمل (<code dir=\"ltr\">main</code>)، و <strong>compare</strong> هو فرعك.</p>\n<p>ومع GitHub CLI، يطلب <code dir=\"ltr\">gh pr create</code> عنوانًا ونصًا في الطرفية، و <code dir=\"ltr\">gh pr create --fill</code> يستخدم رسائل الـ commits الخاصة بك.</p>\n<p>وإن لم يكن العمل جاهزًا لكنك تريد ملاحظات مبكرة، فافتحه كـ <strong>draft pull request</strong> (مسوّدة). لا يمكن دمجه حتى تعلّمه بأنه جاهز، وهو يخبر المراجعين أن ينظروا إلى الاتجاه العام لا إلى التفاصيل.</p>\n<h2 id=\"sec-2\" tabindex=\"-1\">اكتب وصفًا يستطيع الناس التصرّف بناءً عليه</h2>\n<p>العنوان يقول ما يفعله التغيير: “Add tag filter to projects page”. والنص يجيب عن ثلاثة أسئلة:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"markdown\" data-index=\"1\"><div class=\"code-head\"><span class=\"code-title\">Markdown</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#0550AE;--shiki-light-font-weight:bold;--shiki-dark:#79C0FF;--shiki-dark-font-weight:bold\">## What</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">Adds tag buttons above the project grid; clicking one hides cards without that tag.</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-light-font-weight:bold;--shiki-dark:#79C0FF;--shiki-dark-font-weight:bold\">## Why</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">The grid has 14 projects now and visitors asked for a way to find the React ones.</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-light-font-weight:bold;--shiki-dark:#79C0FF;--shiki-dark-font-weight:bold\">## How to check</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">1.</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> Open projects.html</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">2.</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> Click \"React\": only 5 cards remain</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">3.</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> Click \"All\": all 14 return</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">Closes #12</span></span></code></pre></div>\n<p>أضف لقطة شاشة لأي شيء مرئي؛ ويمكنك لصق الصور مباشرة في المربّع. السطر الأخير يستخدم كلمة إغلاق مفتاحية: حين يُدمج هذا الـ pull request في الفرع الافتراضي، يُغلق الـ issue رقم 12 تلقائيًا ويرتبط الاثنان ببعضهما. وتعمل <code dir=\"ltr\">Fixes</code> و <code dir=\"ltr\">Resolves</code> أيضًا.</p>\n<h2 id=\"sec-3\" tabindex=\"-1\">المراجعة</h2>\n<p>يفتح المراجِع تبويب <strong>Files changed</strong>، الذي يعرض الـ diff بين فرعك وقاعدته. يستطيع التعليق على أي سطر، أو تحديد عدة أسطر لتعليق أشمل، أو كتابة <strong>suggestion</strong> (اقتراح): بديل مقترح تستطيع تطبيقه بنقرة واحدة كـ commit. وحين ينتهي، يرسل مراجعته بإحدى الحالات <strong>Comment</strong> أو <strong>Approve</strong> أو <strong>Request changes</strong>.</p>\n<p>للردّ لا تفتح أي شيء جديد. نفّذ التغييرات محليًا، وأنشئ commit، وارفعه إلى الفرع نفسه:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"bash\" data-index=\"2\"><div class=\"code-head\"><span class=\"code-title\">Terminal</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">git</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> commit</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> -am</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"Rename filter class to project-filter\"</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">git</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> push</span></span></code></pre></div>\n<p>يتحدّث الـ pull request، ويرى المراجِع فقط ما تغيّر منذ مراجعته الأخيرة. ردّ على كل تعليق، وأغلق النقاشات المحسومة (resolve)، واطلب نظرة أخرى.</p>\n<aside class=\"callout callout-tip\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\"/><path d=\"M9 18h6\"/><path d=\"M10 22h4\"/></svg><span><span class=\"callout-kind\">نصيحة</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>المراجعة الجيدة</span></p>\n<p>حين تراجع، ابدأ بتشغيل التغيير لا بقراءته. علّق على الكود، لا على الشخص أبدًا؛ واطرح أسئلة (“ماذا يحدث إن لم توجد أي مشاريع؟”) بدل إصدار الأحكام. علّم التفضيلات الصغيرة بأنها اختيارية، وغالبًا ما تُسبق بـ “nit:”، ليعرف الكاتب ما الذي يمنع الموافقة. ووافق حين يصبح الكود جيدًا، لا حين يصبح كما كنت ستكتبه أنت.</p>\n</aside>\n<p>أبقِ الـ pull requests صغيرة. حين يبقى التغيير دون 400 سطر تقريبًا يستطيع المراجِع أن يفكّر فعلًا في كل سطر؛ أما الـ pull request ذو الألفي سطر فيُمرّ عليه سريعًا ويُوافَق عليه. وإن كانت الـ feature كبيرة، فقسّمها إلى سلسلة من الـ pull requests يترك كل منها الموقع يعمل.</p>\n<h2 id=\"sec-4\" tabindex=\"-1\">الدمج: ثلاثة أزرار، ثلاثة سجلّات</h2>\n<p>بعد الموافقة، يعرض زر الدمج حتى ثلاث طرق، وتستطيع إعدادات الـ repository تقييدها:</p>\n<ul>\n<li><strong>Create a merge commit</strong>: كل الـ commits الخاصة بك مع merge commit، مثل <code dir=\"ltr\">git merge --no-ff</code>.</li>\n<li><strong>Squash and merge</strong>: الـ commits الخاصة بك مجمّعة في commit واحد جديد على <code dir=\"ltr\">main</code>، يحمل عنوان الـ pull request.</li>\n<li><strong>Rebase and merge</strong>: الـ commits الخاصة بك يُعاد تشغيلها على <code dir=\"ltr\">main</code> واحدًا تلو الآخر، دون merge commit.</li>\n</ul>\n<p>الـ Squash and merge خيار افتراضي شائع للـ pull requests الصغيرة: يحصل <code dir=\"ltr\">main</code> على commit نظيف واحد لكل تغيير، وتختفي الـ commits من نوع “fix typo”. أما الـ merge commits فتناسب الأعمال الأكبر التي تروي فيها الـ commits المنفردة قصة مفيدة. اختر واحدة لكل repository والتزم بها.</p>\n<p>بعد الدمج، انقر <strong>Delete branch</strong> على GitHub، ثم رتّب الأمور محليًا:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"bash\" data-index=\"3\"><div class=\"code-head\"><span class=\"code-title\">Terminal</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">git</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> switch</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> main</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">git</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> pull</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">git</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> branch</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> -D</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> projects-filter</span></span></code></pre></div>\n<p>لماذا <code dir=\"ltr\">-D</code> وليس <code dir=\"ltr\">-d</code>؟ بعد دمج بطريقة squash أو rebase، لا تكون الـ commits الأصلية في فرعك أسلافًا لـ <code dir=\"ltr\">main</code> (فقد أنشأ GitHub commits جديدة)، لذا يظن <code dir=\"ltr\">-d</code> أن العمل لم يُدمج. وبمجرد أن يعرض GitHub الـ pull request على أنه مدموج، يصبح <code dir=\"ltr\">-D</code> آمنًا.</p>\n<aside class=\"callout callout-mistake\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg><span><span class=\"callout-kind\">خطأ شائع</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>إعادة استخدام فرع مدموج</span></p>\n<p>بعد squash merge، فإن مواصلة العمل على الفرع نفسه للـ feature التالية تعني أن فرعك ما زال يحمل الـ commits القديمة السابقة للـ squash. فيعرضها الـ pull request التالي مجددًا ويتعارض مع نظيرها المضغوط على <code dir=\"ltr\">main</code>. تعامل مع الفرع المدموج على أنه منتهٍ: احذفه، وحدّث <code dir=\"ltr\">main</code>، وأنشئ فرعًا جديدًا بـ <code dir=\"ltr\">git switch -c</code>.</p>\n</aside>\n<p>الانتقال إلى pull request شخص آخر لاختباره أمر واحد مع الـ CLI: <code dir=\"ltr\">gh pr checkout 14</code>. في الدرس التالي ستستخدم بقية أدوات التعاون في GitHub: الـ issues والـ projects لتخطيط العمل، والـ forks للمساهمة في repositories لا تملكها.</p>\n","toc":[{"id":"sec-1","text":"من الفرع إلى الـ pull request","level":2},{"id":"sec-2","text":"اكتب وصفًا يستطيع الناس التصرّف بناءً عليه","level":2},{"id":"sec-3","text":"المراجعة","level":2},{"id":"sec-4","text":"الدمج: ثلاثة أزرار، ثلاثة سجلّات","level":2}],"takeaways":["الـ pull request يقترح دمج فرع في آخر، وهو المكان الذي يجري فيه النقاش والمراجعة والفحوص الآلية.","رفع commits إضافية إلى الفرع نفسه يحدّث الـ pull request المفتوح؛ ولا تحتاج أبدًا إلى فتح واحد جديد.","الوصف الجيد يقول ما الذي تغيّر، ولماذا، وكيف تتحقّق منه، والعبارة `Closes","الـ merge commit والـ squash and merge والـ rebase and merge تنتج سجلّات مختلفة على <code dir=\"ltr\">main</code>؛ اختر عُرفًا واحدًا لكل repository.","بعد squash merge، ابدأ العمل الجديد على فرع جديد من <code dir=\"ltr\">main</code> المحدَّث بدل مواصلة العمل على الفرع القديم."],"further":[{"title":"Pull requests (GitHub Docs)","url":"https://docs.github.com/en/pull-requests/reference/pull-requests"},{"title":"Reviewing proposed changes in a pull request","url":"https://docs.github.com/en/pull-requests/how-tos/review-pull-requests/reviewing-proposed-changes-in-a-pull-request"},{"title":"Pull request merges (GitHub Docs)","url":"https://docs.github.com/en/pull-requests/reference/pull-request-merges"},{"title":"Linking a pull request to an issue","url":"https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue"}],"quiz":[{"q":"<p>يطلب منك مراجِع إعادة تسمية class في CSS ضمن الـ pull request المفتوح. كيف تحدّث الـ pull request؟</p>","options":[{"text":"أغلقه، ونفّذ التغيير على فرع جديد، وافتح pull request جديدًا.","why":"هذا يرمي نقاش المراجعة دون أي سبب. الـ pull requests مصمَّمة لتُحدَّث."},{"text":"أنشئ commit بالتغيير على الفرع نفسه وارفعه؛ فيتحدّث الـ pull request تلقائيًا.","why":"صحيح. الـ pull request يتتبّع فرعه، فتظهر فيه الـ commits الجديدة ويرى المراجِع بالضبط ما تغيّر منذ مراجعته."},{"text":"عدّل الملف في تبويب “Files changed” داخل الـ pull request.","why":"تستطيع إجراء تعديلات صغيرة على GitHub، لكنها تبقى commit على الفرع؛ ليست آلية منفصلة، والعمل المحلي أسهل في الاختبار عادةً."},{"text":"اطلب من المراجِع أن ينفّذ التغيير بنفسه بعد الدمج.","why":"دمج عمل تعرف أنه غير مكتمل في <code dir=\"ltr\">main</code> يُفشل الغرض من المراجعة."}],"answer":1},{"q":"<p>ينتهي وصف الـ pull request الخاص بك بـ `Closes</p>","options":[{"text":"يُغلق الـ issue رقم 12 تلقائيًا ويُربط بالـ pull request.","why":"صحيح. الكلمات المفتاحية مثل <code dir=\"ltr\">closes</code> و <code dir=\"ltr\">fixes</code> و <code dir=\"ltr\">resolves</code> متبوعة برقم issue تربطهما، والدمج يُغلق الـ issue."},{"text":"يُغلق الـ pull request رقم 12.","why":"الرقم يشير إلى issue (الـ issues والـ pull requests تتشارك ترقيمًا واحدًا)، والكلمة المفتاحية تربط ولا تُغلق pull request آخر."},{"text":"لا شيء؛ إنها مجرد ملاحظة للبشر.","why":"يحلّل GitHub هذه الكلمات المفتاحية في أوصاف الـ pull requests ويتصرّف بناءً عليها عند الدمج في الفرع الافتراضي."}],"answer":0},{"q":"<p>يدمج فريقك الـ pull requests بطريقة squash. بعد دمج الـ pull request الخاص بك، واصلت إنشاء commits على الفرع نفسه وفتحت pull request ثانيًا. فظهرت فيه الـ commits القديمة مجددًا مع تعارضات. لماذا؟</p>","options":[{"text":"نسي GitHub أن الـ pull request الأول دُمج.","why":"GitHub يتذكّر. المشكلة في رسم الـ commits، لا في سجلّات GitHub."},{"text":"الدمج بطريقة squash يحذف الفرع على GitHub، فيتلف.","why":"حذف الفرع بعد الدمج يزيل مؤشّرًا. لا شيء يتلف."},{"text":"يحتاج فرعك إلى <code dir=\"ltr\">git pull --force</code> لإصلاح السجلّ.","why":"لا يوجد إصلاح كهذا، والقوة لا تغيّر ما هو موجود في <code dir=\"ltr\">main</code>."},{"text":"أنشأ الـ squash commitًا واحدًا جديدًا على <code dir=\"ltr\">main</code>، فتبقى الـ commits الأصلية في فرعك غير مدموجة في نظر Git.","why":"صحيح. الـ squash commit يحمل التغييرات نفسها لكن بمعرّف مختلف. ابدأ كل قطعة عمل جديدة على فرع جديد من <code dir=\"ltr\">main</code> المحدَّث."}],"answer":3},{"q":"<p>أيّ pull request يُرجَّح أن يحظى بأكثر المراجعات فائدة؟</p>","options":[{"text":"pull request واحد بإعادة التصميم كاملة، 2,400 سطر متغيّر، بعنوان “Updates”.","why":"لا يستطيع المراجعون استيعاب هذا الكمّ، فيمرّون عليه سريعًا ويوافقون. الحجم والعنوان المبهم كلاهما يعملان ضد المراجعة."},{"text":"pull request بلا وصف، لأن الكود يتحدّث عن نفسه.","why":"الكود يبيّن ما الذي تغيّر، لا لماذا، ولا كيف يُتحقَّق منه. ويضيّع المراجعون وقتهم في إعادة بناء نيّتك."},{"text":"pull request من 150 سطرًا يضيف مرشّح المشاريع، مع لقطة شاشة وخطوات لاختباره.","why":"صحيح. صغير، وله غرض واحد، ومشروح، فيستطيع المراجِع أن يتحقّق فعلًا من أنه يعمل."}],"answer":2}],"exercise":{"kind":"order","items":["branch","push","open","review","update","merge","cleanup"],"title":"أوصِل مرشّح المشاريع عبر pull request","prompt":"<p>رتّب خطوات سير عمل الـ pull request، من بدء العمل على مرشّح المشاريع إلى وصوله إلى <code dir=\"ltr\">main</code> مع ترتيب الـ repository المحلي.</p>\n","hints":["الـ pull request يحتاج إلى فرع موجود على GitHub.","يُردّ على ملاحظات المراجعة بالرفع إلى الفرع نفسه، قبل أن يُدمج أي شيء.","التنظيف المحلي يأتي بعد أن يدمج GitHub الفرع ويحذفه."],"explanation":"<p>يبدأ العمل على فرع جديد من <code dir=\"ltr\">main</code> محدَّث. رفعه بـ <code dir=\"ltr\">-u</code> يضعه على GitHub، حيث تفتح pull request إلى <code dir=\"ltr\">main</code> بوصف واضح. يعلّق المراجعون؛ وتردّ أنت بإنشاء commits ورفعها إلى الفرع نفسه، فيتحدّث الـ pull request. وبعد الموافقة يُدمج (هنا بطريقة squash) ويُحذف الفرع البعيد. وأخيرًا تحدّث <code dir=\"ltr\">main</code> المحلي وتحذف الفرع المحلي.</p>\n","checkLabels":{},"itemText":{"branch":"<code dir=\"ltr\">git switch main</code>، ثم <code dir=\"ltr\">git pull</code>، ثم <code dir=\"ltr\">git switch -c projects-filter</code>.","push":"سجّل العمل في commits وشغّل <code dir=\"ltr\">git push -u origin projects-filter</code>.","open":"افتح pull request (القاعدة: <code dir=\"ltr\">main</code>) يتضمّن ما الذي تغيّر ولماذا وكيف يُتحقَّق منه، و <code dir=\"ltr\">Closes #12</code>.","review":"يترك مراجِع تعليقات على الأسطر ويطلب تغييرات.","update":"سجّل الإصلاحات في commits على <code dir=\"ltr\">projects-filter</code> ونفّذ <code dir=\"ltr\">git push</code>؛ فيتحدّث الـ pull request.","merge":"بعد الموافقة، انقر Squash and merge، ثم Delete branch.","cleanup":"محليًا: <code dir=\"ltr\">git switch main</code>، ثم <code dir=\"ltr\">git pull</code>، ثم <code dir=\"ltr\">git branch -D projects-filter</code>."}},"words":719,"readMinutes":4}