الدرس الذي فات وصّلك لكورس Git و GitHub (6 ساعات، مجاناً على قناتي). وهذا الدرس يقلك ما منه يهمك بالتحديد كمهندس أتمتة.
لأنه Git أداة عامة لكل المبرمجين — لكن استخدام المؤتمت إلها مختلف قليلاً. في أشياء ستعملها كل يوم، وأشياء لن تلمسها، وفي فخّ واحد خاص بمشاريع الأتمتة سنحكي عنه.
بنهاية هذا الدرس، ستكون قادراً على:
.gitignore صحيح لمشروع أتمتةgit status # وين أنا؟ — قبل أي شيء
git add . # جهّز كل التغييرات
git add src/test/java/pages/ # أو مجلد محدّد
git commit -m "أضف اختبارات السلة"
git push
git pull
git log --oneline -10 # آخر عشر commits
git diff # ما غيّرت؟git status قبل كل شي. أكثر خطأ يحدث هو git add . وانت مش داري إنه في ملفات لا تريد أن تضيفها — زي ملف إعدادات فيه كلمة سر، أو مجلد target/ كامل.git switch -c feature/cart-tests # فرع جديد
git switch main # رجوع
git switch - # للفرع السابق
git branch # قائمة الفروع
git branch -d feature/cart-tests # حذف بعد الدمجكيف تنظّم فروعك كمؤتمت:
| الفرع | لـ |
|---|---|
feature/cart-tests |
مجموعة اختبارات جديدة |
fix/flaky-login-test |
إصلاح اختبار متذبذب |
refactor/page-objects |
إعادة هيكلة بدون تغيير سلوك |
chore/upgrade-selenium |
ترقية مكتبات |
.gitignore — أهم ملف بمشروع الأتمتةهذا الجزء الذي كورس Git العام لا يغطيه، وهو الأهم إلك.
# ── Maven ─────────────────────────
target/
# ── IntelliJ ──────────────────────
.idea/
*.iml
# ── نتائج التشغيل والتقارير ─────────
allure-results/
allure-report/
test-output/
screenshots/
target/evidence/
*.log
# ── التنزيلات من الاختبارات ─────────
downloads/
# ── drivers محلية (لو مشروع قديم) ───
drivers/
chromedriver*
geckodriver*
# ── أسرار ──────────────────────────
.env
*.local.properties
secrets/
# ── نظام التشغيل ───────────────────
.DS_Store
Thumbs.db.env فيه كلمة سر الأدمن، أو local.properties فيه توكن API — لو انعمل له commit مرة واحدة، هو بتاريخ Git للأبد. حتى لو شلته بـ commit تالي، أي حد عنده وصول للمستودع يستطيع يقراه من التاريخ.
افحص الآن: شغّل git status وشوف إذا في ملف أسرار بالقائمة. ولو لقيت — أضفه لـ .gitignore قبل أي commit.target/ أهم سطر تقني. بدونه ستعمل commit لمجلد فيه آلاف الملفات المترجمة ولقطات الشاشة، والمستودع يحدث مئات الميجابايت. وهذا أشهر خطأ بأول مشروع أتمتة.بمشروع أتمتة، التعارضات تصبح بمكانين تقريباً دايماً:
1. pom.xml — أنت أضفت مكتبة وزميلك أضاف مكتبة أخرى بنفس المكان
2. الـ Page Objects — أنت أضفت محدد وزميلك أضاف محدد بنفس الصفحة
git pull # ويحدث تعارض
# تفتح الملف، ترى:<<<<<<< HEAD
private static final By CART_TOTAL = By.cssSelector("[data-test='cart-total']");
=======
private static final By CART_COUNT = By.cssSelector("[data-test='cart-count']");
>>>>>>> mainالحل هون سهل: خلّي الاثنين.
private static final By CART_TOTAL = By.cssSelector("[data-test='cart-total']");
private static final By CART_COUNT = By.cssSelector("[data-test='cart-count']");git add .
git commitgit pull كل صبح قبل أن تبدأ. أبسط عادة وأكثرها فايدة — لأنه التعارض بين تغييرات يوم أسهل بمراتب من تعارض بين تغييرات أسبوع.
وقسّم صفحاتك. لو CartPage فيها 300 سطر وكل الفريق بيعدّلها، سيكون في تعارض كل يوم. والحل مش Git — الحل إنك تفصل المكوّنات (كما أخذنا بدرس Components).كود الاختبار كود. وبيتراجع بـ PR زي أي كود.
git switch -c feature/checkout-tests
# ... تكتب الاختبارات
git add .
git commit -m "أضف اختبارات إتمام الشراء"
git push -u origin feature/checkout-tests
# وبعدها تفتح PR على GitHubما المراجع بيدوّر عليه بمراجعة كود اختبار:
Thread.sleep؟ ← رفضdata-test مش nth-child)Assert بالـ Page Object؟ ← رفض# تراجع عن تغيير ما عملت له commit
git restore src/test/java/pages/CartPage.java
# تراجع عن add
git restore --staged .
# عدّل آخر رسالة commit
git commit --amend -m "الرسالة الصح"
# اشطب آخر commit لكن خلّي التغييرات
git reset --soft HEAD~1
# احفظ شغلك مؤقتاً وانتقل لفرع آخر
git stash
git switch main
# ... وبعدها
git switch -
git stash popgit reset --hard تمسح شغلك بلا رجعة. لا تستخدمها إلا وانت متأكد 100%. وgit stash بديل آمن عندما تريد أن تبدّل فروع بسرعة.هؤلاء موجودين بكورس Git، وممتازين تعرف إنهم موجودين — لكن لن تستخدمهم كثير:
rebase التفاعلي وإعادة كتابة التاريخcherry-picksubmodulesbisectreflogmerge بتكفيك بـ 95% من الحالات. وrebase أنيق لكن أخطر — ولو الفريق لا يستخدمه، ما تبدأ فيه بنفسك..gitignore فيه target/ و allure-results/ و .envgit status نظيف)main مباشرةgit pull كل صبحgit status قبل كل شي — يمنع git add . لملفات لا تريد إياها.
فرع لكل مجموعة اختبارات، مش لكل اختبار — حتى تكون وحدة مراجعة منطقية.
.gitignore أهم ملف بمشروع أتمتة.
سرّ انعمل له commit مرة = موجود بتاريخ Git للأبد — حتى لو شلته بعد ذلك.
target/ أهم سطر تقني — بدونه المستودع يحدث مئات الميجابايت.
معظم تعارضات الأتمتة إضافتان مستقلتان — والحل احتفظ بالاثنين.
والتعارض الخطر هو نفس المحدد — اسأل زميلك، واحد منكم عنده معلومة أحدث.
git pull كل صبح — أبسط عادة وأكثرها فايدة.
صفحة فيها 300 سطر تخلق تعارض يومي — والحل فصل المكوّنات مش Git.
ست أسئلة مراجعة كود الاختبار هي كل الكورس مختصر — استخدمها على كودك قبل لا تفتح PR.
وبهيك خلصنا قسم Git و GitHub. روح خذ الكورس على القناة (6 ساعات بس!)، وشوفك بالقسم الحادي عشر — تصميم Framework.
من هون ورايح، منبني! 🏗️