تنفيذ commit هو إجراء حفظ التغييرات في نظام التحكم بالنسخ Git، مما ينشئ نقطة حفظ في تاريخ المشروع. يتضمن كل commit تجزئة (hash) والمؤلف والتاريخ ووصف التغييرات. وفقًا لـ GitHub Octoverse 2024، يتم إنشاء أكثر من 50 مليون commit يوميًا حول العالم. Commit هو الوحدة الأساسية للعمل مع التحكم بالنسخ، والتي بدونها لا يمكن تصور تطوير البرمجيات الحديثة.
النقاط الرئيسية
commit في Git هو كائن يخزن حالة ملفات المشروع في وقت معين. يحتوي كل commit على لقطة لجميع الملفات المتتبعة، ومرجع إلى commit الأب، وبيانات وصفية. على عكس أنظمة التحكم بالنسخ الأخرى، يستخدم Git تخزينًا موجهًا بالمحتوى — يتم تحديد كل كائن بتجزئة SHA-1 لمحتواه.
عندما يقوم المطور بتنفيذ commit للتغييرات، ينشئ Git كائن commit يخزن: كائن tree (هيكل الملفات)، تجزئة commit الأب، المؤلف، committer، التاريخ والرسالة. هذا الكائن غير قابل للتغيير — بمجرد إنشائه، لا يمكن تعديل commit دون تغيير تجزئته. يضمن عدم القابلية للتغيير سلامة تاريخ المشروع.
# تجهيز التغييرات وتنفيذ commit
git add index.html style.css
git commit -m "Fix responsive layout on mobile devices"
# عرض تفاصيل commit
git log --oneline -3
git show HEAD
# تجهيز جميع التغييرات وتنفيذ commit في خطوة واحدة
git commit -a -m "Update dependencies to latest versions"
تشكل commits رسمًا بيانيًا لا دوريًا موجهًا (DAG)، حيث يشير كل commit جديد إلى السابق. يتيح ذلك التنقل عبر التاريخ وتراجع التغييرات وتحليل تطور قاعدة البيانات. فهم هيكل DAG في Git هو الأساس للعمل المتقدم مع commits.
تتكون عملية commit في Git من مرحلتين: إضافة التغييرات إلى منطقة staging (الفهرس) وإنشاء commit. تسمح منطقة staging للمطور باختيار التغييرات المحددة التي ستُدرج في commit، حتى لو تم تعديل العديد من الملفات في دليل العمل.
قاعدة الذرية هي المبدأ الأساسي لـ commit جيد. يجب أن يحتوي كل commit على تغيير منطقي واحد. إذا قام المطور بإصلاح خطأ وإعادة هيكلة الكود — فهما commitان مختلفان. commits الذرية تبسط مراجعة الكود وتراجع التغييرات وتحليل التاريخ.
قبل تنفيذ commit، يجدر التحقق: ما إذا كان هناك مخرجات تصحيح أخطاء أو كتل معلقة أو تغييرات عرضية في الكود. لهذا يُستخدم الأمر git diff --cached الذي يظهر ما سيدخل بالضبط في commit. تحقق إضافي عبر git status يعرض قائمة الملفات في منطقة staging.
رسالة commit هي توثيق التغيير للمطورين المستقبليين. الرسالة الجيدة تجيب على الأسئلة: ما الذي تغير ولماذا. أصبحت اتفاقية Conventional Commits (فريق Angular، 2016) معيارًا للعديد من المشاريع وتحدد التنسيق: النوع(النطاق): الوصف.
| النوع | الغرض | مثال |
|---|---|---|
| feat | وظيفة جديدة | feat(api): add user registration endpoint |
| fix | إصلاح خطأ | fix(auth): resolve token refresh issue |
| refactor | إعادة هيكلة دون تغيير السلوك | refactor(core): extract payment validator |
| docs | توثيق | docs(readme): update installation guide |
| test | إضافة اختبارات | test(cart): add unit tests for checkout |
تتكون رسالة commit الجيدة من عنوان (حتى 50 حرفًا) ونص (اختياري، حتى 72 حرفًا في السطر). يُكتب العنوان بصيغة الأمر: «Add» وليس «Added» أو «Adds». Capitalization والنقطة في نهاية العنوان لا تُستخدم — هذه اتفاقية Git دولية.
الرسالة السيئة: «fix things» أو «update» — لا تحمل معلومات. بعد شهر، لن يتمكن المطور من فهم ما تم تغييره بالضبط ولماذا. الرسالة الجيدة: «fix(payment): handle timeout in stripe callback» — يتضح فورًا ما وأين تم إصلاحه.
المطورون، خاصة المبتدئين، غالبًا ما يرتكبون أخطاء نموذجية عند تنفيذ commit. الأكثر شيوعًا هو commit كبير جدًا يخلط عشرات التغييرات. لا يمكن تراجع هذا commit جزئيًا، وتصبح مراجعة الكود عذابًا.
ثاني أكثر الأخطاء شيوعًا هو رسالة commit رديئة. الرسائل مثل «fix» أو «update» أو «changes» أو «wip» لا توفر سياقًا للمطورين المستقبليين. بعد ستة أشهر، لن يتذكر أحد ما تم إصلاحه بالضبط. القاعدة بسيطة: تخيل أنك بعد عام تنظر في التاريخ وتحاول العثور على تغيير معين.
الخطأ الثالث هو تنفيذ commit لرمز غير مُجمّع أو غير عامل. بعد commit، يجب أن يترجم الرمز على الأقل. عدم كسر البناء هو متطلب أساسي لأي commit في فرع مشترك. لهذا، يتم تشغيل البناء والاختبارات قبل commit.
الخطأ الرابع هو تنفيذ commit لبيانات سرية. مفاتيح API وكلمات المرور والرموز يجب ألا تصل إلى تاريخ Git. إذا تم commit سر بالفعل، فلا يكفي حذفه في commit جديد، بل يجب حذفه من التاريخ بأكمله عبر git filter-branch أو BFG Repo-Cleaner.
يوفر Git أدوات لإدارة تاريخ commits. من أكثرها فائدة git commit --amend، الذي يسمح بتكميل آخر commit بتغييرات جديدة أو تصحيح الرسالة. هذا مفيد إذا نسي المطور تضمين ملف أو أخطأ في الرسالة.
# تصحيح رسالة آخر commit
git commit --amend -m "fix(auth): correct token validation logic"
# إضافة ملف تم نسيانه إلى آخر commit
git add missed-file.txt
git commit --amend --no-edit
# Rebase تفاعلي لآخر 3 commits
git rebase -i HEAD~3
Interactive rebase هي أداة قوية لإعادة كتابة التاريخ. تسمح بدمج commits (squash) وتغيير الرسائل (reword) وإعادة الترتيب (reorder) وحذف commits (drop). ومع ذلك، يغير rebase التاريخ، لذلك يُستخدم فقط مع commits المحلية التي لم تُدفع بعد إلى المستودع البعيد.
هناك طريقتان لتراجع commits. git revert ينشئ commit جديدًا يلغي تغييرات السابق — طريقة آمنة تحفظ التاريخ. git reset يحذف commits من التاريخ — خطير إذا كانت commits قد دُفعت بالفعل. في التطوير الجماعي، يُستخدم git revert فقط لتراجع commits المنشورة.
الأسئلة الشائعة
تنفيذ commit يعني إنشاء نقطة حفظ للتغييرات في Git. يسجل commit الحالة الحالية للملفات في تاريخ المشروع مع وصف ما تغير ولماذا. كل commit له معرف فريد (SHA-1 hash) وهو جزء من سلسلة تغييرات متصلة.
يوصى بتنفيذ commit بعد كل تغيير مكتمل منطقيًا، حتى لو كان صغيرًا. التكرار الأمثل هو commit واحد لكل مهمة أو إصلاح. لا يجب تنفيذ commit كل 5 دقائق، ولكن أيضًا لا ينبغي تراكم التغييرات لـ عدة أيام دون commit واحد.
commit الذري يحتوي على تغيير منطقي واحد — مهمة واحدة أو إصلاح خطأ واحد أو وظيفة جديدة واحدة. لا يخلط تغييرات مختلفة في commit واحد. مزايا commits الذرية: سهولة التراجع وتاريخ واضح ومراجعة كود سهلة.
لتراجع commit منشور، استخدم git revert <commit-hash> — ينشئ commit جديدًا يلغي التغييرات. للـ commits المحلية، يمكنك استخدام git reset HEAD~1، ولكن فقط إذا لم يكن commit قد دُفع بعد. git revert هي الطريقة الآمنة للعمل الجماعي.
نعم، قبل الدفع إلى المستودع البعيد. استخدم git commit --amend لتعديل آخر commit أو git rebase -i لتعديل عدة commits. بعد الدفع، لا يُنصح بتعديل التاريخ — قد يسبب مشاكل للمطورين الآخرين إذا كانوا قد دفعوا تغييراتهم بالفعل.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.