{"id":"l-git-3-4","courseId":"git-github","lang":"ar","kind":"lesson","summary":"خطّط العمل بالـ issues والـ labels ولوحة GitHub Project، ثم ساهم في repository لا تملكه بعمل fork له، وتتبّع الـ upstream، وفتح pull request من الـ fork الخاص بك.","html":"<p>صار الموقع الشخصي على GitHub، وتصل التغييرات إلى <code dir=\"ltr\">main</code> عبر الـ pull requests. يبقى سؤالان. كيف تتابع ما عليك فعله بعد ذلك، دون ورقة لاصقة على شاشتك؟ وكيف تساهم في مشروع لا تملكه، لا تستطيع فيه حتى رفع فرع؟ يجيب GitHub عن الأول بالـ issues والـ Projects، وعن الثاني بالـ forks.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">الـ Issues: عمل يمكنك الإشارة إليه</h2>\n<p>الـ <strong>issue</strong> قطعة عمل متتبَّعة: خطأ، أو فكرة feature، أو سؤال. يحصل كل منها على رقم مشترك مع الـ pull requests (<code dir=\"ltr\">#12</code>)، وسلسلة نقاش، وبيانات وصفية:</p>\n<ul>\n<li><strong>Labels</strong> (الوسوم) تصنّفها: <code dir=\"ltr\">bug</code> و <code dir=\"ltr\">enhancement</code> و <code dir=\"ltr\">documentation</code> و <code dir=\"ltr\">good first issue</code>.</li>\n<li><strong>Assignees</strong> (المكلَّفون) يبيّنون من يعمل عليها.</li>\n<li><strong>Milestones</strong> (المحطّات) تجمع الـ issues نحو هدف، مثل “Launch v1”.</li>\n</ul>\n<p>في موقعك الشخصي، اكتب قائمة المهام على شكل issues: “Projects page: filter by tag (#12)” و “Footer overlaps content on mobile (#13)”. ثم يسمّي كل pull request الـ issue الخاصة به بـ <code dir=\"ltr\">Closes #12</code>، فيُغلقها الدمج، وبعد ستة أشهر يستطيع أي شخص أن يتتبّع الأثر من سطر كود إلى الـ commit، فالـ pull request، فالنقاش، فالسبب الأصلي.</p>\n<p>تقرير الخطأ الجيد فيه خطوات لإعادة إنتاجه، وما كنت تتوقّعه، وما حدث، والمتصفّح أو الإصدار. ويمكن للـ repositories أن تضيف قوالب issues في <code dir=\"ltr\">.github/ISSUE_TEMPLATE/</code> ليملأ المبلِّغون هذه الأقسام تلقائيًا.</p>\n<h2 id=\"sec-2\" tabindex=\"-1\">الـ Projects: اللوحة فوق الـ issues</h2>\n<p>الـ <strong>GitHub Project</strong> عرض تخطيطي فوق الـ issues والـ pull requests، وقد تكون من عدة repositories. يبدأ جدولًا يشبه جداول البيانات؛ تضيف إليه حقولًا مخصّصة مثل Status و Priority و Size و Iteration، وتنتقل بين تخطيطات <strong>table</strong> (جدول) و <strong>board</strong> (لوحة بأعمدة بحسب Status، أي لوحة kanban المألوفة) و <strong>roadmap</strong> (العناصر على خط زمني). ويمكن لسير العمل المدمج (built-in workflows) أن ينقل العناصر تلقائيًا، مثلًا إلى Done حين تُغلق issue أو يُدمج pull request.</p>\n<p>لموقع شخصي تعمل عليه وحدك، تكفي لوحة فيها Todo و In progress و Done. أما في الفريق، فالـ Project هو المكان الذي تجري فيه نقاشات التخطيط، والـ issues تحمل التفاصيل.</p>\n<h2 id=\"sec-3\" tabindex=\"-1\">الـ Forks: المساهمة دون صلاحية كتابة</h2>\n<p>لنقل إنك وجدت خطأً إملائيًا في وثائق مكتبة ثيمات مفتوحة المصدر، <code dir=\"ltr\">open-themes/vite-themes</code>. تستطيع استنساخها، لكنك لا تستطيع الرفع إليها: لست متعاونًا (collaborator) فيها، و <code dir=\"ltr\">git push</code> يفشل بخطأ صلاحيات. هذا ما تحلّه الـ forks.</p>\n<p>الـ <strong>fork</strong> نسختك الخاصة من الـ repository على GitHub، تحت حسابك: <code dir=\"ltr\">maya-okafor/vite-themes</code>. تستطيع أن ترفع إليها أي شيء. وحين يجهز تغييرك، تفتح pull request من فرع في الـ fork الخاص بك إلى الـ repository الأصلي، الذي يُسمّى بحسب العُرف <strong>upstream</strong>.</p>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 700 290\" role=\"img\" aria-labelledby=\"l-git-3-4-t1\"><defs><marker id=\"arrow-l-git-3-4-1\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\"><path d=\"M0 0 L10 5 L0 10 z\" class=\"d-arrowhead\"/></marker></defs>\n  <title id=\"l-git-3-4-t1\">ثلاثة repositories على شكل مثلث. أعلى اليسار: upstream، أي open-themes/vite-themes على GitHub. أعلى اليمين: origin، أي الـ fork الخاص بك maya-okafor/vite-themes على GitHub. في الأسفل: نسختك المحلية. زر Fork ينسخ upstream إلى origin. نسختك المحلية تجلب من upstream وترفع الفروع إلى origin. والـ pull request يذهب من origin إلى upstream.</title>\n  <rect class=\"d-box-primary\" x=\"20\" y=\"20\" width=\"250\" height=\"70\" rx=\"12\"/>\n  <text class=\"d-label-strong\" x=\"145\" y=\"48\" text-anchor=\"middle\">upstream</text>\n  <text class=\"d-code\" x=\"145\" y=\"72\" text-anchor=\"middle\">open-themes/vite-themes</text>\n  <rect class=\"d-box-accent\" x=\"430\" y=\"20\" width=\"250\" height=\"70\" rx=\"12\"/>\n  <text class=\"d-label-strong\" x=\"555\" y=\"48\" text-anchor=\"middle\">origin (الـ fork الخاص بك)</text>\n  <text class=\"d-code\" x=\"555\" y=\"72\" text-anchor=\"middle\">maya-okafor/vite-themes</text>\n  <rect class=\"d-box\" x=\"225\" y=\"200\" width=\"250\" height=\"70\" rx=\"12\"/>\n  <text class=\"d-label-strong\" x=\"350\" y=\"228\" text-anchor=\"middle\">نسختك المحلية</text>\n  <text class=\"d-code\" x=\"350\" y=\"252\" text-anchor=\"middle\">~/code/vite-themes</text>\n  <path class=\"d-arrow\" d=\"M270 40 L426 40\" marker-end=\"url(#arrow-l-git-3-4-1)\"/>\n  <text class=\"d-label-muted\" x=\"348\" y=\"32\" text-anchor=\"middle\">Fork</text>\n  <path class=\"d-arrow d-dashed\" d=\"M430 75 L274 75\" marker-end=\"url(#arrow-l-git-3-4-1)\"/>\n  <text class=\"d-label-muted\" x=\"352\" y=\"100\" text-anchor=\"middle\">pull request</text>\n  <path class=\"d-arrow\" d=\"M120 92 L250 196\" marker-end=\"url(#arrow-l-git-3-4-1)\"/>\n  <text class=\"d-code\" x=\"30\" y=\"160\">git fetch upstream</text>\n  <path class=\"d-arrow\" d=\"M450 196 L560 94\" marker-end=\"url(#arrow-l-git-3-4-1)\"/>\n  <text class=\"d-code\" x=\"520\" y=\"160\">git push origin</text>\n</svg><figcaption>سير عمل الـ fork: اجلب من upstream، وارفع إلى origin، ثم pull request عائد</figcaption></figure>\n<p>هذا هو الروتين كاملًا:</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:#6E7781;--shiki-dark:#8B949E\"># 1. Click Fork on github.com/open-themes/vite-themes, then clone YOUR fork</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">git</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> clone</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> git@github.com:maya-okafor/vite-themes.git</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">cd</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> vite-themes</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># 2. Remember where the original lives</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">git</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> remote</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> add</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> upstream</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> https://github.com/open-themes/vite-themes.git</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">git</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> remote</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> -v</span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">    # origin = your fork, upstream = the original</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># 3. Work on a branch, never on main</span></span>\n<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\"> fix-readme-typo</span></span>\n<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\"> \"Fix typo in installation steps\"</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\"> fix-readme-typo</span></span></code></pre></div>\n<p>بعدها يعرض GitHub خيار “Compare &amp; pull request” على الـ fork الخاص بك. تحقّق من أن الـ repository الأساسي هو <code dir=\"ltr\">open-themes/vite-themes</code> وأن الفرع الأساسي هو <code dir=\"ltr\">main</code> الخاص بهم. واختصار الخطوتين 1 و 2 في الـ CLI هو <code dir=\"ltr\">gh repo fork open-themes/vite-themes --clone</code>، وهو يُعدّ لك أيضًا الـ remote المسمّى <code dir=\"ltr\">upstream</code>.</p>\n<p>اترك “Allow edits by maintainers” محدَّدًا حين تفتح الـ pull request. هذا يسمح للمشرفين برفع إصلاحات صغيرة إلى فرعك بدل أن يطلبوا منك كل تعديل بسيط.</p>\n<h2 id=\"sec-4\" tabindex=\"-1\">إبقاء الـ fork محدَّثًا</h2>\n<p>الأصل يواصل التقدّم. أدخِل تغييراته إلى الـ fork الخاص بك قبل أن تبدأ كل فرع جديد:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"bash\" data-index=\"1\"><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\"> fetch</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> upstream</span></span>\n<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\"> merge</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --ff-only</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> upstream/main</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:#0A3069;--shiki-dark:#A5D6FF\"> origin</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> main</span></span></code></pre></div>\n<p>لأنك لا تنشئ commits أبدًا على <code dir=\"ltr\">main</code> في الـ fork، فهذا دائمًا fast-forward. زر <strong>Sync fork</strong> في صفحة الـ fork على GitHub، أو <code dir=\"ltr\">gh repo sync maya-okafor/vite-themes</code>، يحدّث النسخة الموجودة على GitHub؛ ولا يزال عليك أن تسحبها محليًا. (أما <code dir=\"ltr\">gh repo sync</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>العمل على main في الـ fork</span></p>\n<p>إن أنشأت commits على <code dir=\"ltr\">main</code> في الـ fork الخاص بك، يصبح الـ pull request مربوطًا بـ <code dir=\"ltr\">main</code>، وكل commit لاحق ينضمّ إليه، وتتوقّف المزامنة مع الـ upstream عن كونها fast-forward. أبقِ <code dir=\"ltr\">main</code> مرآة نظيفة للـ upstream، وأعطِ كل مساهمة فرعها الخاص.</p>\n</aside>\n<h2 id=\"sec-5\" tabindex=\"-1\">أن تكون مساهمًا مرحَّبًا به</h2>\n<p>قبل كتابة الكود، اقرأ ملف <strong>README</strong> الخاص بالمشروع وملف <strong>CONTRIBUTING.md</strong> (الإعداد، والاختبارات، والأسلوب، وهل تُشترط issue أولًا) ومدوّنة السلوك. ابحث في الـ issues والـ pull requests الموجودة؛ فربما يكون خطؤك معروفًا أو مُصلَحًا. ولأي شيء أكبر من خطأ إملائي، افتح issue أو علّق على واحدة، واتّفق مع المشرفين على الأسلوب قبل كتابة الكود. والـ issues التي تحمل الوسم <code dir=\"ltr\">good first issue</code> مختارة عمدًا كنقاط بداية.</p>\n<p>ثم أبقِ الـ pull request صغيرًا، واتبع أعراف المشروع حتى حيث كنت ستختار خلافها، وتأكّد من نجاح اختباراته، وأجب عن تعليقات المراجعة بصبر. المشرفون متطوّعون في الغالب. والـ pull request المركّز والموصوف جيدًا الذي يسهل قول «نعم» له هو أفضل تعريف بنفسك تستطيع تقديمه.</p>\n<p>بهذا تكتمل أدوات التعاون. في القسم الأخير ستكتسب العادات التي تجعل كل هذا آمنًا: التراجع عن الأخطاء، وإبقاء الـ repository نظيفًا، وكتابة سجلّ يستطيع الناس قراءته، وترك الأتمتة تحرس <code dir=\"ltr\">main</code>.</p>\n","toc":[{"id":"sec-1","text":"الـ Issues: عمل يمكنك الإشارة إليه","level":2},{"id":"sec-2","text":"الـ Projects: اللوحة فوق الـ issues","level":2},{"id":"sec-3","text":"الـ Forks: المساهمة دون صلاحية كتابة","level":2},{"id":"sec-4","text":"إبقاء الـ fork محدَّثًا","level":2},{"id":"sec-5","text":"أن تكون مساهمًا مرحَّبًا به","level":2}],"takeaways":["الـ issue وحدة عمل مخطّط لها أو مشكلة مُبلَّغ عنها؛ والـ labels والمكلَّفون والـ pull request المرتبط تبيّن حالتها.","الـ GitHub Project عرض على شكل جدول أو لوحة أو خريطة طريق فوق الـ issues والـ pull requests، مع حقول مخصّصة مثل Status و Priority.","الـ fork نسختك الخاصة على GitHub من repository يملكه شخص آخر؛ ترفع إلى الـ fork الخاص بك وتفتح pull request إلى الأصل.","بحسب العُرف، <code dir=\"ltr\">origin</code> هو الـ fork الخاص بك و <code dir=\"ltr\">upstream</code> هو الأصل؛ تنفّذ fetch من <code dir=\"ltr\">upstream</code> وترفع إلى <code dir=\"ltr\">origin</code>.","قبل المساهمة، اقرأ CONTRIBUTING.md، وابحث عن issue موجودة، وأبقِ التغيير صغيرًا وعلى فرعه الخاص."],"further":[{"title":"About issues","url":"https://docs.github.com/en/issues/tracking-your-work-with-issues/learning-about-issues/about-issues"},{"title":"About Projects","url":"https://docs.github.com/en/issues/planning-and-tracking-with-projects/learning-about-projects/about-projects"},{"title":"Fork a repository","url":"https://docs.github.com/en/pull-requests/how-tos/work-with-forks/fork-a-repo"},{"title":"Syncing a fork","url":"https://docs.github.com/en/pull-requests/how-tos/work-with-forks/syncing-a-fork"}],"quiz":[{"q":"<p>استنسخت الـ fork الخاص بك من <code dir=\"ltr\">vite-themes</code>. أيّ الأوامر تجلب أحدث <code dir=\"ltr\">main</code> من المشروع الأصلي إلى <code dir=\"ltr\">main</code> في الـ fork الخاص بك؟</p>","options":[{"text":"<code dir=\"ltr\">git pull origin main</code>","why":"<code dir=\"ltr\">origin</code> هو الـ fork الخاص بك، وليست فيه الـ commits الجديدة بعد. ستسحب من النسخة المتأخّرة."},{"text":"<code dir=\"ltr\">git push upstream main</code>","why":"لا تستطيع الرفع إلى الـ repository الأصلي، والرفع يرسل الـ commits الخاصة بك بدل أن يجلب الـ commits الخاصة بهم."},{"text":"<code dir=\"ltr\">git fetch upstream</code>، ثم <code dir=\"ltr\">git switch main</code>، ثم <code dir=\"ltr\">git merge --ff-only upstream/main</code>، ثم <code dir=\"ltr\">git push origin main</code>.","why":"صحيح. اجلب من الأصل، وقدّم <code dir=\"ltr\">main</code> الخاص بك إليه بـ fast-forward، ثم حدّث الـ fork على GitHub. وزر Sync fork ينجز النصف الخاص بـ GitHub."},{"text":"استنسخ الأصل مرة أخرى بـ <code dir=\"ltr\">git clone</code> في مجلد جديد.","why":"هذا ينجح لكنه يرمي إعدادك وفروعك. أما إضافة remote باسم <code dir=\"ltr\">upstream</code> فتُبقي كل شيء في نسخة واحدة."}],"answer":2},{"q":"<p>وجدت خطأً في مكتبة مفتوحة المصدر ولديك إصلاح في ذهنك يلمس ستة ملفات. ما الذي تفعله أولًا؟</p>","options":[{"text":"افتح pull request فورًا ليرى المشرفون كودًا يعمل.","why":"التغيير الكبير غير المعلَن قد يتصادم مع خطط لا تعرفها، وقد يُغلق دون أن يُقرأ."},{"text":"راسل المشرفين بالبريد على انفراد مرفقًا الـ patch.","why":"معظم المشاريع تنسّق في issues عامة ليراها الآخرون ويساعدوا. والبريد الخاص مخصّص لتقارير الأمان فقط، إن طلب المشروع ذلك."},{"text":"أنشئ fork للمشروع وانشر نسختك المُصلَحة باسم جديد.","why":"هذا يقسم المجتمع ويترك الجميع مع الخطأ. أما المساهمة بالإصلاح في الأصل فتفيد الجميع."},{"text":"اقرأ CONTRIBUTING.md وابحث في الـ issues؛ وإن لم تجد ما يغطّي المشكلة، افتح issue تصف الخطأ والإصلاح الذي تقترحه.","why":"صحيح. الاتفاق على الأسلوب أولًا يتجنّب العمل الضائع، وكثير من المشاريع تشترط وجود issue قبل الـ pull request."}],"answer":3},{"q":"<p>ما الفرق بين الـ label والـ GitHub Project؟</p>","options":[{"text":"الـ labels تعمل على الـ pull requests فقط؛ والـ Projects تعمل على الـ issues فقط.","why":"الـ labels والـ Projects كلاهما يعملان مع الـ issues والـ pull requests."},{"text":"الـ label يوسم issue أو pull request منفردًا؛ أما الـ Project فعرض يشمل كثيرًا منها، بحقوله ولوحاته وتخطيطاته الخاصة.","why":"صحيح. الـ labels مثل <code dir=\"ltr\">bug</code> تصنّف العناصر؛ والـ Project يرتّب العناصر (حتى من عدة repositories) في جدول أو لوحة أو خريطة طريق."},{"text":"إنهما الميزة نفسها باسمين مختلفين.","why":"الـ labels وسوم بسيطة على عناصر repository واحد. أما الـ Projects فتضيف حقولًا مخصّصة وطرق عرض وأتمتة عبر العناصر."}],"answer":1},{"q":"<p>فتحت pull request من فرع <code dir=\"ltr\">main</code> في الـ fork الخاص بك. وأثناء انتظار المراجعة، بدأت إصلاحًا لا علاقة له بالأول وسجّلته في commit على <code dir=\"ltr\">main</code> أيضًا. ماذا يحدث؟</p>","options":[{"text":"يظهر الإصلاح غير المرتبط في الـ pull request المفتوح، لأن الـ pull request يتتبّع <code dir=\"ltr\">main</code> الخاص بك.","why":"صحيح. الـ pull request يعرض كل commit على فرعه. أعطِ كل مساهمة فرعها الخاص لتبقى التغييرات منفصلة."},{"text":"لا شيء؛ فقد جمّد الـ pull request الـ commits الخاصة به حين فتحته.","why":"الـ pull requests تتبع فروعها، ولهذا يحدّثها الرفع إلى الفرع."},{"text":"يرفض GitHub الرفع لأن هناك pull request مفتوحًا.","why":"الـ pull requests المفتوحة لا تقفل فروعها. ينجح الرفع ويكبر الـ pull request."},{"text":"يذهب الـ commit الجديد إلى الـ repository الأصلي مباشرة.","why":"ليست لديك صلاحية الكتابة على الأصل. لا شيء يصل إليه إلا عبر pull request مدموج."}],"answer":0}],"exercise":{"kind":"choice","multiple":false,"options":["a","b","c","d"],"correct":["d"],"title":"ساهم بإصلاح لا تستطيع رفعه","prompt":"<p>استنسخت <code dir=\"ltr\">open-themes/vite-themes</code> مباشرة، وأصلحت خطأً إملائيًا على فرع اسمه <code dir=\"ltr\">fix-readme-typo</code>، وشغّلت <code dir=\"ltr\">git push -u origin fix-readme-typo</code>. فأجاب GitHub:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"text\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">Text</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>ERROR: Permission to open-themes/vite-themes.git denied to maya-okafor.\nfatal: Could not read from remote repository.</code></pre></div>\n<p>ما الطريقة الصحيحة لإيصال إصلاحك إلى المشرفين دون إعادة العمل؟</p>\n","hints":["الخطأ لا يتعلّق بمفتاح SSH الخاص بك؛ فـ GitHub يعرف تمامًا من أنت.","تحتاج إلى نسخة من الـ repository على GitHub مسموح لك بالرفع إليها.","نسختك المحلية الحالية تستطيع التواصل مع أكثر من remote."],"explanation":"<p>ليست لديك صلاحية الكتابة على <code dir=\"ltr\">open-themes/vite-themes</code>، لذا لن تجعل أي بيانات اعتماد هذا الرفع ينجح. أنشئ له fork على GitHub، فيُنشأ <code dir=\"ltr\">maya-okafor/vite-themes</code>. وفي نسختك المحلية الحالية، أعد تسمية <code dir=\"ltr\">origin</code> الحالي إلى <code dir=\"ltr\">upstream</code> (<code dir=\"ltr\">git remote rename origin upstream</code>) وأضف الـ fork الخاص بك باسم <code dir=\"ltr\">origin</code> (<code dir=\"ltr\">git remote add origin git@github.com:maya-okafor/vite-themes.git</code>). ثم نفّذ <code dir=\"ltr\">git push -u origin fix-readme-typo</code> وافتح pull request من فرع الـ fork إلى <code dir=\"ltr\">main</code> في الأصل. ويُعاد استخدام الـ commit الخاص بك كما هو.</p>\n","checkLabels":{},"optionText":{"a":{"text":"ولّد مفتاح SSH جديدًا وأضفه إلى حسابك، ثم ارفع مجددًا.","why":"الرسالة تذكر اسم المستخدم الخاص بك، إذن نجحت المصادقة. المشكلة في الصلاحية: لست متعاونًا (collaborator) في ذلك الـ repository."},"b":{"text":"شغّل <code dir=\"ltr\">git push --force -u origin fix-readme-typo</code>.","why":"القوة تغيّر طريقة الكتابة فوق الفرع، لا كونك مسموحًا لك بالكتابة. سيظل الرفع مرفوضًا."},"c":{"text":"راسل المشرفين واطلب منهم إضافتك كمتعاون لتستطيع رفع فرعك.","why":"لا يمنح المشرفون صلاحية الكتابة من أجل إصلاح خطأ إملائي. والـ forks موجودة لكي يستطيع أي شخص المساهمة دونها."},"d":{"text":"أنشئ له fork على GitHub، واجعل الأصل <code dir=\"ltr\">upstream</code> والـ fork الخاص بك <code dir=\"ltr\">origin</code> في هذه النسخة، وارفع الفرع إلى الـ fork، وافتح pull request إلى الأصل.","why":"صحيح. الـ fork الخاص بك repository تستطيع الرفع إليه، والـ pull request منه هو الطريقة التي تصل بها التغييرات إلى مشروع لا تملكه."}}},"words":747,"readMinutes":4}