الـ Commits في Git — دليل شامل 2026
دليل عملي مفصل للـ Commits في Git — كيف تكتب commits احترافية، Conventional Commits، والرجوع
في المقال السابق، أنشأت أول مستودع وقمت بأول commit. الآن سنتعمق في Commits — وهي الوحدة الأساسية في Git.
في هذا الدليل العملي، سنأخذك خطوة بخطوة لفهم Commits الاحترافية، مع تمارين وحلول.
ما هو Commit؟
Commit هو لقطة (Snapshot) من مشروعك في لحظة معينة.
تشبيه بسيط: تخيل أن Commit هو صورة فوتوغرافية لمشروعك:
- تُظهر حالة الملفات في لحظة معينة.
- لها رسالة تصف ما تغيّر.
- لها تاريخ و مؤلف.
- يمكنك الرجوع إليها في أي وقت.
كل Commit يحتوي على:
| العنصر | الوصف |
|---|---|
| Hash | معرّف فريد (SHA-1) |
| Author | من كتب الكود |
| Date | متى كُتب |
| Message | وصف التغيير |
| Parent | الـ commit السابق |
| Changes | الملفات المتغيرة |
كيف تكتب Commit جيد؟
القواعد الذهبية:
- قصير: لا يزيد عن 50 حرفاً.
- واضح: يصف ماذا تغيّر، ولماذا.
- بصيغة الأمر: "إضافة"، "إصلاح"، "تحديث".
- بالعربية أو الإنجليزية: اختر واحدة والتزم بها.
أمثلة:
✅ جيدة:
إضافة صفحة الاتصال
إصلاح خطأ في تسجيل الدخول
تحديث مكتبة React إلى 19
إزالة الكود المكرر
❌ سيئة:
تعديل
commit
fixed
asdfasdf
تحديثات كثيرة
Conventional Commits
Conventional Commits هو معيار عالمي لكتابة Commits احترافية.
الصيغة:
<type>(<scope>): <description>
الأنواع الشائعة:
| النوع | الوصف | مثال |
|---|---|---|
| feat | ميزة جديدة | feat: إضافة تسجيل الدخول |
| fix | إصلاح خطأ | fix: إصلاح خطأ في النموذج |
| docs | توثيق | docs: تحديث README |
| style | تنسيق (بدون منطق) | style: تنسيق الكود |
| refactor | إعادة هيكلة | refactor: تقسيم الدوال |
| test | اختبارات | test: إضافة اختبارات |
| chore | مهام روتينية | chore: تحديث المكتبات |
أمثلة كاملة:
feat(auth): إضافة تسجيل الدخول بالبريد
fix(api): إصلاح خطأ في تحميل البيانات
docs(readme): تحديث دليل التثبيت
refactor(utils): تقسيم الدوال المساعدة
chore(deps): تحديث React إلى 19
Commit Message Body
للـ Commits المعقدة، أضف تفاصيل:
git commit -m "feat(auth): إضافة تسجيل الدخول بالبريد" -m "- إضافة صفحة تسجيل الدخول
- ربط API المصادقة
- إضافة التحقق من البيانات
- إضافة معالجة الأخطاء"
النتيجة:
feat(auth): إضافة تسجيل الدخول بالبريد
- إضافة صفحة تسجيل الدخول
- ربط API المصادقة
- إضافة التحقق من البيانات
- إضافة معالجة الأخطاء
عرض السجل
1. السجل الكامل
git log
2. السجل المختصر
git log --oneline
النتيجة:
abc1234 feat: إضافة تسجيل الدخول
def5678 fix: إصلاح خطأ في النموذج
ghi9012 docs: تحديث README
3. السجل المختصر مع الفروع
git log --oneline --graph --all
4. سجل ملف معين
git log --oneline README.md
5. سجل شخص معين
git log --author="Ahmed"
6. سجل فترة زمنية
git log --since="2 weeks ago"
git log --until="2026-11-01"
تعديل آخر Commit
1. تعديل الرسالة فقط
git commit --amend -m "رسالة جديدة"
2. إضافة ملفات لآخر Commit
git add forgotten-file.txt
git commit --amend --no-edit
⚠️ تحذير: لا تعدّل Commits مرفوعة إلى GitHub (إلا إذا كنت وحدك).
الرجوع إلى Commit سابق
1. عرض التغييرات قبل الرجوع
git log --oneline
2. الرجوع مع الاحتفاظ بالتغييرات (Soft Reset)
git reset --soft HEAD~1
النتيجة: يُلغي آخر commit، لكن التغييرات تبقى في Staging.
3. الرجوع مع الاحتفاظ بالملفات (Mixed Reset — افتراضي)
git reset HEAD~1
النتيجة: يُلغي آخر commit، والتغييرات تبقى في Working Directory.
4. الرجوع مع حذف التغييرات (Hard Reset)
git reset --hard HEAD~1
⚠️ تحذير: يحذف كل التغييرات!
5. الرجوع لـ Commit معين
git reset --hard abc1234
التراجع عن Commit مرفوع
استخدم revert بدلاً من reset:
git revert abc1234
النتيجة: يُنشئ commit جديد يُلغي التغييرات.
استرجاع ملف من Commit قديم
git checkout abc1234 -- README.md
النتيجة: يُعيد README.md كما كان في commit abc1234.
إلغاء git add
# ملف واحد
git restore --staged file.txt
# كل الملفات
git restore --staged .
أو القديم:
git reset HEAD file.txt
حذف ملف من Git (مع الاحتفاظ به محلياً)
git rm --cached file.txt
الفائدة: للملفات التي يجب أن تكون في .gitignore.
مثال عملي: مشروع متكامل
السيناريو: بناء تطبيق مهام
الخطوة 1: إعداد المشروع
mkdir todo-app
cd todo-app
git init
الخطوة 2: إضافة الملفات الأساسية
echo "# Todo App" > README.md
git add README.md
git commit -m "docs: إضافة README"
الخطوة 3: إضافة package.json
npm init -y
git add package.json
git commit -m "chore: إعداد package.json"
الخطوة 4: إضافة الكود
mkdir src
echo "console.log('Hello');" > src/index.js
git add .
git commit -m "feat: إضافة الدالة الرئيسية"
الخطوة 5: إضافة .gitignore
echo "node_modules/" > .gitignore
git add .gitignore
git commit -m "chore: إضافة .gitignore"
السجل:
git log --oneline
النتيجة:
d4e5f6g chore: إضافة .gitignore
c3d4e5f feat: إضافة الدالة الرئيسية
b2c3d4e chore: إعداد package.json
a1b2c3d docs: إضافة README
🎉 سجل احترافي!
تمارين عملية
تمرين 1: أول Commit
أنشئ ملفاً واعمل commit.
الحل:
echo "مرحباً" > hello.txt
git add hello.txt
git commit -m "feat: إضافة ملف الترحيب"
تمرين 2: Conventional Commit
اكتب commit بصيغة Conventional.
الحل:
git commit -m "feat(auth): إضافة تسجيل الدخول"
تمرين 3: عرض السجل
اعرض آخر 5 commits.
الحل:
git log --oneline -5
تمرين 4: تعديل آخر Commit
عدّل رسالة آخر commit.
الحل:
git commit --amend -m "feat: رسالة جديدة"
تمرين 5: إلغاء git add
أضف ملفاً ثم ألغِ الإضافة.
الحل:
git add file.txt
git restore --staged file.txt
تمرين 6: الرجوع
ارجع لـ commit سابق مع الاحتفاظ بالتغييرات.
الحل:
git reset --soft HEAD~1
تمرين 7: استرجاع ملف
استرجع ملفاً من commit قديم.
الحل:
git checkout abc1234 -- README.md
تمرين 8: مشروع كامل
أنشئ مشروعاً مع 5 commits احترافية.
الحل: (راجع المثال العملي أعلاه)
حل المشاكل الشائعة
🔴 المشكلة 1: nothing to commit
السبب: لا توجد تغييرات.
الحل: تأكد من تعديل الملفات، ثم:
git status
🔴 المشكلة 2: نسيت -m
النتيجة: سيفتح محرر. اكتب الرسالة، احفظ، وأغلق.
لتجنب ذلك:
git config --global core.editor "code --wait"
🔴 المشكلة 3: fatal: not a git repository
الحل:
git init
🔴 المشكلة 4: أخطأت في رسالة commit
الحل:
git commit --amend -m "الرسالة الصحيحة"
🔴 المشكلة 5: أريد حذف آخر commit
الحل:
git reset --hard HEAD~1
⚠️ تحذير: يحذف التغييرات!
جدول أوامر Commits
| الأمر | الوظيفة |
|---|---|
git commit -m "msg" | إنشاء commit |
git commit -am "msg" | إضافة + commit |
git commit --amend | تعديل آخر commit |
git log | عرض السجل |
git log --oneline | سجل مختصر |
git show abc123 | تفاصيل commit |
git reset --soft HEAD~1 | إلغاء commit (ناعم) |
git reset --hard HEAD~1 | إلغاء commit (قوي) |
git revert abc123 | عكس commit |
git restore --staged . | إلغاء git add |
قائمة تحقق نهائية
| المهمة | الحالة |
|---|---|
| فهم ما هو Commit | ⬜ |
| كتابة commits واضحة | ⬜ |
| Conventional Commits | ⬜ |
| عرض السجل | ⬜ |
| تعديل آخر Commit | ⬜ |
| الرجوع لـ Commit سابق | ⬜ |
| حل التمارين الثمانية | ⬜ |
ماذا بعد هذا المقال؟
الآن بعد أن أتقنت Commits، أنت جاهز للمقال التالي:
- الفروع (Branches) — العمل على ميزات متعددة.
- الدمج (Merge) — دمج الفروع.
- GitHub — Pull Requests.
الخلاصة
في هذا المقال، تعلمت:
- ✅ ما هو Commit.
- ✅ كيف تكتب commits احترافية.
- ✅ Conventional Commits.
- ✅ عرض السجل.
- ✅ تعديل آخر Commit.
- ✅ الرجوع لـ Commit سابق.
- ✅ حل 8 تمارين عملية.
تذكر: Commit جيد = تاريخ مشروع نظيف = فريق سعيد.
أول مستودع Git لك — من التهيئة إلى الرفع 2026
الفروع في Git — دليل شامل Branches 2026
📚 مقالات ذات صلة
مشروع Git متكامل — تعاون على مستودع احترافي 2026
مشروع عملي شامل للتعاون على مستودع Git — فروع، PRs، مراجعة، CI/CD، وإصدارات
Git Workflow احترافي — دليل شامل 2026
دليل عملي مفصل لـ Git Workflow الاحترافي — Git Flow، GitHub Flow، Trunk-based، وأفضل الممارسات
حل التعارضات في Git — دليل شامل 2026
دليل عملي مفصل لحل التعارضات في Git — أنواع التعارضات، الأخطاء الشائعة، وأدوات المساعدة