Français English

وحدة إضافية · Git

Git: احفظ عملك وشاركه، دون أن تفقد أي شيء أبداً

هذه هي وحدة Git من دورة Next.js العملية، مترجمة إلى العربية. ستتعلّم كيف تحوّل مشروعك إلى مستودع Git، وتحفظ عملك بشكل نظيف، وترفعه إلى GitHub، وماذا تكتب عندما ينكسر شيء. لا حاجة لأي خبرة في الطرفية (Terminal) أكثر مما علّمتك الدورة.

3 أوامر تكفيك في 90% من الوقت تمرين واحد موجّه بالخطوات لا حاجة لخبرة سابقة

الدورة الكاملة

هذه الصفحة تحتوي على وحدة Git فقط. الدورة الكاملة (14 فصلاً حول Next.js) متوفّرة بلغتين: بالفرنسية وبالإنجليزية. جميع أسماء الأوامر والملفّات مكتوبة بالحروف اللاتينية كما ستراها تماماً على شاشتك.

محتويات وحدة Git

وحدة إضافية · Git

Git: احفظ عملك وشاركه، دون أن تفقد أي شيء

الهدف: تحويل مشروع إلى مستودع Git، وعمل نقاط حفظ نظيفة (تُسمّى «commits»)، وإرسالها إلى GitHub، ومعرفة ماذا تكتب عندما ينكسر شيء.

هذه الوحدة إضافية، لكنها في أي فريق عمل حقيقي ليست اختيارية: بها يحفظ الجميع أكوادهم ويتشاركونها. الخبر السار أنّ 90% من الوقت لن تستعمل سوى ثلاثة أوامر. نبدأ بالفكرة، ثم نثبّت البرنامج، ثم نبني العادة.

Git 1 · ما هو Git، في فكرة واحدة

أنت تعرف الفكرة أصلاً دون أن تدري. لا بدّ أنك أنشأت يوماً ملفّاً باسم rapport_final.docx، ثم rapport_final_v2.docx، ثم rapport_final_v2_final_HAQAN.docx. كانت تلك طريقة يدوية وفوضوية وهشّة للاحتفاظ بنسخ من عملك.

Git يفعل هذا بالضبط، لكن بشكل صحيح. فكّر في نقاط الحفظ (checkpoints) في لعبة فيديو: قبل مرحلة صعبة، تحفظ. إذا ساءت الأمور، تُعيد تحميل آخر نقطة حفظ ولا تفقد شيئاً. Git يمنح مشروعك نقاط الحفظ هذه. كل نقطة حفظ تُسمّى commit: صورة لجميع ملفّاتك في لحظة معيّنة، مع ملصق صغير يصف ما فعلته للتوّ.

التعريف في جملة واحدة

Git هو آلة زمن لمشروعك: يسجّل صورة لملفّاتك متى قرّرت أنت، حتى تستطيع دائماً الرجوع إلى الوراء، والمقارنة، والعمل مع أشخاص آخرين دون أن يمحو أحدكم عمل الآخر.

لماذا يستعمله كل المحترفين، في ثلاثة أسباب ملموسة:

  • ألّا تفقد عملك أبداً. بمجرد عمل commit، يُحفر في السجلّ. حتى لو حذفت ملفّاً بالخطأ غداً، تبقى نسخة الأمس موجودة.
  • التراجع دون توتّر. كسرت شيئاً؟ ترجع إلى آخر نقطة حفظ كانت تعمل، تماماً كإعادة تحميل لعبة.
  • العمل ضمن فريق. يمكن لشخصين تعديل نفس المشروع دون تبادل الملفّات بالبريد ودون أن يمحو أحدهما عمل الآخر.

Git 2 · Git ليس هو GitHub

يخلط الناس بينهما دائماً، فلنحسم الأمر الآن. Git هو الأداة التي تعمل على حاسوبك وتقوم بنقاط الحفظ. أمّا GitHub فهو موقع إلكتروني تخزّن فيه نسخة من مشروعك على الإنترنت. الأمر أشبه بالفرق بين Word (البرنامج على جهازك) وGoogle Drive (المكان على الإنترنت حيث تحفظ المستند).

GitGitHub
ما هوأداة على حاسوبكموقع إلكتروني
وظيفتهعمل نقاط الحفظ (commits) والسجلّحفظ نسخة على الإنترنت ومشاركتها
التشبيهWord، على جهازكGoogle Drive، في السحابة
يعمل بدون إنترنت؟نعم، كل شيء محلّيلا، فهو موقع إلكتروني

يمكنك استعمال Git وحده تماماً، دون GitHub. لكن بمجرد أن ترغب في نسخة احتياطية خارج حاسوبك، أو في أن تُري كودك لشخص ما (مدرّبك مثلاً)، ترفع مشروعك إلى GitHub. توجد بدائل (GitLab وBitbucket)، وتؤدّي نفس الوظيفة؛ تستعمل هذه الدورة GitHub لأنه الأكثر انتشاراً.

Git 3 · تثبيت Git (مرّة واحدة)

مثل Node.js في الفصل الثاني، هذا تثبيت لمرّة واحدة على كل جهاز.

النظامكيفية تثبيت Git
macOSغالباً يكون Git موجوداً أصلاً. اكتب git --version في الطرفية: إن ظهر رقم، فأنت جاهز. وإلّا سيعرض عليك macOS تثبيت «أدوات سطر الأوامر» (Xcode Command Line Tools)، فاقبلها. مع Homebrew: brew install git.
Windowsحمّل المثبّت من git-scm.com وشغّله. أبقِ كل الخيارات الافتراضية (اضغط «Next» حتى النهاية). يثبّت أيضاً «Git Bash»، وهي طرفية عملية.
Linuxسطر واحد في الطرفية حسب توزيعتك: sudo apt install git (Debian/Ubuntu) أو sudo dnf install git (Fedora).

تحقّق من أنه مثبّت:

Terminalتكتب هذا
$ git --version
git version 2.43.0

ظهر رقم: ممتاز. بعد ذلك، إعدادان تقوم بهما مرّة واحدة. يخبران Git باسمك وبريدك، حتى يستطيع «توقيع» نقاط حفظك.

Terminalتكتب هذا
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"

ماذا يفعل كل أمر، ببساطة

  • git config --global user.name "...": يسجّل الاسم الذي سيظهر على كل نقطة حفظ. إنه مجرّد توقيعك على الـ commits.
  • git config --global user.email "...": نفس الشيء مع البريد. استعمل نفس بريد حساب GitHub المستقبلي، فهذا أنظف.

--global تعني «لكل مشاريعي على هذا الحاسوب»، لذا لن تُعيدها.

Git 4 · طقوس الحفظ الثلاثة: انظر، ضع في الصندوق، أغلق

هذا هو قلب Git كلّه. كلما أردت الحفظ، تكرّر نفس العادة الصغيرة من ثلاثة أوامر. تخيّل أنك تجهّز طرداً: تنظر إلى ما تغيّر، تضع التغييرات في الصندوق، ثم تُغلق الصندوق بملصق.

رحلة تغيير واحد، في 3 خطوات

Your foldergit add .The box (staging)git commit -mThe shelf (history)

git add يضع تغييراتك في الصندوق، وgit commit يُغلق الصندوق ويضعه على رفّ السجلّ، إلى الأبد.

الخطوة الأولى في مشروع جديد تماماً: أن تطلب من Git مراقبة هذا المجلّد. هذا أيضاً لمرّة واحدة لكل مشروع.

Terminal · داخل مجلّد المشروعتكتب هذا
$ git init

git init ينشئ مجلّداً مخفيّاً اسمه .git داخل مشروعك: هناك يخزّن Git كل السجلّ. لن تلمسه يدوياً أبداً. ثم تأتي طقوس الخطوات الثلاث، التي تكرّرها في كل عملية حفظ:

الخطوةالأمرماذا يفعل، ببساطة
1. انظرgit statusيُظهر ما تغيّر منذ آخر حفظ. لا يغيّر شيئاً: مجرّد نظرة. اجعلها عادة قبل كل خطوة وبعدها.
2. ضع في الصندوقgit add .يضع كل التغييرات في الصندوق (الـ «staging»)، جاهزة للحفظ. النقطة تعني «كل ما تغيّر».
3. أغلقgit commit -m "message"يُغلق الصندوق ويضعه في السجلّ، مع ملصق (الرسالة) يصف ما فعلته للتوّ.

في الطرفية، يبدو الأمر هكذا حقاً:

Terminal · الطقوس كاملةتكتب هذا
$ git status         # what changed?
$ git add .          # put everything in the box
$ git commit -m "Add the contact page"   # seal with a label

رسالة الـ commit: ملاحظة إلى نفسك في الغد

يجب أن تقول الرسالة ما الذي يغيّره هذا الـ commit، في جملة قصيرة. اكتبها كأنك تُكمل الجملة «هذا الـ commit سوف...». أنت في الغد، أو زميل لك، سيشكرك عند قراءة السجلّ.

رسالة ضعيفةرسالة جيّدة
"stuff""Add the About page"
"asdf""Fix the broken menu link"
"final changes v2""Make the footer full-width on mobile"

Git 5 · النظر إلى الوراء: سجلّ نقاط حفظك

لرؤية كل نقاط حفظك، واحدة في كل سطر، من الأحدث إلى الأقدم:

Terminalتكتب هذا
$ git log --oneline
a1b2c3d Make the footer full-width on mobile
9f8e7d6 Add the contact page
4c5b6a7 First commit

كل سطر هو نقطة حفظ: الرمز الصغير في البداية (مثل a1b2c3d) هو معرّفها الفريد، يليه رسالتك. إنه خيط أريان الذي يدلّك. احفظ هذه الفكرة التي تغيّر كل شيء: بمجرد عمل commit، لا يضيع محتواه أبداً. يمكنك التجربة، والكسر، وتجريب أفكار جريئة، ثم العودة دائماً إلى سطر سليم في هذا السجلّ.

نصيحة · شاشة git log

إذا ملأ git log (بدون --oneline) الشاشة كلها وبدت الطرفية «عالقة» مع علامة : في الأسفل، فلا تقلق: Git يعرض عليك قائمة طويلة فقط. اضغط حرف q (من «quit») للخروج والعودة إلى طرفيتك العادية.

Git 6 · نشر مشروعك على الإنترنت على GitHub

حتى الآن بقي كل شيء على حاسوبك. لنرسل نسخة إلى GitHub، لحفظها في مكان آمن ولنتمكّن من مشاركتها.

أ) أنشئ حساباً على GitHub. اذهب إلى github.com، اضغط «Sign up» واتبع الخطوات (بريد، كلمة مرور، اسم مستخدم). إنه مجّاني.

ب) أنشئ مستودعاً فارغاً. «المستودع» (أو «repo») هو ببساطة مجلّد مشروعك بنسخة GitHub. بعد تسجيل الدخول:

  1. اضغط زرّ «New» (الأخضر)، أو علامة «+» في الأعلى، ثم «New repository».
  2. أعطه اسماً، مثل my-first-site.
  3. اترك كل شيء آخر على وضعه الافتراضي. مهم: لا تُفعّل «Add a README»، ولا .gitignore، ولا رخصة. نريد مستودعاً فارغاً تماماً، لأن مشروعك موجود أصلاً على جهازك.
  4. اضغط «Create repository».

يعرض GitHub حينها صفحة بها أوامر. أنت تبحث عن كتلة «...or push an existing repository». هذه هي الأوامر الثلاثة أدناه بالضبط. انسخ عنوان مستودعك أنت (ينتهي بـ .git) وشغّل، من داخل مجلّد مشروعك:

Terminal · داخل مجلّد المشروعتكتب هذا
$ git remote add origin https://github.com/you/my-first-site.git
$ git branch -M main
$ git push -u origin main

ماذا يفعل كل سطر، ببساطة

  • git remote add origin ...: يخبر Git «هذا هو عنوان المشروع على الإنترنت». نطلق على هذا العنوان لقب origin. لمرّة واحدة لكل مشروع.
  • git branch -M main: يسمّي خطّ عملك الرئيسي main، وهو الاسم القياسي اليوم. لمرّة واحدة.
  • git push -u origin main: «يدفع» (يرسل) نقاط حفظك إلى GitHub. الجزء -u origin main يحفظ الوجهة.

حدّث صفحة GitHub: ها هي ملفّاتك. من الآن فصاعداً، بعد كل commit جديد، أمر واحد يرسل تغييراتك إلى الإنترنت:

Terminalتكتب هذا
$ git push

كلمتان ستصادفهما قريباً، كلٌّ في جملتين:

  • git clone يُنزّل مشروعاً كاملاً من GitHub، بكل سجلّه، إلى مجلّد جديد على جهازك. هكذا تحصل على مشروع فريق لأول مرّة.
  • git pull يجلب آخر التغييرات التي دفعها زملاؤك إلى GitHub ويدمجها في نسختك. اعمله قبل أن تبدأ العمل، لتنطلق من أحدث نسخة.

Git 7 · ملف .gitignore، في 3 أسطر

بعض الملفّات يجب ألّا تدخل أبداً إلى Git: فهي ضخمة، أو يُعاد توليدها تلقائياً، أو تحتوي على أسرار. ملف .gitignore هو ببساطة قائمة بالأسماء التي نتجاهلها. أهمّها بالنسبة لك: node_modules، ذلك المجلّد العملاق من الحِزَم المُنزّلة (راجع الفصل الرابع). يُعيد إنشاء نفسه بأمر npm install، لذا فإرساله إلى GitHub سيكون بلا فائدة وثقيلاً جداً.

خبر سار: عندما شغّلت create-next-app في الفصل الرابع، أُنشئ لك .gitignore صحيح تلقائياً. ليس عليك فعل شيء. وها هو، لتعرف كيف يبدو:

.gitignoreأُنشئ لك مسبقاً
node_modules
.next
out
.env*.local

الترجمة: «تجاهل الحِزَم المُنزّلة، ومجلّدات البناء، وأي ملف أسرار». إذا أظهر لك git status يوماً آلاف ملفّات node_modules، فتلك علامة على غياب .gitignore.

Git 8 · «النجدة، لقد كسرت شيئاً»

أكثر أربع عثرات شيوعاً لدى المبتدئين، والأمر الدقيق الذي يُصلح كلّاً منها. كل هذه الأوامر آمنة: لا تلاعب خطير هنا.

حالتكالحلّماذا يفعل
عملت للتوّ commit برسالة سيّئةgit commit --amend -m "الرسالة الصحيحة"يُعيد كتابة ملصق آخر commit فقط. افعله فقط إن لم يكن قد دُفع بعد.
أريد التراجع عن تغييراتي على ملف (لم يُحفظ في commit بعد)git restore file-nameيُعيد الملف كما كان عند آخر commit. (صيغة قديمة ستراها على الإنترنت: git checkout -- file-name.)
عملت commit، لكني أريد التراجع عنه مع الاحتفاظ بعمليgit reset --soft HEAD~1يزيل آخر commit لكن يترك كل تغييراتك سليمة في المجلّد، جاهزة لعمل commit جديد.
الطرفية عالقة على شاشة غريبة بعد git logاضغط qيخرج من عارض النصوص في Git ويُعيد لك الطرفية.

الْتزم بالأوامر الآمنة

عند البحث على الإنترنت، ستصادف git push --force وgit rebase. إنها أدوات قوية لكنها قد تمحو العمل إن أُسيء استعمالها. ما دمت مبتدئاً تعمل وحدك، فلست بحاجة إليها. عند الشكّ، توقّف واسأل مدرّبك على واتساب قبل كتابة أمر لا تفهمه.

Git 9 · الفروع (branches)، بهدوء

فكرة أخيرة، فقط لتتعرّف عليها حين تراها. الفرع (branch) هو خطّ نقاط حفظ موازٍ: نسخة عمل تستطيع فيها تجربة ميزة جديدة دون المساس بالنسخة الرئيسية (main). حين تجهز الميزة وتعمل، ندمج الفرع في main. هكذا تعمل الفرق معاً على نفس المشروع دون أن يعرقل أحدهم الآخر: كلٌّ على فرعه. لإنشاء فرع: git switch -c my-new-feature (الصيغة القديمة: git checkout -b ...).

لنكن صادقين: إن كنت مبتدئاً تعمل وحدك على مشروعك، فيمكنك بكل بساطة البقاء على main في الوقت الحالي. تصبح الفروع مفيدة يوم تنضمّ إلى فريق. يكفي أن تعرف أن الكلمة موجودة وما معناها.

Git 10 · تمرين موجّه: مشروعك على GitHub

لنجمع كل شيء معاً. ستأخذ مشروع التدريب من الفصول السابقة، وتحوّله إلى مستودع Git، وترسله إلى GitHub. اتبع المربّعات بالترتيب.

تمرين Git~30 دقيقة

من مجلّد محلّي إلى مستودع مُشترَك

تحقّق من نفسك

ما الفرق بين Git وGitHub؟
Git هو الأداة على حاسوبك التي تعمل نقاط الحفظ (الـ commits). GitHub هو موقع إلكتروني تخزّن فيه نسخة من مشروعك على الإنترنت لحفظها ومشاركتها. Git مثل Word، وGitHub مثل Google Drive.
ما هي أوامر طقوس الحفظ الثلاثة، بالترتيب؟
git status (انظر إلى ما تغيّر)، ثم git add . (ضع التغييرات في الصندوق)، ثم git commit -m "message" (أغلق الصندوق بملصق).
لماذا يجب أن يكون node_modules في ملف .gitignore؟
لأنه مجلّد ضخم، يُعاد توليده تلقائياً بأمر npm install. إرساله إلى GitHub سيكون بلا فائدة وثقيلاً جداً. خبر سار: create-next-app وضعه لك أصلاً في الـ .gitignore.
عملت للتوّ commit برسالة «asdf». كيف تُصلح الملصق وحده؟
git commit --amend -m "رسالة واضحة وصحيحة". يُعيد كتابة رسالة آخر commit. افعله فقط إن لم يكن قد دُفع إلى GitHub بعد.
أنت مبتدئ وتعمل وحدك. هل يجب عليك حتماً إنشاء فروع؟
لا. البقاء على main مناسب تماماً الآن. تصبح الفروع مفيدة حين تعمل ضمن فريق. يكفي أن تعرف أن الكلمة موجودة وما معناها.

بطاقة Git المرجعية

مرّة واحدة لكل جهاز

  • git --version تحقّق من تثبيت Git
  • git config --global user.name "..." اسمك على الـ commits
  • git config --global user.email "..." بريدك على الـ commits

مرّة واحدة لكل مشروع

  • git init ابدأ مراقبة هذا المجلّد
  • git remote add origin ... اربطه بمستودع GitHub
  • git branch -M main سمِّ الخطّ الرئيسي
  • git push -u origin main أول دفع إلى الإنترنت

طقوس كل يوم

  • git status انظر إلى ما تغيّر
  • git add . ضع التغييرات في الصندوق
  • git commit -m "message" أغلق نقطة الحفظ
  • git push أرسل إلى GitHub

النظر والجلب

  • git log --oneline السجلّ، سطر لكل commit
  • q اخرج من شاشة git log
  • git pull اجلب تغييرات الآخرين
  • git clone ... نزّل مشروعاً كاملاً

الإصلاح دون توتّر

  • git commit --amend -m "..." صحّح آخر رسالة
  • git restore file تراجع عن تغييرات ملف
  • git reset --soft HEAD~1 تراجع عن آخر commit مع حفظ العمل

لاحقاً، ضمن فريق

  • git switch -c my-branch أنشئ فرع عمل
  • git switch main ارجع إلى الخطّ الرئيسي
  • وحدك ومبتدئ؟ ابقَ على main، فهذا جيّد