Git

Git هو نظام لإدارة الإصدارات (Version Control System – VCS)
وهو برنامج يُثبّت على جهازك ليقوم بتتبع التغييرات في ملفات المشروع (مثل ملفات الكود أو الوثائق)، ويمكنك من التعاون مع الآخرين بسهولة.

تم تطويره بواسطة “Linus Torvalds” سنة 2005، مبتكر نظام التشغيل Linux.

🎯 الفوائد:
  1. حفظ سجل كامل للمشروع: كل تعديل تقوم به محفوظ في سجل زمني.
  2. التراجع بسهولة: يمكنك التراجع لأي نسخة سابقة من المشروع في أي وقت.
  3. العمل الجماعي: يمكن لأكثر من مطوّر العمل على نفس المشروع بدون تداخل أو تضارب.
  4. العمل بفروع منفصلة: يمكن تجربة أفكار جديدة دون التأثير على النسخة الأساسية.
🔍 مثال عملي:

تخيل أنك تطور تطبيق ويب فيه الملفات التالية:

index.html
style.css
app.js
JavaScript

قمت بتعديل style.css وعدلت الألوان، ثم قررت لاحقًا الرجوع للشكل السابق.
بدون Git ستحتاج تحفظ نسخ متعددة يدويًا (style-old.css و style-new.css).
لكن مع Git:

  • كل تعديل يتم حفظه في سجل مرتب.
  • يمكنك كتابة ملاحظة عند كل تعديل مثل: sqlCopyEditgit commit -m "تغيير لون الخلفية للأزرق"
🧠 كيف يعمل Git باختصار؟

عندما تستخدم Git، يتم إنشاء مجلد مخفي داخل مشروعك يسمى .git، يحتوي على جميع معلومات المشروع وتاريخه.

Git يمر بـ 3 مراحل رئيسية:

  1. Working Directory: الملفات التي تراها وتعمل عليها.
  2. Staging Area: الملفات التي قمت بتحضيرها للحفظ (commit).
  3. Repository (Local Database): قاعدة البيانات التي تحفظ فيها التعديلات.
⚠️ المحاذير والنصائح:
  • لا تحذف مجلد .git لأنه يحوي كل التاريخ.
  • لا تحفظ ملفات حساسة في المشروع العام (مثل كلمات المرور).
  • استخدم .gitignore لتجاهل الملفات المؤقتة أو الخاصة (مثل logs، ملفات النظام، node_modules… إلخ).
💡 ملخص بصري:
الملفgit addStaginggit commitRepository
JavaScript
🧪 أمر للمراجعة:
git --version
JavaScript
  • لمعرفة هل Git مُثبت أم لا.
✅ المرحلة التالية:
✅ 1. git init
📘 التعريف:

ينشئ مجلد Git مخفي (.git) داخل مجلد مشروعك لبدء تتبع التعديلات.

🎯 الفائدة:
  • يجعل المجلد “مستودع Git”.
  • يُستخدم كبداية لأي مشروع Git جديد.
💻 مثال:
mkdir my_project
cd my_project
git init
JavaScript

بعدها سيظهر مجلد مخفي .git.

⚙️ خيارات:
الخيارالوظيفة
--bareلإنشاء مستودع بدون working directory (يُستخدم في الخوادم فقط).

⚠️ ملاحظات:

  • لا تحذف مجلد .git.
  • يمكنك التأكد من نجاح الأمر: git status
✅ 2. git add
📘 التعريف:

يضيف الملفات إلى “المنطقة المؤقتة” (Staging Area) استعدادًا للحفظ (commit).

🎯 الفائدة:
  • يسمح لك بتحضير التعديلات التي تريد حفظها فقط.
💻 أمثلة:
git add file.txt         # إضافة ملف محدد
git add .                # إضافة كل الملفات المعدّلة والجديدة
git add *.php            # إضافة جميع ملفات PHP فقط
JavaScript
⚙️ خيارات:
الخيارالوظيفة
-Aإضافة كل شيء (جديد، معدّل، محذوف).
-uإضافة كل شيء معدّل أو محذوف، بدون ملفات جديدة.
⚠️ ملاحظات:
  • git add لا يحفظ التغييرات في Git بعد.
  • فقط “يجاهزها” للحفظ بـ git commit.
✅ 3. git commit
📘 التعريف:

يحفظ التعديلات في المستودع المحلي مع رسالة توضيحية.

🎯 الفائدة:
  • تخزين نسخة من التعديلات مع سجل زمني.
  • الرجوع لأي نسخة في المستقبل.
💻 أمثلة:
git commit -m "أضفت صفحة تسجيل الدخول"
JavaScript
⚙️ خيارات:
الخيارالوظيفة
-mلكتابة الرسالة مباشرة.
--amendلتعديل آخر commit بدلًا من إنشاء جديد.
⚠️ ملاحظات:
  • كل commit يجب أن يحتوي على رسالة واضحة.
  • بعد كل commit، يُحفظ التغيير في سجل المشروع.
✅ 4. git log
📘 التعريف:

يُعرض تاريخ التعديلات (commits).

🎯 الفائدة:
  • مراجعة من غيّر ماذا ومتى.
  • البحث في سجل المشروع.
💻 أمثلة:
git log                      # السجل الكامل
git log --oneline            # ملخص سطر واحد لكل commit
git log --author="yasin"     # حسب اسم المستخدم
git log -p                   # لعرض الفروقات بين التعديلات
JavaScript
⚙️ خيارات مفيدة:
الخيارالوظيفة
--graphلعرض الفروع بصريًا.
--since="1 week ago"عرض commits منذ أسبوع.
--statملخص للتعديلات على الملفات.
⚠️ ملاحظات:
  • مفيد لفهم تطوّر المشروع وتاريخ الأخطاء.
✅ 5. git branch
📘 التعريف:

يُستخدم لإدارة الفروع (branches) داخل مشروعك.

🎯 الفائدة:
  • تطوير ميزات جديدة دون التأثير على الكود الرئيسي.
💻 أمثلة:
git branch                     # عرض كل الفروع
git branch dev                # إنشاء فرع جديد اسمه dev
git checkout dev              # الانتقال إلى الفرع
JavaScript
⚙️ خيارات:
الخيارالوظيفة
-d branch-nameحذف فرع.
-m old newإعادة تسمية فرع.
⚠️ ملاحظات:
  • الفرع الرئيسي غالبًا اسمه main أو master.
  • استخدم فروع منفصلة لكل ميزة أو إصلاح.
✅ 6. git merge
📘 التعريف:

يُدمج التعديلات من فرع إلى فرع آخر.

🎯 الفائدة:
  • إدخال التعديلات من فرع ثانوي إلى الفرع الرئيسي (main).
💻 مثال عملي:
git checkout main
git merge dev
JavaScript

هذا يعني دمج فرع dev إلى main.

⚙️ خيارات:
الخيارالوظيفة
--no-ffيجبر Git على إنشاء commit دمج حتى لو لم يكن هناك تعارض.
⚠️ المحاذير:
  • إذا كان هناك تعارض، Git سيطلب منك حلّ التعارض يدويًا.
  • لا تنسَ اختبار الكود بعد الدمج.
✅ 7. git push / git pull
📘 التعريف:
الأمرالوظيفة
git pushإرسال التعديلات إلى المستودع البعيد (GitHub/GitLab).
git pullجلب آخر التعديلات من المستودع البعيد ودمجها مع نسختك.
🎯 الفائدة:
الأمرالفائدة
pushمشاركة العمل مع الفريق – حفظ نسخة على الإنترنت.
pullتحديث ملفاتك بآخر تعديلات من الزملاء أو من خوادم الإنتاج.
💻 أمثلة:
git push origin main            # رفع الفرع main
git pull origin main            # جلب التعديلات من main
JavaScript
⚙️ خيارات:
الخيارالوظيفة
-uلتحديد الفرع الافتراضي.
--force أو -fلفرض رفع التعديلات (بحذر).
⚠️ محاذير:
  • لا تستخدم --force إلا إذا كنت متأكدًا.
  • تأكد دائمًا من git pull قبل push لتفادي التعارض.
الدرس 8: git status
📘 التعريف:

يعرض حالة الملفات في المشروع:
هل هي مضافة؟ معدّلة؟ لم يتم تتبعها؟ أم جاهزة للـ commit؟

🎯 الفائدة:

معرفة ما يحدث في المشروع قبل تنفيذ أوامر مثل add, commit.

🧪 الاستخدام:
git status
JavaScript
🟢 مثال ناتج:
On branch main
Changes not staged for commit:
  modified:   index.html

Untracked files:
  style.css
JavaScript
⚠️ نصائح:
  • استخدمه دائمًا قبل commit للتأكد أنك لم تنس شيئًا.
  • يوضح لك إذا نسيت ملف أو نسيت add.
✅ الدرس 9: git reset
📘 التعريف:

يستخدم للتراجع عن تغييرات سواء كانت في staging أو commit.

🎯 الفائدة:

إلغاء commit، إزالة ملفات من staging، أو التراجع عن تعديلات.

🧪 الاستخدام:
🔄 إزالة ملف من staging:
git reset file.js
JavaScript
🔁 إلغاء آخر commit (مع إبقاء التعديلات):
git reset --soft HEAD~1
JavaScript
🔃 إلغاء آخر commit (مع إبقاء التعديلات على الملفات فقط):
git reset --mixed HEAD~1
JavaScript
🔥 إلغاء آخر commit (وإزالة التعديلات كليًا):
git reset --hard HEAD~1
JavaScript
⚠️ تحذير:

--hard يحذف التعديلات نهائيًا، لا يمكن استرجاعها بسهولة.

✅ الدرس 🔟: git stash
📘 التعريف:

يُخزن التعديلات مؤقتًا ويعيد المجلد نظيفًا.

🎯 الفائدة:

لو كنت تعدل شيء وتحتاج تبديل الفرع بسرعة دون حفظ التعديلات.

🧪 الاستخدام:
تخزين التعديلات مؤقتًا:
git stash
JavaScript
استرجاع آخر stash:
git stash pop
JavaScript
عرض قائمة التخزين:
git stash list
JavaScript
مثال عملي:
git stash             # يخزن التعديلات
git checkout main     # تنقل لفرع آخر
git stash pop         # يرجع التعديلات
JavaScript
✅ الدرس 11: git rebase

📘 التعريف:

يُستخدم لدمج التعديلات بطريقة أكثر “نظافة” من merge.

🎯 الفائدة:

إعادة كتابة تاريخ التعديلات وكأنك بدأت من الفرع الأساسي مباشرة.

🧪 الاستخدام:
git checkout feature
git rebase main
JavaScript

يعني: اجعل فرع feature يظهر كأنه انبثق الآن من main.

⚠️ الفرق بين merge و rebase:
mergerebase
التاريخيحتفظ بتاريخ جميع الفروعيعيد كتابة التاريخ
الشكليظهر فروع متداخلةخط زمني نظيف ومتسلسل
متى يُستخدم؟في العمل الجماعيفي العمل الفردي أو قبل push
✅ الدرس 12: git remote
📘 التعريف:

يدير المستودعات البعيدة المرتبطة بمشروعك.

🎯 الفائدة:

ربط مشروعك بـ GitHub/GitLab… إلخ.

🧪 الاستخدام:
عرض الريموتات المرتبطة:
git remote -v
JavaScript
إضافة مستودع بعيد:
git remote add origin https://github.com/user/repo.git
JavaScript

تغيير رابط:

git remote set-url origin https://github.com/new/repo.git
JavaScript
✅ الدرس 13: .gitignore
📘 التعريف:

ملف تحدد فيه الملفات التي لا يجب أن يتتبعها Git.

🎯 الفائدة:

تجاهل ملفات المؤقتة أو الخاصة مثل:

  • node_modules/
  • *.log
  • .env
🧪 الاستخدام:
touch .gitignore
JavaScript
# مثال:
.env
node_modules/
*.log
.idea/
JavaScript
✅ الدرس 14: التعامل مع Conflicts
📘 التعريف:

تحدث عندما يُعدّل شخصان نفس الملف في نفس السطر تقريبًا.

🎯 الفائدة:

Git لا يمكنه دمج التعديلات تلقائيًا، ويطلب منك حل التعارض.

🧪 مثال:
<<<<<<< HEAD
color: red;
=======
color: blue;
>>>>>>> feature
JavaScript
الحل:

اختر أحد السطرين أو ادمجهم، ثم:

git add .
git commit
JavaScript
✅ الدرس 15: حذف أو إعادة تسمية الملفات
🧪 الحذف:
git rm file.txt
git commit -m "حذف الملف"
JavaScript
🧪 إعادة التسمية:
git mv old.js new.js
git commit -m "إعادة تسمية"
JavaScript