DevOps3 دقيقة للقراءة

Git Workflow للمطورين — من الفوضى إلى النظام

دليل عملي لنظام عمل Git الاحترافي: التفريع الصحيح، كتابة Commits واضحة، التعامل مع التعارضات، وأوامر لا غنى عنها.

المشكلة الشائعة

كل مطور مررَ بهذا:

Bash
$ git log --oneline
a3f1c92 fix
b2e8d11 fix2
c9a7b33 asdf
d4e2f55 final
e1b8c44 final FINAL
f7a3d22 ok now it works

هذا ليس تاريخًا، هذا ضجيج. المقال هذا يُحوّله إلى:

Bash
$ git log --oneline
a3f1c92 fix(auth): handle expired token edge case
b2e8d11 feat(dashboard): add real-time notifications
c9a7b33 refactor(api): extract pagination helper
d4e2f55 docs: update deployment guide

استراتيجية التفريع

نموذج مبسط يناسب معظم المشاريع

Text
main          ←── الإنتاج دائمًا مستقر
  └─ develop  ←── الدمج اليومي
       ├─ feature/user-auth
       ├─ feature/dark-mode
       └─ fix/login-redirect
Bash
# إنشاء فرع جديد
git checkout -b feature/user-auth
 
# بعد الانتهاء — اندمج في develop
git checkout develop
git merge --no-ff feature/user-auth
 
# حذف الفرع
git branch -d feature/user-auth

Conventional Commits

أفضل صيغة مقننة لرسائل الـ commit:

Text
<type>(<scope>): <description>
 
[body اختياري]
 
[footer اختياري]

الأنواع الأساسية

النوعمتى تستخدمه
featميزة جديدة
fixإصلاح خطأ
refactorإعادة هيكلة بدون تغيير سلوك
docsتغييرات في التوثيق فقط
styleتنسيق، مسافات، فاصلة منقوطة
testإضافة أو تعديل tests
choreمهام صيانة (تحديث packages مثلًا)
perfتحسين أداء
Bash
# أمثلة
git commit -m "feat(auth): add Google OAuth login"
git commit -m "fix(cart): correct quantity calculation on mobile"
git commit -m "chore: upgrade Next.js to 15.2"

أوامر لا غنى عنها

rebase التفاعلي — تنظيف قبل الـ merge

Bash
# تنظيف آخر 5 commits
git rebase -i HEAD~5

تفتح محررًا تختار فيه:

  • pick — احتفظ بالـ commit كما هو
  • reword — غيّر رسالته فقط
  • squash — ادمجه مع السابق
  • drop — احذفه تمامًا

stash — احفظ العمل المؤقت

Bash
# احفظ التغييرات الحالية جانبًا
git stash push -m "work in progress: dark mode"
 
# اعرض القائمة
git stash list
 
# استعدها
git stash pop

bisect — اكتشاف من أين دخل الخطأ

Bash
git bisect start
git bisect bad              # الـ commit الحالي فيه خطأ
git bisect good v1.2.0      # هذا الـ tag كان يعمل
 
# Git يختار commits تلقائيًا، أنت تقول good أو bad
git bisect good
git bisect bad
# ... حتى يجد الـ commit المسبب

.gitignore الاحترافي

GITIGNORE
# Dependencies
node_modules/
.pnp
.pnp.js
 
# Build outputs
.next/
out/
dist/
build/
 
# Environment files — لا ترفعها أبدًا
.env
.env.local
.env.*.local
 
# IDE
.vscode/settings.json
.idea/
*.swp
*.swo
 
# OS
.DS_Store
Thumbs.db
 
# Logs
*.log
npm-debug.log*

لا ترفع ملفات .env أبدًا. إذا رفعتها بالخطأ، لا يكفي حذفها — يجب إبطال جميع المفاتيح السرية فيها فورًا.


إعداد Git مثالي

Bash
# هويتك
git config --global user.name "عزالدين عاطف"
git config --global user.email "your@email.com"
 
# محرر افتراضي
git config --global core.editor "code --wait"
 
# alias مفيدة
git config --global alias.lg "log --oneline --graph --all"
git config --global alias.st "status -sb"
git config --global alias.undo "reset --soft HEAD~1"
 
# تجنب تحويل line endings على Windows
git config --global core.autocrlf true

الآن git lg يعطيك تاريخًا مرئيًا جميلًا بدلًا من git log.