{"id":"l-git-1-2","courseId":"git-github","lang":"ar","kind":"lesson","summary":"ثبّت Git، واضبط اسمك وبريدك والفرع الافتراضي والمحرّر مرة واحدة، ثم حوّل مجلد موقعك الشخصي إلى repository وسجّل أول commit فيه.","html":"<p>قبل أن يسجّل Git أي شيء، يحتاج إلى معلومتين عنك وبعض التفضيلات. تضبطها مرة واحدة لكل حاسوب، وتؤثّر بهدوء في كل commit تنشئه لسنوات. عشر دقائق الآن توفّر عليك مئات الـ commits المنسوبة إلى «مجهول» أو إلى عنوان بريد لم تعد تملكه.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">ثبّت Git</h2>\n<p>تحقّق أولًا هل Git مثبّت لديك:</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:#0550AE;--shiki-dark:#79C0FF\"> --version</span></span></code></pre></div>\n<p>إن رأيت شيئًا مثل <code dir=\"ltr\">git version 2.51.0</code> فأنت جاهز؛ أي إصدار 2.4x أو أحدث يناسب هذا الكورس. وإن لم يكن مثبّتًا:</p>\n<ul>\n<li><strong>macOS:</strong> تشغيل <code dir=\"ltr\">git --version</code> يعرض عليك تثبيت Xcode Command Line Tools، وهي تتضمّن Git. وإن كنت تستخدم Homebrew، فالأمر <code dir=\"ltr\">brew install git</code> يمنحك إصدارًا أحدث.</li>\n<li><strong>Windows:</strong> ثبّت Git for Windows من git-scm.com. أبقِ الخيارات الافتراضية؛ فهي تتضمّن Git Bash (طرفية يعمل فيها كل أمر في هذا الكورس) و Git Credential Manager الذي ستستخدمه في القسم الثالث.</li>\n<li><strong>Linux:</strong> استخدم مدير الحزم لديك، مثلًا <code dir=\"ltr\">sudo apt install git</code> على Ubuntu أو <code dir=\"ltr\">sudo dnf install git</code> على Fedora.</li>\n</ul>\n<h2 id=\"sec-2\" tabindex=\"-1\">عرّف Git بنفسك</h2>\n<p>يخزّن كل commit اسم المؤلف وبريده. اضبطهما على المستوى العام (global)، أي لحساب المستخدم الخاص بك على هذا الجهاز:</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\"> config</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --global</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> user.name</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"Maya Okafor\"</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">git</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> config</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --global</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> user.email</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"maya.okafor@example.com\"</span></span></code></pre></div>\n<p>البريد أهمّ مما يبدو. يحدّد GitHub الصورة والملف الشخصي اللذين يظهران بجانب الـ commit بمطابقة البريد المخزّن داخله مع العناوين المسجّلة في حسابات GitHub. وإن كنت تفضّل ألّا تنشر عنوانك الحقيقي، فإن GitHub يعطي كل حساب عنوان noreply بالشكل <code dir=\"ltr\">12345678+username@users.noreply.github.com</code> (تجده في Settings ثم Emails)، ويمكنك استخدامه بدلًا من عنوانك.</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>في إعدادات البريد على GitHub، فعّل “Keep my email addresses private” واستخدم عنوان noreply في <code dir=\"ltr\">user.email</code>. تبقى الـ commits مرتبطة بملفك الشخصي، ويبقى بريدك الحقيقي بعيدًا عن كل repository عام تلمسه.</p>\n</aside>\n<h2 id=\"sec-3\" tabindex=\"-1\">ثلاثة تفضيلات تستحق الضبط الآن</h2>\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\"> config</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --global</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> init.defaultBranch</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\"> config</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --global</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> core.editor</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"code --wait\"</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">git</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> config</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --global</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --list</span></span></code></pre></div>\n<ul>\n<li><code dir=\"ltr\">init.defaultBranch main</code> يسمّي الفرع الأول في كل repository جديد <code dir=\"ltr\">main</code>، وهو ما يطابق ما ينشئه GitHub. ودونه، ما زالت إصدارات Git 2.x تسمّي الفرع الأول <code dir=\"ltr\">master</code> وتطبع تلميحًا طويلًا عن ذلك.</li>\n<li><code dir=\"ltr\">core.editor</code> هو البرنامج الذي يفتحه Git حين يحتاج منك كتابة نص، مثل رسالة الـ commit. كثير من التثبيتات تستخدم Vim افتراضيًا، وهذا يفاجئ من لا يعرفه. <code dir=\"ltr\">code --wait</code> يستخدم VS Code (والخيار <code dir=\"ltr\">--wait</code> يُبقي Git منتظرًا حتى تغلق التبويب)؛ و <code dir=\"ltr\">nano</code> خيار بسيط داخل الطرفية.</li>\n<li><code dir=\"ltr\">--list</code> يطبع ما ضبطته لتتحقّق من الأخطاء الإملائية.</li>\n</ul>\n<p>تُحفظ هذه الإعدادات في ملف نصي عادي هو <code dir=\"ltr\">~/.gitconfig</code>. والإعداد الذي يُضبط دون <code dir=\"ltr\">--global</code> من داخل repository ما ينطبق على ذلك الـ repository وحده ويتقدّم على الإعداد العام. هذا مفيد إن أردت بريد العمل في repositories العمل وبريدك الشخصي في كل مكان آخر.</p>\n<h2 id=\"sec-4\" tabindex=\"-1\">أنشئ الـ repository</h2>\n<p>أنشئ مجلدًا لموقعك الشخصي وحوّله إلى repository (مستودع):</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\">mkdir</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> portfolio</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">cd</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> portfolio</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">git</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> init</span></span></code></pre></div>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"text\" data-index=\"4\"><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>Initialized empty Git repository in /Users/maya/portfolio/.git/</code></pre></div>\n<p>مجلد <code dir=\"ltr\">.git</code> المخفي هذا هو الـ repository: كل commit وكل فرع وكل إعداد لهذا المشروع يعيش داخله. أما الملفات التي تعدّلها فتوجد بجانبه. لا تعدّل أي شيء داخل <code dir=\"ltr\">.git</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>تشغيل git init في المجلد الخطأ</span></p>\n<p>إن شغّلت <code dir=\"ltr\">git init</code> في مجلدك الرئيسي، يغلّف Git كل ملف تملكه، ويعرض <code dir=\"ltr\">git status</code> مجلدات Desktop و Downloads و Documents على أنها untracked. تحقّق من مكانك بـ <code dir=\"ltr\">pwd</code> قبل <code dir=\"ltr\">git init</code>. وإن حدث ذلك بالفعل، احذف المجلد الشارد بـ <code dir=\"ltr\">rm -rf ~/.git</code> (هذا المجلد وحده، وفقط إن لم تنشئ فيه أي commit)، ثم شغّل <code dir=\"ltr\">git init</code> داخل <code dir=\"ltr\">portfolio</code>.</p>\n</aside>\n<h2 id=\"sec-5\" tabindex=\"-1\">أنشئ أول commit</h2>\n<p>أنشئ <code dir=\"ltr\">index.html</code> بصفحة بسيطة:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"html\" data-index=\"5\"><div class=\"code-head\"><span class=\"code-title\">index.html</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:#1F2328;--shiki-dark:#E6EDF3\">&#x3C;!</span><span style=\"color:#116329;--shiki-dark:#7EE787\">doctype</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> html</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">html</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> lang</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"en\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">head</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">meta</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> charset</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"utf-8\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">title</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Maya Okafor&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">title</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">head</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">body</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">h1</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Maya Okafor&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">h1</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">p</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Front-end developer in progress.&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">p</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">body</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">html</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span></code></pre></div>\n<p>الآن اسأل Git عمّا يراه:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"bash\" data-index=\"6\"><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\"> status</span></span></code></pre></div>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"text\" data-index=\"7\"><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>On branch main\n\nNo commits yet\n\nUntracked files:\n  (use &quot;git add &lt;file&gt;...&quot; to include in what will be committed)\n\tindex.html\n\nnothing added to commit but untracked files present (use &quot;git add&quot; to track)</code></pre></div>\n<p><strong>Untracked</strong> تعني أن Git يرى الملف لكنه لم يسجّله قط. إنشاء الـ commit خطوتان: اختر ما يدخل فيه، ثم سجّله.</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"bash\" data-index=\"8\"><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\"> add</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> index.html</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\"> -m</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"Add home page\"</span></span></code></pre></div>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"text\" data-index=\"9\"><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>[main (root-commit) 3f9c2a1] Add home page\n 1 file changed, 11 insertions(+)\n create mode 100644 index.html</code></pre></div>\n<p>اقرأ هذا الناتج: أنت على <code dir=\"ltr\">main</code>، وهذا هو <strong>الـ root commit</strong> (الأول، ولا أب له)، ومعرّفه المختصر <code dir=\"ltr\">3f9c2a1</code>. سيختلف معرّفك، لأن المعرّف hash مشتقّ من المحتوى واسمك والوقت والأب. شغّل <code dir=\"ltr\">git log</code> لترى الـ commit بمعرّفه الكامل ومؤلفه وتاريخه.</p>\n<p>لماذا خطوتان بدل واحدة؟ لأن المسافة بين <code dir=\"ltr\">add</code> و <code dir=\"ltr\">commit</code> هي حيث تقرّر ما الذي ينتمي بعضه إلى بعض. لهذه المسافة اسم، الـ staging area (منطقة التجهيز)، وهي موضوع الدرس التالي.</p>\n","toc":[{"id":"sec-1","text":"ثبّت Git","level":2},{"id":"sec-2","text":"عرّف Git بنفسك","level":2},{"id":"sec-3","text":"ثلاثة تفضيلات تستحق الضبط الآن","level":2},{"id":"sec-4","text":"أنشئ الـ repository","level":2},{"id":"sec-5","text":"أنشئ أول commit","level":2}],"takeaways":["شغّل <code dir=\"ltr\">git config --global</code> مرة واحدة لكل جهاز لضبط <code dir=\"ltr\">user.name</code> و <code dir=\"ltr\">user.email</code> و <code dir=\"ltr\">init.defaultBranch</code> و <code dir=\"ltr\">core.editor</code>؛ ويخزّنها Git في <code dir=\"ltr\">~/.gitconfig</code>.","بريد الـ commit هو ما يحدّد حساب GitHub الذي يُنسب إليه الـ commit، لذا استخدم بريدًا يعرفه حسابك، مثل عنوان noreply.","<code dir=\"ltr\">git init</code> ينشئ مجلدًا مخفيًا اسمه <code dir=\"ltr\">.git</code>؛ هذا المجلد هو الـ repository، وحذفه يحذف السجلّ كله.","الـ commit خطوتان، <code dir=\"ltr\">git add</code> لاختيار ما يدخل فيه و <code dir=\"ltr\">git commit -m</code> لتسجيله مع رسالة."],"further":[{"title":"First-Time Git Setup (Pro Git)","url":"https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup"},{"title":"git config reference","url":"https://git-scm.com/docs/git-config"},{"title":"Setting your commit email address","url":"https://docs.github.com/en/account-and-profile/how-tos/email-preferences/setting-your-commit-email-address"}],"quiz":[{"q":"<p>ضبطت <code dir=\"ltr\">user.email</code> على عنوان عمل قديم. تُرفع الـ commits بلا مشكلة، لكن GitHub يعرضها بصورة رمادية غير مرتبطة بأي حساب. لماذا؟</p>","options":[{"text":"فشل الرفع بصمت و GitHub يعرض نسخة مخزّنة مؤقتًا.","why":"الـ commits موجودة على GitHub، إذن نجح الرفع. مشكلة الصورة تتعلّق بمن تقول الـ commits إنه كتبها."},{"text":"لا يربط GitHub إلا الـ commits التي أُنشئت عبر موقعه.","why":"يربط GitHub الـ commits القادمة من أي أداة. فهو يطابق البريد داخل كل commit مع عناوين البريد المسجّلة في الحسابات."},{"text":"عليك تشغيل <code dir=\"ltr\">git init</code> من جديد لتحديث المؤلف.","why":"تشغيل <code dir=\"ltr\">git init</code> على repository موجود لا يغيّر شيئًا في نسبة الـ commits. تُكتب بيانات المؤلف داخل كل commit لحظة إنشائه."},{"text":"يطابق GitHub البريد المخزّن في كل commit مع حساب ما، وهذا العنوان غير مسجّل في حسابك.","why":"صحيح. أضف العنوان إلى حسابك على GitHub، أو اضبط <code dir=\"ltr\">user.email</code> على عنوان يعرفه (مثل عنوان noreply الخاص بك) للـ commits القادمة."}],"answer":3},{"q":"<p>تشغّل <code dir=\"ltr\">git commit</code> دون <code dir=\"ltr\">-m</code> فيُفتح محرّر بملء الشاشة لا تعرفه. ما الذي حدث؟</p>","options":[{"text":"تعطّل Git وفتح سجلّ الأخطاء الخاص به.","why":"لم يتعطّل شيء. يطلب Git رسالة، ودون <code dir=\"ltr\">-m</code> يفتح المحرّر المضبوط لديك ليجمعها منك."},{"text":"فتح Git المحرّر المحدّد في <code dir=\"ltr\">core.editor</code> (غالبًا Vim افتراضيًا) لتكتب رسالة الـ commit.","why":"صحيح. اكتب الرسالة واحفظ وأغلق. واضبط <code dir=\"ltr\">core.editor</code> على محرّر تعرفه، مثل <code dir=\"ltr\">code --wait</code> أو <code dir=\"ltr\">nano</code>، لتتجنّب المفاجآت."},{"text":"أُنشئ الـ commit برسالة فارغة والمحرّر يعرض الـ diff.","why":"يرفض Git الرسالة الفارغة ويُلغي الـ commit. المحرّر هو المكان الذي تُكتب فيه الرسالة قبل تسجيل أي شيء."}],"answer":1},{"q":"<p>شغّلت <code dir=\"ltr\">git init</code> في مجلد المستخدم الرئيسي بالخطأ، والآن يظهر كل مجلد على أنه “untracked”. ما الإصلاح الصحيح؟</p>","options":[{"text":"شغّل <code dir=\"ltr\">git init</code> مرة أخرى داخل مجلد <code dir=\"ltr\">portfolio</code>؛ فالـ repository الأحدث يحلّ محلّ القديم.","why":"سيبقى الـ repository الموجود في المجلد الرئيسي قائمًا ويغلّف كل شيء. الـ repositories المتداخلة تزيد الأمور ارتباكًا ولا تقلّله."},{"text":"شغّل <code dir=\"ltr\">git reset --hard</code> في مجلدك الرئيسي.","why":"هذا الأمر يعمل على الـ commits والـ working tree. قد يتلف تغييرات، ويترك مجلد <code dir=\"ltr\">.git</code> في مكانه على أي حال."},{"text":"احذف مجلد <code dir=\"ltr\">.git</code> من مجلدك الرئيسي، ثم شغّل <code dir=\"ltr\">git init</code> داخل <code dir=\"ltr\">portfolio</code>.","why":"صحيح. مجلد <code dir=\"ltr\">.git</code> هو الـ repository. حذف المجلد الشارد (لا سجلّ فيه تحتاجه) يلغي الخطأ تمامًا."}],"answer":2},{"q":"<p>أيّ أمر يجعل كل repository جديد على جهازك يبدأ على فرع اسمه <code dir=\"ltr\">main</code>؟</p>","options":[{"text":"<code dir=\"ltr\">git config --global init.defaultBranch main</code>","why":"صحيح. يحدّد <code dir=\"ltr\">init.defaultBranch</code> اسم الفرع الأول الذي ينشئه <code dir=\"ltr\">git init</code>."},{"text":"<code dir=\"ltr\">git branch --default main</code>","why":"لا يوجد خيار <code dir=\"ltr\">--default</code> في <code dir=\"ltr\">git branch</code>. الأسماء الافتراضية تأتي من الإعدادات، لا من أمر خاص بالفروع."},{"text":"<code dir=\"ltr\">git config core.branch main</code>","why":"<code dir=\"ltr\">core.branch</code> ليس إعدادًا حقيقيًا، ودون <code dir=\"ltr\">--global</code> لن يؤثّر إلا في الـ repository الحالي على أي حال."},{"text":"<code dir=\"ltr\">git init --main</code>","why":"لدى <code dir=\"ltr\">git init</code> الخيار <code dir=\"ltr\">-b &lt;name&gt;</code> (أو <code dir=\"ltr\">--initial-branch</code>) لـ repository واحد، لكن لا يوجد خيار <code dir=\"ltr\">--main</code>، ولن يؤثّر في الـ repositories المستقبلية."}],"answer":0}],"exercise":{"kind":"fill","language":"bash","template":"git config --global user.email \"maya.okafor@example.com\"\ngit config --global {{0}} main\n\nmkdir portfolio && cd portfolio\ngit {{1}}\ngit add index.html\ngit commit {{2}} \"Add home page\"","blanks":[{"answers":["init.defaultBranch","init.defaultbranch"]},{"answers":["init"]},{"answers":["-m","--message"]}],"title":"أعِدّ الموقع الشخصي وسجّل أول commit","prompt":"<p>املأ الفراغات بحيث يبدأ كل repository جديد على <code dir=\"ltr\">main</code>، ويصبح مجلد <code dir=\"ltr\">portfolio</code> مستودعًا، ويُسجَّل commit الصفحة الرئيسية مع كتابة الرسالة في سطر الأوامر نفسه (دون فتح محرّر).</p>\n","hints":["اسم الفرع الافتراضي إعداد ضمن مجموعة <code dir=\"ltr\">init</code> في الإعدادات.","الأمر الذي ينشئ مجلد <code dir=\"ltr\">.git</code> يحمل اسم مجموعة الإعدادات نفسها.","الخيار الذي يمرّر رسالة الـ commit مباشرة حرف واحد، اختصار لكلمة message."],"explanation":"<p><code dir=\"ltr\">git config --global init.defaultBranch main</code> يجعل <code dir=\"ltr\">git init</code> يسمّي فرعه الأول <code dir=\"ltr\">main</code>. و <code dir=\"ltr\">git init</code> ينشئ مجلد <code dir=\"ltr\">.git</code> الذي يحتوي الـ repository. و <code dir=\"ltr\">git commit -m &quot;Add home page&quot;</code> يسجّل اللقطة المجهّزة مع الرسالة مباشرة؛ وإن حذفت <code dir=\"ltr\">-m</code> يفتح Git المحرّر المحدّد في <code dir=\"ltr\">core.editor</code> ليطلبها منك.</p>\n","checkLabels":{}},"words":625,"readMinutes":4}