Git هو نظام لإدارة الإصدارات (Version Control System – VCS)
وهو برنامج يُثبّت على جهازك ليقوم بتتبع التغييرات في ملفات المشروع (مثل ملفات الكود أو الوثائق)، ويمكنك من التعاون مع الآخرين بسهولة.
تم تطويره بواسطة “Linus Torvalds” سنة 2005، مبتكر نظام التشغيل Linux.
🎯 الفوائد:
- حفظ سجل كامل للمشروع: كل تعديل تقوم به محفوظ في سجل زمني.
- التراجع بسهولة: يمكنك التراجع لأي نسخة سابقة من المشروع في أي وقت.
- العمل الجماعي: يمكن لأكثر من مطوّر العمل على نفس المشروع بدون تداخل أو تضارب.
- العمل بفروع منفصلة: يمكن تجربة أفكار جديدة دون التأثير على النسخة الأساسية.
🔍 مثال عملي:
تخيل أنك تطور تطبيق ويب فيه الملفات التالية:
index.html
style.css
app.js
JavaScriptقمت بتعديل style.css
وعدلت الألوان، ثم قررت لاحقًا الرجوع للشكل السابق.
بدون Git ستحتاج تحفظ نسخ متعددة يدويًا (style-old.css و style-new.css).
لكن مع Git:
- كل تعديل يتم حفظه في سجل مرتب.
- يمكنك كتابة ملاحظة عند كل تعديل مثل: sqlCopyEdit
git commit -m "تغيير لون الخلفية للأزرق"
🧠 كيف يعمل Git باختصار؟
عندما تستخدم Git، يتم إنشاء مجلد مخفي داخل مشروعك يسمى .git
، يحتوي على جميع معلومات المشروع وتاريخه.
Git يمر بـ 3 مراحل رئيسية:
- Working Directory: الملفات التي تراها وتعمل عليها.
- Staging Area: الملفات التي قمت بتحضيرها للحفظ (commit).
- Repository (Local Database): قاعدة البيانات التي تحفظ فيها التعديلات.
⚠️ المحاذير والنصائح:
- لا تحذف مجلد
.git
لأنه يحوي كل التاريخ. - لا تحفظ ملفات حساسة في المشروع العام (مثل كلمات المرور).
- استخدم
.gitignore
لتجاهل الملفات المؤقتة أو الخاصة (مثل logs، ملفات النظام، node_modules… إلخ).
💡 ملخص بصري:
الملف ← git add ← Staging ← git commit ← Repository
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
:
merge | rebase | |
---|---|---|
التاريخ | يحتفظ بتاريخ جميع الفروع | يعيد كتابة التاريخ |
الشكل | يظهر فروع متداخلة | خط زمني نظيف ومتسلسل |
متى يُستخدم؟ | في العمل الجماعي | في العمل الفردي أو قبل 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