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-redirectBash
# إنشاء فرع جديد
git checkout -b feature/user-auth
# بعد الانتهاء — اندمج في develop
git checkout develop
git merge --no-ff feature/user-auth
# حذف الفرع
git branch -d feature/user-authConventional 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 popbisect — اكتشاف من أين دخل الخطأ
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.