We are still cooking the magic in the way!
Git و GitHub
عرض التاريخ
عرض التاريخ
فهم تاريخ مشروعك أمر بالغ الأهمية لتصحيح الأخطاء، ومراجعة الكود، والتعاون. في هذا الدرس، ستتقن الأوامر القوية التي توفرها Git لاستكشاف الالتزامات، ومقارنة التغييرات، والتنقل عبر تطور مشروعك.
أساسيات Git Log
أمر git log هو نافذتك إلى تاريخ المشروع:
# سجل أساسي (يظهر تفاصيل الالتزام الكاملة)
git log
# سطر واحد لكل التزام (أسهل للمسح)
git log --oneline
# إظهار آخر 5 التزامات
git log -5
# إظهار الالتزامات مع تغييرات الملفات
git log --stat
# إظهار الالتزامات مع تغييرات الكود الفعلية
git log -p
حقيقة مهمة: افتراضياً، يعرض
git log الالتزامات بترتيب زمني عكسي (الأحدث أولاً). اضغط q للخروج من عارض السجل، Space للتمرير لأسفل، وb للتمرير لأعلى.
تنسيق مخرجات Log
خصص كيفية عرض معلومات الالتزام:
# تمثيل رسومي للفروع
git log --graph --oneline --all
# إظهار مع التواريخ
git log --pretty=format:"%h - %an, %ar : %s"
# تنسيق مفصل مع ألوان
git log --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset" --abbrev-commit
# إظهار المراجع (الفروع، الوسوم)
git log --oneline --decorate
# إظهار جميع الفروع
git log --oneline --all
تصفية مخرجات Log
ابحث عن التزامات محددة بناءً على معايير مختلفة:
# حسب المؤلف
git log --author="John Smith"
# حسب نطاق التاريخ
git log --since="2024-01-01"
git log --after="2 weeks ago"
git log --before="2024-12-31"
git log --until="yesterday"
# حسب رسالة الالتزام
git log --grep="bug fix"
git log --grep="feature" --grep="update" --all-match
# الالتزامات التي عدّلت ملفاً محدداً
git log -- filename.txt
git log --follow -- renamed-file.txt # تتبع عبر إعادة التسمية
# الالتزامات في نطاق تاريخ
git log --since="2024-01-01" --until="2024-12-31"
نصيحة: اجمع المرشحات للبحث القوي! على سبيل المثال:
git log --author="Jane" --since="1 month ago" --grep="bug" يعرض جميع الالتزامات المتعلقة بالأخطاء بواسطة Jane في الشهر الماضي.
أمر Git Show
فحص التزامات محددة بالتفصيل:
# إظهار آخر التزام (HEAD)
git show
# إظهار التزام محدد
git show 2f8a7e9
# إظهار التزام محدد لملف
git show 2f8a7e9:path/to/file.txt
# إظهار رسالة الالتزام فقط
git show -s 2f8a7e9
# إظهار التغييرات لملف محدد في التزام
git show 2f8a7e9 -- filename.txt
# إظهار معلومات الوسم
git show v1.0.0
أمر Git Diff
قارن حالات مختلفة من مستودعك:
# التغييرات غير المنظمة (دليل العمل مقابل التنظيم)
git diff
# التغييرات المنظمة (التنظيم مقابل آخر التزام)
git diff --staged
git diff --cached # نفس --staged
# جميع التغييرات (دليل العمل مقابل آخر التزام)
git diff HEAD
# قارن التزامين
git diff abc123..def456
# قارن الفروع
git diff main..feature-branch
# إظهار أسماء الملفات المتغيرة فقط
git diff --name-only
# إظهار الإحصائيات
git diff --stat
فهم مخرجات Diff: الأسطر التي تبدأ بـ
- (أحمر) تم إزالتها، الأسطر بـ + (أخضر) تمت إضافتها. علامات @@ تظهر أرقام الأسطر حيث حدثت التغييرات.
مقارنة الفروع والالتزامات
فهم الاختلافات بين الفروع:
# الالتزامات في feature-branch وليست في main
git log main..feature-branch
# الالتزامات في main وليست في feature-branch
git log feature-branch..main
# جميع الالتزامات التي تختلف بين الفروع
git log main...feature-branch
# إظهار الفرق بين الفروع مع الملفات
git diff main..feature-branch --name-only
# قارن ملفات محددة بين الفروع
git diff main..feature-branch -- path/to/file.txt
# إظهار الالتزامات الفريدة للفرع الحالي
git log --no-merges main..HEAD
خيارات Log المتقدمة
خيارات قوية لحالات استخدام محددة:
# إظهار التزامات الدمج فقط
git log --merges
# استبعاد التزامات الدمج
git log --no-merges
# إظهار الالتزامات التي تضيف أو تزيل سلسلة محددة
git log -S "function_name"
# إظهار الالتزامات حيث تمت إضافة أو تعديل دالة
git log -G "function.*calculate"
# إظهار الالتزامات التي عدّلت أسطراً في نطاق
git log -L 10,20:filename.txt
# إظهار الأب الأول فقط (تاريخ خطي)
git log --first-parent
# عكس الترتيب (الأقدم أولاً)
git log --reverse
نصيحة للأداء: عند العمل مع مستودعات كبيرة، استخدم
--since أو حدد عدد الالتزامات باستخدام -n لتسريع استعلامات السجل.
تصور التاريخ
أنشئ تمثيلات مرئية لتاريخ التزاماتك:
# رسم ASCII للفروع
git log --graph --oneline --all
# رسم مفصل مع جميع المعلومات
git log --graph --all --decorate --stat
# تنسيق مخصص مع رسم
git log --graph --pretty=format:"%C(yellow)%h%Creset %C(cyan)%ar%Creset %C(green)%an%Creset %s %C(bold red)%d%Creset"
# إنشاء اسم مستعار لسجل جميل
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# الآن استخدمه مع:
git lg
إيجاد الأخطاء باستخدام Log
استخدم السجل لتتبع متى تم إدخال الأخطاء:
# ابحث عن وقت حذف ملف
git log --diff-filter=D -- path/to/file.txt
# ابحث عن وقت إضافة ملف
git log --diff-filter=A -- path/to/file.txt
# إظهار من غيّر سطراً محدداً (blame)
git blame filename.txt
# Blame مع نطاق أسطر
git blame -L 10,20 filename.txt
# ابحث عن الالتزامات التي لمست كوداً محدداً
git log -S "buggy_function" -p
# إظهار تاريخ دالة
git log -L :function_name:filename.js
نصيحة احترافية: أنشئ أسماء مستعارة مخصصة لأكثر تنسيقات السجل استخداماً. مثال:
git config --global alias.recent 'log --oneline -10' ينشئ اختصاراً لرؤية آخر 10 التزامات باستخدام git recent.
أمثلة عملية
سيناريوهات من العالم الحقيقي لعرض التاريخ:
# السيناريو 1: ابحث عن جميع الالتزامات بواسطة عضو فريق هذا الأسبوع
git log --author="Alice" --since="1 week ago" --oneline
# السيناريو 2: انظر ما تغير في آخر إصدار
git log v1.0..v1.1 --oneline
# السيناريو 3: ابحث عن وقت إدخال خطأ
git log --grep="fix" --grep="bug" --since="1 month ago"
# السيناريو 4: راجع التغييرات قبل الدفع
git log origin/main..HEAD --oneline
# السيناريو 5: ابحث عن جميع التغييرات لملفات التكوين
git log --oneline -- "*.config"
# السيناريو 6: انظر تاريخ الالتزامات لملف معاد تسميته
git log --follow -- current-filename.js
استخدام Git Shortlog
لخص المساهمات حسب المؤلف:
# ملخص الالتزامات لكل مؤلف
git shortlog
# فقط عد الالتزامات لكل مؤلف
git shortlog -s -n
# إظهار عناوين البريد الإلكتروني
git shortlog -s -e
# لنطاق زمني محدد
git shortlog --since="1 month ago"
# استبعاد التزامات الدمج
git shortlog --no-merges
تمرين تطبيقي:
التحدي: باستخدام أوامر git log، أجب عن هذه الأسئلة حول مستودعك:
- كم عدد الالتزامات التي تم إجراؤها في الشهر الماضي؟
- من هو المساهم الأكثر نشاطاً (معظم الالتزامات)؟
- ابحث عن جميع الالتزامات التي تذكر "security" في الرسالة
- ما الملفات التي تغيرت في آخر 3 التزامات؟
- أظهر رسماً بيانياً لآخر 10 التزامات
الأوامر المستخدمة:
# 1. عد الالتزامات الأخيرة
git log --since="1 month ago" --oneline | wc -l
# 2. المساهم الأكثر نشاطاً
git shortlog -s -n | head -1
# 3. ابحث عن التزامات الأمان
git log --grep="security" --oneline
# 4. الملفات المتغيرة في آخر 3 التزامات
git log -3 --name-only --pretty=format:""
# 5. رسم بياني
git log --graph --oneline -10
أفضل ممارسات Git Log
✓ افعل:
- استخدم --oneline للمسح السريع
- اجمع المرشحات لتضييق النتائج
- استخدم --stat لرؤية الملفات المتغيرة
- أنشئ أسماء مستعارة لتنسيقات السجل الشائعة
- استخدم --grep للعثور على التزامات محددة
- تابع الملفات المعاد تسميتها باستخدام --follow
✗ لا تفعل:
- تشغيل git log بدون حدود على المستودعات الضخمة
- نسيان استخدام q للخروج من العارض
- تجاهل --since/--until للتواريخ الكبيرة
- الخلط بين .. و ... في مقارنات النطاق
- نسيان أن السجل يعرض أحدث الالتزامات أولاً
الملخص
في هذا الدرس، تعلمت:
- استخدام
git logمع خيارات التنسيق المختلفة - تصفية الالتزامات حسب المؤلف والتاريخ والرسالة
- استخدام
git showلفحص التزامات محددة - مقارنة التغييرات باستخدام
git diff - إيجاد الاختلافات بين الفروع والالتزامات
- إنشاء تمثيلات مرئية للتاريخ
- استخدام السجلات لتصحيح الأخطاء وتتبع التغييرات
- إنشاء أسماء مستعارة مخصصة للكفاءة
التالي: في الدرس التالي، سنتعلم كيفية التراجع عن التغييرات بأمان باستخدام أوامر Git المختلفة لسيناريوهات مختلفة!