البرمجة مبتدئ 6 دقيقة

كيفية كتابة رسائل commit جيدة في Git

رسالة الـ commit هي ملاحظة لنفسك في المستقبل (ولزملائك) تشرح سبب إجراء التغيير. الـ diff يُظهر الماذا؛ أما الرسالة فيجب أن تشرح اللماذا. الرسائل الجيدة تُؤتي ثمارًا مضاعفة — في كل مرة يشغّل فيها أحدهم git log أو git blame لفهم قرار ما، سيشكرك أو يلعنك.

الخطوات

  1. 1

    أبقِ سطر الموضوع أقل من 50 حرفًا

    السطر الأول من رسالة الـ commit هو الموضوع. يقطع GitHub الرسائل عند 72 حرفًا؛ وكثير من الطرفيات عند 80. استهدف 50 حرفًا ليتناسب بوضوح مع git log --oneline وعرض GitHub والإشعارات البريدية. إذا لم تستطع التلخيص في 50 حرفًا، فالـ commit على الأرجح كبير جدًا.

    bash
    # طويل جدًا — صعب المسح
    Fix the issue where authenticated users were being redirected to the login page after session expiry instead of refreshing the token
    
    # جيد
    Fix token refresh redirect for authenticated users
  2. 2

    استخدم صيغة الأمر في الموضوع

    اكتب الموضوع كأنك تُكمل جملة \"إذا طُبّق، سيقوم هذا الـ commit بـ...\". هذا يعني: Fix، Add، Remove، Update، Refactor — وليس "Fixed" أو "Adding" أو "Various changes".

    bash
    # خاطئ
    Fixed broken login
    Adding dark mode support
    I changed the timeout value
    
    # صحيح
    Fix broken login redirect
    Add dark mode support
    Change timeout from 3s to 5s
  3. 3

    اترك سطرًا فارغًا قبل نص الرسالة

    يتعامل Git مع الفقرة الأولى بوصفها الموضوع وكل شيء بعد سطر فارغ بوصفه نص الرسالة. بدون هذا السطر الفارغ، لا تستطيع أدوات مثل git log --oneline وGitHub وكثير من عملاء البريد التمييز بين الموضوع والنص. السطر الفارغ ليس اختياريًا.

    bash
    Fix token refresh redirect for authenticated users
    
    The session middleware was checking token expiry before the refresh
    handler ran, causing a redirect to /login even when a valid refresh
    token existed. Reorder the middleware chain to fix this.
    
    Fixes #218
  4. 4

    اشرح لماذا لا ماذا في نص الرسالة

    الـ diff يُظهر بالفعل ما تغيّر. استخدم النص لشرح السبب والمقايضة التي اخترتها والبديل الذي رفضته. التزم بـ 72 حرفًا لكل سطر حتى يُعرض النص بوضوح في الطرفيات.

    bash
    # نص غير مفيد — يصف الـ diff فقط
    Changed timeout from 3000 to 5000 in config/app.js
    
    # نص مفيد — يشرح المنطق
    Increase API timeout from 3s to 5s
    
    The third-party payment gateway occasionally takes 4–4.5s on the first
    request after a cold start. Users were seeing spurious payment errors.
    The gateway's SLA guarantees responses within 5s.
  5. 5

    اعتمد Conventional Commits للأتمتة

    Conventional Commits معيار خفيف يُضيف بادئة نوع إلى الموضوع: feat:، fix:، chore:، docs:، refactor:، test:. أدوات مثل semantic-release وstandard-version تقرأ هذه البوادئ لتوليد سجلات التغييرات وترقيات الإصدار تلقائيًا — دون ملاحظات إصدار يدوية.

    bash
    feat: add OAuth2 login with Google
    fix: correct cart total when discount code applied
    chore: upgrade Laravel from 11 to 12
    docs: document the deployment workflow in CLAUDE.md
    refactor: extract payment logic into PaymentService
    test: add unit tests for CartController
    
    # تغيير جذري — أضف ! وفوتر:
    feat!: rename /api/v1 to /api/v2
    
    BREAKING CHANGE: All clients must update their base URL.
  6. 6

    أشر إلى المشكلات وطلبات السحب

    اربط الـ commits بتذكر المشكلات حتى يتمكن القراء مستقبلًا من الانتقال مباشرة للنقاش الكامل. يغلق GitHub المشكلات تلقائيًا عندما يصل commit يحتوي على Fixes #N إلى الفرع الافتراضي.

    bash
    fix: prevent double-submit on payment form
    
    Disable the submit button immediately on click and re-enable it only
    if the API returns an error. Previously, slow connections allowed
    users to click twice, creating duplicate charges.
    
    Fixes #312
    See also: #298
  7. 7

    اضبط محررك لرسائل الـ commit

    كتابة رسائل commit متعددة الأسطر في الطرفية أمر مُرهق. اضبط المحرر المفضل لديك حتى يفتح Git ملفًا حقيقيًا عند تشغيل git commit (بدون -m). خيار --wait في VS Code يجعله يتوقف حتى تغلق الملف.

    bash
    # VS Code
    git config --global core.editor "code --wait"
    
    # Vim
    git config --global core.editor "vim"
    
    # Nano
    git config --global core.editor "nano"
    
    # ثم شغّل فقط:
    git commit
    # سيفتح Git المحرر؛ احفظ وأغلق لإتمام الـ commit.

نصائح ومحاذير

  • "wip" و"minor fix" و"updates" و"asdf" ليست رسائل commit. نفسك المستقبلية في الساعة 2 صباحًا تُصحح إنتاج لن تشكرك على هذا.
  • إذا احتجت كلمة "و" لوصف commit، فيجب على الأرجح أن يكون commit-ين منفصلين.
  • العرض <code>git log --oneline --graph</code> يُكافئ سطور الموضوع الجيدة — السيئة تجعل السجل غير قابل للقراءة.
  • للفرق، أضف ملف قالب <code>.gitmessage</code> واضبط <code>git config commit.template .gitmessage</code> لتوجيه الجميع نحو المعيار.

خاتمة

كتابة رسالة commit جيدة تستغرق 90 ثانية إضافية وتوفر ساعات من التحقيق بعد ستة أشهر. العادة تتراكم: حين يكتب فريقك كله رسائل واضحة، يصبح git log دفتر قرارات قابل للبحث بدلًا من قائمة بالتواريخ وهاشات SHA. ابدأ بصيغة الأمر وسطر موضوع من 50 حرفًا — كل شيء آخر سيأتي تلقائيًا.

#Git #Workflow #Best Practices
العودة إلى جميع الأدلة

هل تحتاج مساعدة في مشروعك؟

احجز استشارة مجانية لمدة 30 دقيقة لمناقشة تحدياتك التقنية واستكشاف الحلول معًا.