تجاوز إلى المحتوى

تعلم Git من الصفر: الأوامر الأساسية وGitHub عمليًا

Git من الصفر: إدارة الكود باحترافية من اليوم الأول

لو بتشتغل على مشروع وبتخاف تغير سطر واحد لحسن حاجة تتكسر، أو ملفاتك اسمها «نهائي» و«نهائي-بجد»، فالمقال ده معمول عشانك. هتتعلم Git من التثبيت لحد أول مشروع على GitHub — من غير حشو، ومن غير ما تحفظ أوامر مش فاهمها.

18 أمرًاجدول مرجعي كامل بالأوامر اللي هتستخدمها فعلًا — مش قائمة حفظ وخلاص
14 يومًاخطة عملية يوم بيوم: من أول تثبيت لحد أول مشروع مرفوع على GitHub
10 مصادرموثقة بروابطها المباشرة وشارات صادقة — كلها مجانية ومتحقق منها
صفر خوفهتتعلم تصلح أي غلطة: حذف بالغلط، commit غلط، تعارض دمج — كل حاجة وليها حل

إعلان

لو ملفات مشروعك اسمها «نهائي-v2»… عندك مشكلة

افتح أي مجلد مشروع عند مبتدئ، وهتلاقي المشهد ده: project-final.zip، project-final-v2.zip، project-final-v2-REALLY-FINAL.zip. كل نسخة اتعملت في لحظة خوف: «خليني أحفظ نسخة قبل ما أجرب الحاجة دي، لحسن تبوظ». والنتيجة؟ مجلد مليان نسخ، ومحدش عارف إيه الفرق بينهم، ولو سألت صاحبهم «النسخة الشغالة فين؟» هيحتاج عشر دقايق يدور.

المشكلة إن الطريقة دي مش بس فوضوية — دي خطيرة. نسخة واحدة تتمسح بالغلط، أو تنسى إنت غيرت إيه في أنهي نسخة، والمشروع كله يبقى في مهب الريح. والأسوأ: الطريقة دي بتخليك تخاف تجرب. كل تعديل جديد مخاطرة، وكل فكرة جديدة محتاجة «نسخة احتياطية» قبلها. الخوف ده هو اللي بيقتل التعلم، لأن البرمجة أصلًا تجربة وغلط وتصليح.

الحل مش إنك تبقى «منظم أكتر» — الحل إنك تستخدم أداة معمولة مخصوص للمشكلة دي. اسمها Git. وهي باختصار: شبكة أمان لمشاريعك. بتحفظ نسخة من شغلك كل مرة تقولها، وبتخليك ترجع لأي لحظة في تاريخ المشروع، وتجرب أي فكرة مجنونة من غير خوف، لأن الرجوع دايمًا ممكن.

الوعد بتاع المقال ده

بعد المقال ده هتعرف: تثبّت Git وتجهّزه، تبدأ مشروع وتحفظ نسخه، تشتغل بفروع من غير ما تكسر حاجة، ترفع شغلك على GitHub، وتصلح أي غلطة هتعملها. كل ده بأوامر هتفهمها مش هتحفظها.

ملاحظة صريحة قبل ما نبدأ: Git في الأول بيبان مخيف — أوامر إنجليزية وشاشة سودا ومصطلحات غريبة. ده طبيعي. بس الحقيقة إنك محتاج تفهم 5 مفاهيم و18 أمر بس عشان تشتغل باحترافية يومية. الباقي تفاصيل هتتعلمها لما تحتاجها. خلينا نبدأ بأهم سؤال.

إيه هو Git؟ (بجملة واحدة)

Git نظام بيحفظ نسخة من مشروعك كل مرة تقوله «احفظ»، وبيخليك ترجع لأي نسخة في أي وقت، وتشوف إيه اللي اتغير بين النسخ.

خلص التعريف. أي شرح أطول من كده في البداية تشتيت. بس فيه 3 نقط لازم تتثبت من أول يوم:

  1. Git بيشتغل على جهازك: مش محتاج إنترنت، مش محتاج حساب، مش محتاج حد. بتنزله وبتستخدمه على ملفاتك فورًا.
  2. Git بيحفظ «الفروق» مش النسخ الكاملة: لما تقوله احفظ، هو مش بينسخ المجلد كله — هو بيسجل إيه اللي اتغير بس. عشان كده سريع وخفيف مهما كبر المشروع.
  3. Git مش GitHub: دي أشهر لخبطة عند المبتدئين، وتستاهل جدول لوحدها.
Git GitHub
برنامج بتنزله على جهازك موقع على الإنترنت
بيحفظ نسخ مشروعك محليًا بيستضيف نسخة من مشروعك أونلاين
بيشتغل من غير إنترنت محتاج إنترنت وحساب
هو الأساس اللي لازم تتعلمه الأول مبني فوق Git — بيضيف مشاركة وتعاون
مثال: القلم اللي بتكتب بيه مثال: المكتبة اللي بتحط فيها كتبك عشان الناس تشوفها

الترتيب الصح: اتعلم Git الأول على جهازك، وبعدين ارفع على GitHub. اللي بيبدأ من GitHub من غير ما يفهم Git بيبقى زي اللي بيسوق عربية من غير ما يعرف الفرامل فين — ماشي، لحد أول مشكلة.

ليه «من اليوم الأول»؟

لأن العادة أهم من المهارة. اللي بيبدأ أي مشروع — حتى لو صفحة HTML واحدة — بأمر git init، بعد شهر بيبقى عنده تاريخ كامل لكل اللي اتعلمه، ومعرض أعمال حقيقي على GitHub. واللي «هيتعلم Git بعدين» غالبًا عمره ما بيتعلمه، وبيفضل خايف من أول مشروع حقيقي يشتغل عليه.

ثبّت Git وجهّزه في 5 دقائق

التثبيت أسهل مما تتخيل. اختار نظامك:

على ويندوز

نزّل المثبت من الموقع الرسمي git-scm.com، وشغّله، ودوس «التالي» على كل حاجة بالإعدادات الافتراضية. الإعدادات الافتراضية مناسبة للمبتدئ تمامًا — متغيرش حاجة مش فاهمها. بعد التثبيت هتلاقي عندك برنامج اسمه Git Bash — دي الشاشة السودا اللي هتكتب فيها الأوامر.

على ماك

افتح الـTerminal واكتب الأمر ده، والنظام هيعرض عليك تثبيت أدوات المطورين اللي جواها Git:

# macOS: تثبيت أدوات المطورين (جواها Git) xcode-select –install

على لينكس

# Ubuntu / Debian sudo apt update && sudo apt install git # Fedora sudo dnf install git

الإعداد الأول (مرة واحدة بس)

بعد التثبيت، افتح الـTerminal أو Git Bash واكتب الأمرين دول — بيقولوا لـGit اسمك وإيميلك عشان يتسجلوا على كل نسخة بتحفظها:

# اكتب اسمك وإيميلك الحقيقيين git config –global user.name “Your Name” git config –global user.email “you@example.com” # خلي اسم الفرع الافتراضي main (المعيار الحالي) git config –global init.defaultBranch main

اتأكد إن كل حاجة تمام بالأمر ده:

git –version git version 2.x.x — كده Git شغال وجاهز
نقطة بتوقع ناس كتير

الإيميل اللي بتكتبه هنا يفضل يكون نفس إيميل حساب GitHub اللي هتعمله بعدين. مش إجباري، لكنه بيخلي مساهماتك تظهر على حسابك بشكل صحيح بدل ما تظهر باسم مجهول.

إعلان

أول مستودع: init وadd وcommit

كلمة «مستودع» (Repository) بتخوف ناس كتير، وهي أبسط مما تتخيل: مجلد عادي جواه مجلد مخفي اسمه .git بيحفظ تاريخ كل التغييرات. يعني أي مجلد مشروع عندك ممكن يبقى مستودع بأمر واحد.

خلينا نعملها عمليًا. افتح الـTerminal ونفذ الأوامر دي سطر سطر — ومتكملش قراءة قبل ما تجرب بنفسك:

# 1. اعمل مجلد جديد وادخل جواه mkdir my-first-project cd my-first-project # 2. حوّله لمستودع Git git init Initialized empty Git repository — مبروك، ده مستودع دلوقتي # 3. اعمل ملف واكتب فيه أي حاجة echo “Hello Git” > notes.txt # 4. شوف حالة المستودع git status Untracked files: notes.txt — يعني Git شايف الملف بس لسه مش بيتابعه # 5. قول لـGit: تابع الملف ده git add notes.txt # 6. احفظ نسخة (commit) برسالة واضحة git commit -m “Add notes.txt with first hello message”

خلصت. انت دلوقتي عندك أول commit — أول نسخة محفوظة في تاريخ مشروعك. لو فتحت الملف وغيّرت فيه أي حاجة وبوّظته، تقدر ترجع للنسخة دي في أي وقت. الإحساس ده — إنك تقدر تجرب أي حاجة من غير خوف — هو اللي Git بيبيعهولك.

رسالة الـcommit الكويسة بتتكتب إزاي؟

رسالة الـcommit هي اللي هتقراها بعد شهرين لما تسأل نفسك «أنا كنت بعمل إيه هنا؟». القواعد:

  • فعل أمر في المضارع: «Add login page» مش «Added» ومش «login page». كأنك بتقول للمشروع: اعمل كده.
  • قصيرة وواضحة: سطر واحد يوصف التغيير. لو محتاج تشرح أكتر، ده معناه إن الـcommit نفسه كبير زيادة.
  • commit واحد = تغيير واحد: متحطش تعديل صفحة الدخول مع إصلاح خطأ في صفحة تانية في نفس الـcommit. كل commit فكرة واحدة.
# أمثلة صح git commit -m “Add contact form validation” git commit -m “Fix navbar overlapping on mobile” git commit -m “Update README with setup instructions” # أمثلة غلط — هتندم عليها بعد شهر git commit -m “fix” git commit -m “updates” git commit -m “aaaaaaaa final”
القاعدة الذهبية

Commit early, commit often. احفظ نسخ كتير صغيرة بدل نسخة واحدة ضخمة كل أسبوع. الـcommit الرخيص (سطر واحد واضح) هو اللي بينقذك لما تحتاج ترجع — لأنك هترجع خطوة صغيرة مفهومة مش قفزة مجهولة.

الحالات الثلاث: افهمها مرة واحدة وارتاح

أكبر لخبطة عند المبتدئين: «أنا عملت git add… ليه الملف متحفظش؟» أو «عملت تعديل… ليه git status بيقول مفيش حاجة؟». السبب إن Git عنده 3 حالات للملفات، ومعظم الأوامر بتنقل الملفات بين الحالات دي. افهم الصورة دي مرة واحدة، و90% من لخبطة Git هتختفي:

رحلة الملف في Git (من اليمين لليسار) مساحة العملWorking Directoryملفاتك العادية منطقة التجهيزStaging Areaاللي هيتحفظ المستودعRepositoryالنسخ المحفوظة git add git commit git status بيوضح لك كل ملف واقف في أنهي مرحلة دلوقتي

الصورة اللي لازم تتحفر في دماغك: تعديل ← تجهيز (add) ← حفظ (commit)

  • مساحة العمل (Working Directory): ملفاتك زي ما هي على جهازك. أي تعديل بتعمله هنا Git شايفه بس لسه «مش متابعه» للحفظ.
  • منطقة التجهيز (Staging Area): لما تعمل git add، انت بتقول: «الملفات دي جاهزة للحفظ في النسخة الجاية». دي مرحلة المراجعة — بصة أخيرة قبل الحفظ.
  • المستودع (Repository): لما تعمل git commit، النسخة بتتحفظ رسميًا في تاريخ المشروع. دي النقطة اللي تقدر ترجع لها دايمًا.

ليه مرحلتين (add ثم commit) مش خطوة واحدة؟ عشان تتحكم في إيه بالظبط اللي يدخل النسخة. ممكن تعدل 5 ملفات، وتجهز 3 منهم بس للـcommit ده، وتسيب الاتنين التانيين للـcommit اللي بعده. التحكم الدقيق ده هو اللي بيخلي تاريخ مشروعك نظيف ومفهوم.

3 أوامر للمتابعة اليومية

# شوف حالة كل ملف: إيه اتعدل؟ إيه اتجهز؟ إيه مش متتابع؟ git status # شوف الفروق بالتفصيل قبل ما تحفظ: إيه اللي اتغير سطر سطر؟ git diff # شوف الفروق اللي جهزتها بـ add ولسه متحفظتش git diff –staged # شوف تاريخ النسخ المحفوظة: كل commit برسالتها ووقتها git log –oneline a3f9c1d Add contact form validation 7b2e4aa Fix navbar overlapping on mobile 1c8d3f2 Initial commit
عادة المحترفين

قبل كل commit: شغّل git status ثم git diff –staged وراجع اللي هتحفظه سطر سطر. الدقيقتين دول بيمنعوا 90% من الـcommits الغلط — ملف نسيته، أو تعديل تجريبي دخل بالغلط، أو بيانات حساسة كانت هتتحفظ.

إعلان

الفروع: اشتغل بحرية من غير ما تكسر حاجة

وصلنا لأقوى فكرة في Git — واللي بتفرقه عن أي طريقة نسخ يدوية. الفرع (Branch) هو نسخة موازية من مشروعك بتشتغل عليها بحرية كاملة، والنسخة الأصلية (الفرع الرئيسي main) بتفضل سليمة وشغالة.

مثال واقعي: موقعك شغال والعملاء بيستخدموه. عاوز تجرب تصميم جديد للصفحة الرئيسية. من غير Git: هتعدل على الملفات الحية وتدعي إن حاجة متتكسرش. مع Git: تعمل فرع جديد، تجرب فيه براحتك لأيام، ولو التصميم طلع وحش — تمسح الفرع كأن شيئًا لم يكن. ولو طلع حلو — تدمجه في النسخة الرئيسية بأمر واحد.

الفرع: تجربة آمنة ثم دمج (الزمن من اليمين لليسار) main: النسخة المستقرة فرع التجربة: new-design دمج merge

الفرع الرئيسي شغال طول الوقت — والتجربة بتحصل في فرع منفصل آمن

أوامر الفروع الأساسية

# اعمل فرع جديد وانتقل له في خطوة واحدة git switch -c new-design # شوف كل الفروع والفرع اللي واقف عليه دلوقتي (عليه نجمة) git branch # انتقل بين الفروع git switch main git switch new-design # بعد ما تخلص شغلك على الفرع: ارجع لـ main وادمج git switch main git merge new-design # امسح الفرع بعد الدمج (خلصت مهمته) git branch -d new-design

ملاحظة عن git switch: الأمر القديم كان git checkout ولسه شغال، لكن switch أوضح للمبتدئ لأنه مخصص للتنقل بين الفروع بس. استخدم switch وريح دماغك.

تعارض الدمج (Merge Conflict) — مش نهاية العالم

التعارض بيحصل لما انت وزميلك (أو انت نفسك في فرعين) تعدلوا نفس السطور في نفس الملف. Git مش عارف يختار أنهي تعديل، فبيوقف الدمج وبيقولك: «قرر انت». وده مش خطأ — ده Git بيحميك من إنه يختار غلط نيابة عنك.

لما يحصل تعارض، هتلاقي في الملف علامات زي دي:

علامات التعارض جوه الملف — احذفها واختار النسخة الصح بنفسك <<<<<<< HEAD Welcome to our store ======= Welcome to our amazing store >>>>>>> new-design

الحل: افتح الملف، احذف العلامات، وخلّي النسخة النهائية اللي انت عاوزها (ممكن تدمج الاتنين يدويًا)، ثم:

# بعد ما تصلح الملف يدويًا git add . git commit -m “Resolve merge conflict in welcome message”
القاعدة اللي بتمنع معظم التعارضات

اشتغل كل واحد في فرعه، وادمج كتير على فترات قصيرة بدل دمج ضخم كل شهر. التعارضات بتكبر مع حجم الفروق — دمج يومي صغير أسهل بكتير من دمج شهري مرعب.

GitHub: ارفع أول مشروع للإنترنت

دلوقتي عندك Git شغال على جهازك وبتحفظ نسخ محليًا. الخطوة اللي بعدها: GitHub — المكان اللي بترفع عليه مشاريعك عشان تبقى متاحة أونلاين: نسخة احتياطية بره جهازك، ومعرض أعمال يشوفه أي حد، ومنصة تعاون مع فريق.

اعمل حساب ومستودع على GitHub

  1. ادخل على github.com واعمل حساب مجاني (الحساب المجاني بيديك مستودعات خاصة غير محدودة — مفيش حاجة ناقصة للمبتدئ).
  2. دوس زر New repository (أو علامة + فوق).
  3. اكتب اسم المستودع بالإنجليزية بشرطات: my-first-project.
  4. اختار Public لو عاوزه يظهر في معرض أعمالك، أو Private لو مشروع شخصي.
  5. متعلّمش على Add a README file — لأن عندك مشروع جاهز على جهازك وعاوز ترفعه.
  6. دوس Create repository.

اربط مشروعك المحلي وارفعه

GitHub هيعرض لك أوامر جاهزة — انسخها ونفذها في مجلد مشروعك:

# اربط المستودع المحلي بالمستودع البعيد (مرة واحدة بس) git remote add origin https://github.com/YOUR-USERNAME/my-first-project.git # ارفع الفرع الرئيسي — وحرف u بيخلي الرفع الجاي من غير تفاصيل git push -u origin main done — افتح صفحة المستودع على GitHub وهتلاقي ملفاتك هناك

كلمة origin دي مجرد اسم مستعار لرابط المستودع البعيد — تقليد متعارف عليه، مش أمر سحري. و-u اختصار –set-upstream: بتربط فرعك المحلي بالفرع البعيد، عشان بعد كده تكتب git push بس من غير ما تحدد كل مرة.

جهازك وGitHub: نسختان متزامنتان جهازكالمستودع المحليشغلك اليومي هنا GitHubالمستودع البعيدالنسخة الأونلاين git push (رفع) git pull (سحب)

push بيطلع شغلك لفوق — pull بينزّل التحديثات لتحت

الأوامر اللي هتستخدمها مع GitHub يوميًا

# نزّل آخر التحديثات من GitHub لجهازك (اعملها أول حاجة كل يوم) git pull # ارفع الـcommits الجديدة بتاعتك git push # انسخ مشروع كامل من GitHub لجهازك (أول مرة بس) git clone https://github.com/USERNAME/project-name.git # شوف المستودعات البعيدة المرتبطة بمشروعك git remote -v
الفرق بين clone وpull

clone بتنسخ مشروع كامل أول مرة — بتستخدمها مرة واحدة لكل مشروع. pull بتجيب التحديثات بس لمشروع موجود عندك — بتستخدمها كل يوم. لخبطة الاتنين من أشهر أخطاء المبتدئين.

إعلان

يومك الطبيعي مع Git: الـworkflow الذهبي

بعد ما تفهم المفاهيم، الشغل اليومي بيبقى روتين ثابت من 5 خطوات. احفظ الترتيب ده — هو اللي هتمشي عليه في كل مشروع:

الخطوة الأمر إمتى؟
1. حدّث مشروعك git pull أول حاجة لما تبدأ شغل — عشان تشتغل على أحدث نسخة
2. اشتغل عادي — عدّل ملفاتك في المحرر زي ما انت متعود، Git بيراقب في صمت
3. راجع اللي اتغير git status ثم git diff قبل الحفظ — بصة سريعة تتأكد إن كل حاجة مقصودة
4. جهّز واحفظ git add . ثم git commit -m “رسالة واضحة” كل ما تخلص فكرة واحدة مكتملة — مش آخر اليوم
5. ارفع git push آخر اليوم أو كل ما تخلص جزء مهم — عشان النسخة الأونلاين تتحدث

لاحظ إن git add . (بنقطة) بيجهز كل الملفات المتغيرة مرة واحدة. عملي وسريع، لكن للمبتدئ الأفضل في الأول يجهز ملف ملف (git add filename) لحد ما يتعود يراجع قبل الحفظ. السرعة تيجي بعد الدقة، مش قبلها.

اختبار الـ60 ثانية

لو قدرت تشرح لحد: «بعدل، وبعدين add للتجهيز، وcommit للحفظ، وpush للرفع» — يبقى فهمت 80% من Git العملي. الباقي تفاصيل بتتعلمها عند الحاجة.

دلّع نفسك: أسماء مختصرة للأوامر اللي بتكررها

بعد أسبوع من الاستخدام هتلاحظ إنك بتكتب git status وgit log –oneline عشرات المرات يوميًا. Git بيسمح لك تعمل أسماء مختصرة (aliases) — اختصارات شخصية بتتكتب مرة واحدة وتفضل معاك:

# اختصارات عملية — نفذها مرة واحدة بس git config –global alias.st status git config –global alias.co checkout git config –global alias.br branch git config –global alias.lg “log –oneline –graph –all” # من هنا ورايح: git st نفس نتيجة git status — بأحرف أقل git lg تاريخ مرسوم بيانيًا: الفروع والدمج واضحين بصريًا

الأمر git lg بالذات يستاهل التجربة: بيرسم تاريخ مشروعك كشجرة، فبتشوف الفروع وهي طالعة وراجعة تندمج — الصورة اللي شرحناها بالكلام في قسم الفروع هتشوفها حية على مشروعك. ولو حابب الألوان أوضح، Git ملوّن افتراضيًا في معظم التثبيتات الحديثة، ولو مش ملوّن عندك فعّلها بأمر واحد: git config –global color.ui auto. تفاصيل صغيرة، لكنها بتخلي الشاشة السودا ألطف بكتير في أول أسابيعك.

جدول الأوامر المرجعي: 18 أمر لازم تعرفهم

ده الجدول اللي هترجع له كتير — احفظ المقال في مفضلتك. الأوامر مرتبة من الأكثر استخدامًا للأقل:

الأمر بيعمل إيه؟ مثال
git init يحوّل مجلد عادي لمستودع Git git init
git status يعرض حالة الملفات: إيه اتعدل وإيه اتجهز git status
git add ينقل ملفات لمنطقة التجهيز git add index.html أو git add . للكل
git commit يحفظ نسخة رسمية برسالة git commit -m “Add hero section”
git log يعرض تاريخ النسخ المحفوظة git log –oneline للعرض المختصر
git diff يعرض الفروق سطر سطر قبل الحفظ git diff أو git diff –staged
git branch يعرض الفروع أو ينشئ فرعًا جديدًا git branch feature-x
git switch يتنقل بين الفروع git switch -c feature-x للإنشاء والانتقال معًا
git merge يدمج فرعًا في الفرع الحالي git merge feature-x
git clone ينسخ مستودعًا كاملًا من رابط git clone https://github.com/user/repo.git
git push يرفع الـcommits للمستودع البعيد git push -u origin main أول مرة
git pull ينزّل التحديثات من البعيد ويدمجها git pull
git remote يدير الروابط للمستودعات البعيدة git remote add origin <url>
git restore يرجع ملفًا لآخر نسخة محفوظة (يلغي تعديلات) git restore style.css
git reset يلغي تجهيز ملفات أو يرجع لمستوى commit معين git reset HEAD file.js
git revert يعكس commit معين بـcommit جديد (آمن للشغل الجماعي) git revert a3f9c1d
git stash يخبي تعديلاتك مؤقتًا من غير commit git stash ثم git stash pop للاسترجاع
git rm يحذف ملفًا من المشروع ومن التتبع معًا git rm old-file.txt

متحاولش تحفظ الجدول ده — هتحفظه لوحده بالاستخدام. أول أسبوع هتحتاج أول 6 أوامر بس. الفروع هتحتاجها أول ما تبدأ تجربة منفصلة. أوامر الإصلاح هتحتاجها أول ما تغلط — وهيحصل، وده طبيعي.

إعلان

إصلاح الكوارث: كل غلطة وليها حل

أجمل حاجة في Git إنه معمول عشان الإنسان اللي بيغلط — يعني انت. كل سيناريو خوف عندك، ليه حل بأمر واحد. خلينا نعدي على أشهر الكوارث:

1. عدّلت ملف وعاوز ترجع لآخر نسخة محفوظة

# يلغي كل تعديلاتك غير المحفوظة في الملف ده — بحذر! git restore filename.txt

تحذير صريح: الأمر ده بيمسح تعديلاتك نهائيًا من غير رجعة. استخدمه وانت متأكد إنك مش محتاج التعديلات دي. لو مش متأكد — اعمل commit الأول وبعدين قرر.

2. عملت add لملف بالغلط وعاوز تلغيه من التجهيز

# يرجع الملف من منطقة التجهيز لمساحة العمل — تعديلاتك محفوظة git reset HEAD filename.txt

الأمر ده آمن تمامًا: بيلغي الـadd بس، والملف وتعديلاته زي ما هم.

3. عملت commit وعاوز تعدل رسالته

# يفتح لك تعديل رسالة آخر commit — بس لو لسه مرفعتوش git commit –amend -m “الرسالة الصحيحة”

شرط مهم: مستخدموش على commit اترفع already واشتغل عليه حد تاني. تعديل التاريخ المنشور بيعمل لخبطة للفريق. على شغلك المحلي بس — آمن.

4. عملت commit غلط وعاوز ترجع عنه بأمان

# بيعمل commit جديد بيعكس تأثير الـcommit الغلط — التاريخ بيفضل سليم git revert HEAD

ده الحل «المهذب»: بدل ما تمسح الغلطة من التاريخ، بتعمل عكسها رسميًا. التاريخ بيفضل واضح: غلطة حصلت، واتصلحت. الفرق الجوهرية بتفضل ده لأنه مش بيكسر شغل حد.

5. محتاج تبدل فرع بسرعة وشغلك لسه مخلصش

# خبي تعديلاتك في درج مؤقت git stash # … اعمل اللي محتاجه على الفرع التاني … # رجع تعديلاتك من الدرج git stash pop

stash زي درج المكتب: بتحط فيه الورق المتنطور بسرعة عشان تنضف المكتب لضيف، وبعدين ترجعه. مفيد لما يطلب منك حد إصلاح عاجل وانت في نص شغل تاني.

6. ملفات مش عاوز Git يتابعها أصلًا

كل مشروع فيه ملفات مينفعش تدخل تاريخ النسخ: ملفات الإعدادات الشخصية، مجلدات المكتبات الضخمة (node_modules)، ملفات كلمات السر. الحل ملف اسمه .gitignore في جذر المشروع:

# ملف .gitignore — كل سطر ملف أو نمط هيتجاهله Git node_modules/ .env *.log .DS_Store dist/

القاعدة: أي حاجة فيها أسرار أو أي حاجة بتتولد تلقائيًا مكانها في .gitignore مش في المستودع. كلمة سر اترفعت على GitHub بالغلط مشكلة حقيقية — والوقاية سطر واحد.

تحذير: git reset –hard

هتشوف الأمر ده في شروحات كتير: git reset –hard بيرجع المشروع كله لحالة commit معين وبيمسح كل التعديلات غير المحفوظة نهائيًا. قوي ومفيد، لكنه المقص اللي بيقطع من غير رجعة. للمبتدئ: افهمه، واحترمه، ومتستخدموش إلا وانت فاهم بالظبط إيه اللي هيتمسح.

إعلان

الشغل مع فريق: Pull Request من غير رهبة

لحد دلوقتي كل شغلك فردي. لكن Git اتصمم أصلًا للشغل الجماعي — وهنا بيظهر الـPull Request (اختصارًا PR). الفكرة ببساطة: بدل ما تدفع شغلك مباشرة على النسخة الرئيسية، بتفتح «طلب» بيقول للفريق: «أنا خلصت الميزة دي في فرعي، راجعوها وادمجوها لو عجبتكم».

ليه النظام ده؟ لأنه بيحمي المشروع من 3 حاجات: كود مكسور يدخل النسخة الرئيسية، تعديلات محدش راجعها، وتعارضات تتدمج من غير ما حد ياخد باله. كل الشركات المحترمة بتشتغل كده — ففهمك للـPR من بدري بيجهزك لسوق الشغل الحقيقي.

دورة الـPull Request خطوة بخطوة

  1. انسخ المشروع (Fork): لو المشروع مش بتاعك، بتدوس Fork على GitHub — بيعمل نسخة من المستودع على حسابك انت.
  2. انسخ نسختك لجهازك: git clone لرابط النسخة بتاعتك.
  3. اعمل فرعًا للميزة: git switch -c add-login-page — اسم الفرع يوصف اللي هتعمله.
  4. اشتغل واحفظ وارفع: الـworkflow العادي (add → commit → push) على فرعك.
  5. افتح الـPull Request: على GitHub هتلاقي زر Compare & pull request — دوسه واكتب وصفًا واضحًا: إيه اللي اتعمل؟ وليه؟ وإزاي يتجرب؟
  6. المراجعة (Review): حد من الفريق بيراجع الكود، وممكن يطلب تعديلات — ده طبيعي ومش نقد شخصي، ده جزء من الشغل.
  7. الدمج (Merge): بعد الموافقة، الكود بيندمج في الفرع الرئيسي. مبروك — ساهمت في مشروع حقيقي.
الـPR هو سيرتك الذاتية الحية

أصحاب الشغل بيبصوا على الـPull Requests بتاعتك قبل ما يبصوا على شهاداتك. PR مكتوب كويس — بوصف واضح وcommits نظيفة — بيقول عنك: «ده حد بيعرف يشتغل ضمن فريق». ابدأ بمشاريع مفتوحة المصدر صغيرة محتاجة مساعدة، وهتلاقي فرص كتير مكتوب عليها good first issue.

GitHub كمعرض أعمال: الـREADME اللي بيبيعك

صفحة المستودع على GitHub أول حاجة بيشوفها أي حد بيزور شغلك — والـREADME هو واجهة المحل. مستودع من غير README زي محل من غير يافطة: الناس هتعدي من قدامه ومش هتدخل.

ملف README.md بيتكتب بصيغة Markdown البسيطة، وGitHub بيعرضه تلقائيًا تحت الملفات. الـREADME الكويس بيجاوب 4 أسئلة:

  1. المشروع ده بيعمل إيه؟ — سطرين واضحين في الأول.
  2. شكله إيه؟ — صورة أو رابط حي للتجربة. مشروع من غير ما يتشاف زي أكل من غير ريحة.
  3. إزاي أشغله عندي؟ — خطوات التثبيت والتشغيل مرقمة.
  4. مبني بإيه؟ — التقنيات المستخدمة باختصار.
# مثال README بسيط وفعال # My Portfolio Website Personal portfolio built with HTML, CSS and JavaScript. Live demo: https://username.github.io/my-portfolio ## How to run 1. Clone the repo 2. Open index.html in your browser ## Built with – HTML5 / CSS3 / JavaScript

كام نصيحة إضافية لمعرض أعمال يشد العين: ثبّت (pin) أفضل 6 مشاريع على صفحتك الرئيسية في GitHub، اكتب نبذة تعريفية في الـprofile README (مستودع بنفس اسم حسابك)، وخلّي كل مشروع فيه رابط حي شغال — الناس بتجرب قبل ما تقرأ.

ولو شغلك في تطوير مواقع ووردبريس مخصصة لعملائك، القاعدة المهنية: كل ثيم أو إضافة مستودع Git مستقل. كده تقدر تحدّث موقع عميل من غير ما تلمس موقع التاني، وترجع لأي نسخة لو تحديث بوّظ حاجة. الاحترافية في التفاصيل دي هي اللي بتفرق بين «حد بيعمل مواقع» و«مطور يعتمد عليه».

إعلان

خطة الـ14 يوم: من الصفر لأول push

المعرفة من غير تطبيق بتتبخر. دي خطة يومية — كل يوم 30 لـ45 دقيقة — توصلك من «أول مرة أسمع عن Git» لـ«عندي مشروع على GitHub»:

اليوم المهمة النتيجة
1 ثبّت Git وجهّز اسمك وإيميلك git –version شغال
2 اعمل أول مستودع: ملف واحد + add + commit أول commit في حياتك
3 جرّب الحالات الثلاث: عدّل، add، commit، وراقب بـstatus وdiff فهمت دورة الملف
4 اعمل 5 commits برسائل كويسة على ملفات مختلفة تاريخ نظيف
5 جرّب git log بأشكاله وشوف تاريخك بتقرأ التاريخ بثقة
6 اعمل فرعًا جديدًا، عدّل فيه، وارجع للرئيسي أول فرع
7 ادمج الفرع في main وامسحه أول merge ناجح
8 اصنع تعارضًا متعمدًا وحلّه يدويًا الخوف من التعارض راح
9 اعمل حساب GitHub ومستودعًا جديدًا حساب جاهز
10 اربط مشروعك المحلي واعمل أول push مشروعك أونلاين
11 جرّب clone لمشروعك على مجلد جديد + pull فهمت المزامنة
12 اكتب README محترم لمشروعك وارفعه معرض أعمال يتشاف
13 جرّب stash وrestore وrevert على نسخة تجريبية أدوات الإصلاح في إيدك
14 ابدأ مشروعًا حقيقيًا صغيرًا بـgit init من أول سطر العادة اتبنت

القاعدة: متفوتش يومين ورا بعض. يوم واحد ضايع مش مشكلة — يومين ورا بعض بيكسروا العادة. ولو يوم زنقك، اعمل commit واحد صغير بس — الاستمرارية أهم من الكمية.

المصادر الموثقة: 10 مصادر بروابط مباشرة

كل مصدر هنا اتفتح واتأكد منه فعليًا — الرابط بيودي على المورد نفسه مش على صفحة عامة، والشارة بتعكس الحقيقة: كل اللي تحت مجاني فعلًا.

كتاب Pro Git

مجانيإنجليزي

المرجع الرسمي والأشمل — متاح كاملًا أونلاين مجانًا. الفصول الأولى كفاية للمبتدئ، والباقي مرجع ترجع له.

git-scm.com/book

Learn Git Branching

مجانيإنجليزي

لعبة تفاعلية بتعلمك الفروع والدمج بالتجربة جوه المتصفح — أحسن طريقة تفهم بيها الـbranching من غير ما تحفظ.

learngitbranching.js.org

GitHub Skills

مجانيإنجليزي

كورسات تفاعلية من GitHub نفسه جوه حسابك: بتتعلم الـPR والـmerge والـactions بخطوات عملية حقيقية.

skills.github.com

GitHub Docs — البداية

مجانيإنجليزي

التوثيق الرسمي المبسط: إنشاء حساب، أول مستودع، والأساسيات خطوة بخطوة من المصدر نفسه.

docs.github.com

The Odin Project — أساسيات Git

مجانيإنجليزي

جزء Git ضمن مسار المؤسسة المجاني: شرح عملي مركز على اللي هتحتاجه فعلًا كمبتدئ ويب.

theodinproject.com

Atlassian Git Tutorials

مجانيإنجليزي

شروحات مركزة لكل أمر على حدة مع رسوم توضيحية — ممتاز كمرجع سريع لما تنسى أمر معين.

atlassian.com/git/tutorials

كورس Git وGitHub — Elzero Web School

مجانيعربي

شرح عربي كامل من البداية للاحتراف على يوتيوب — الخيار الأول لو عاوز تفهم بالعربي من غير ترجمة ذهنية.

يوتيوب — قائمة التشغيل

Oh Shit, Git!

مجانيإنجليزي

موقع ظريف وعملي: «عملت كذا بالغلط؟» — اختار غلطتك وهو يقولك الحل. هتحتاجه كتير أول شهرين.

ohshitgit.com

Git Reference الرسمي

مجانيإنجليزي

مرجع كل أمر بتفاصيله من الموقع الرسمي — مش للقراءة المتسلسلة، لكنه أدق إجابة لما تسأل «الأمر ده بيعمل إيه بالظبط؟».

git-scm.com/docs

GitHub Training Kit

مجانيإنجليزي

شرائح وملخصات (Cheat Sheets) جاهزة للتحميل من GitHub — علّق الملخص جنبك أول أسابيع.

training-kit

نصيحة عن المصادر

اختار مصدرًا واحدًا وامشي عليه للآخر — التشتت بين 5 كورسات أخطر من كورس واحد ناقص. القائمة دي للمرجعية والتعمق بعد الأساس، مش للبدء بيها كلها مع بعض.

إعلان

10 أخطاء بتوقف المبتدئين (وإزاي تتفاداها)

  1. تأجيل Git لـ«بعد ما أتعلم البرمجة»: Git مش مرحلة متقدمة — هو أداة اليوم الأول. كل يوم من غيره هو يوم شغل من غير شبكة أمان.
  2. الـcommit الضخم آخر الأسبوع: commit واحد فيه 40 ملف متغير مستحيل تراجعه أو تفهمه بعدين. احفظ كتير وصغير.
  3. رسائل commit عديمة المعنى: «fix» و«update» و«test» رسائل ميتة. اكتب فعلًا واضحًا يوصف التغيير.
  4. رفع ملفات سرية على GitHub: مفاتيح API وكلمات سر في مستودع عام كارثة حقيقية. .gitignore من أول يوم، وراجع بـgit status قبل كل push.
  5. الشغل على main مباشرة: الفرع الرئيسي للنسخ المستقرة بس. أي تجربة أو ميزة جديدة — فرع منفصل.
  6. نسيان الـpull قبل الشغل: تبدأ شغل على نسخة قديمة، وتكتشف بعد ساعات إن زميلك غيّر نفس الملفات. pull أول اليوم عادة مقدسة.
  7. الخوف من سطر الأوامر: واجهات Git الرسومية مريحة، لكن سطر الأوامر هو اللغة المشتركة لكل الشروحات والفرق. اتعلمه — مش صعب زي ما بيبان.
  8. حفظ التعديلات التجريبية مع الشغل الحقيقي: كنت بتجرب حاجة ومش متأكد منها؟ stash أو فرع تجريبي — متحطش «تجربة» جوه commit رسمي.
  9. تجاهل رسائل الخطأ: رسائل Git بالإنجليزية واضحة فعلًا — بتقولك إيه المشكلة وإيه الحل المقترح غالبًا. اقرأها قبل ما تنسخها لجوجل.
  10. التعلم من غير مشروع حقيقي: أوامر Git من غير مشروع بتتنسى في أسبوع. طبّق كل حاجة في المقال على مشروع فعلي — حتى لو صفحة واحدة.

الخلاصة: أول خطوة النهاردة

لو طلعت من المقال ده بحاجة واحدة، خليها دي: Git مش رفاهية للمحترفين — هو الفرق بين حد بيشتغل بخوف وحد بيشتغل بثقة. الثقة دي مش بتيجي من كتر الأوامر اللي حافظها، بتيجي من إنك عارف إن أي حاجة هتبوظ تقدر ترجعها.

الطريق مختصر وواضح: ثبّت Git، اعمل git init في مشروعك، احفظ أول commit، افتح حساب GitHub، ارفع شغلك. خمس خطوات — وبعدها انت رسميًا بتشتغل زي المحترفين. والـ14 يوم اللي جايين هيحوّلوا الخطوات دي لعادة.

وبعد الـ14 يوم؟

الأساس اللي بنيته هنا يكفيك شهورًا من الشغل الفردي. لما تحس إنك مرتاح، دي المحطات الجاية بالترتيب: اتعلم rebase التفاعلي لتنظيف تاريخك قبل الـpush، جرّب المساهمة في مشروع مفتوح المصدر بـPull Request حقيقي، واستكشف GitHub Actions للأتمتة البسيطة. كل محطة من دول مقال لوحدها — لكنها كلها مبنية على نفس الأساس اللي في إيدك دلوقتي: عدّل، جهّز، احفظ، ارفع. الأساس الصح بيخلي كل اللي بعده سهل.

تحدي الـ24 ساعة

قبل ما تقفل الصفحة: نزّل Git، اعمل مجلدًا جديدًا، نفّذ git init ثم add ثم commit — أول نسخة محفوظة في حياتك. بكرة الصبح اعمل حساب GitHub وارفعها. خطوتان صغيرتان النهاردة = عادة مهنية لسنين.

إعلان

تطبيق عملي كامل: مشروعك الأول من الصفر لـGitHub

النظرية خلصت — دلوقتي هنبني مشروعًا حقيقيًا صغيرًا ونمشي بيه الرحلة كلها: من مجلد فاضي على جهازك، لمستودع على GitHub فيه تاريخ نظيف وفروع ودمج. المشروع: صفحة تعريفية شخصية بسيطة (اسمك، نبذة، روابط تواصلك). لو عندك مشروع تاني في دماغك، طبّق عليه نفس الخطوات.

المرحلة الأولى: التأسيس محليًا

ابدأ من مجلد فاضي تمامًا — عشان تحس إنك بتبني التاريخ من أول سطر:

# اعمل مجلد المشروع وادخل جواه وحوّله لمستودع mkdir my-portfolio cd my-portfolio git init # اعمل ملف الصفحة الرئيسية واكتب فيه هيكل بسيط echo “<h1>My Portfolio</h1>” > index.html # جهّز واحفظ أول نسخة — دي لحظة الميلاد الرسمي للمشروع git add index.html git commit -m “Create initial portfolio page structure”

قف لحظة وشغّل git log –oneline — هتشوف أول سطر في تاريخ مشروعك. الإحساس ده مهم: انت دلوقتي عندك «نقطة رجوع» مضمونة. أي حاجة هتبوظ بعد كده، النقطة دي موجودة.

المرحلة الثانية: طوّر بفروع مش على الرئيسي

عاوز تضيف قسم «تواصل معي» للصفحة؟ القاعدة اللي اتعلمناها: مش على main مباشرة — فرع جديد:

# فرع جديد للميزة git switch -c add-contact-section # عدّل الملف (ضيف قسم التواصل) ثم احفظ git add index.html git commit -m “Add contact section with social links” # ارجع للرئيسي وادمج شغلك git switch main git merge add-contact-section # نضّف: امسح الفرع اللي خلصت مهمته git branch -d add-contact-section

لاحظ التسلسل: كل ميزة = فرع = commit واضح = دمج = مسح الفرع. بعد 3 شهور من الشغل بالطريقة دي، تاريخ مشروعك هيبقى قصة مقروءة: كل سطر فيها بيقول إيه اللي اتعمل وإمتى وليه.

المرحلة الثالثة: ملف التجاهل قبل الرفع

قبل ما ترفع أي حاجة للإنترنت، اعمل ملف .gitignore. حتى في مشروع صغير، العادة دي بتحميك:

# ملف .gitignore للمشروع .DS_Store *.log .env # احفظه هو كمان — هو جزء من المشروع git add .gitignore git commit -m “Add gitignore for system and temp files”

المرحلة الرابعة: الرفع على GitHub

اعمل مستودعًا جديدًا على GitHub بنفس اسم المجلد (my-portfolio)، واختاره Public عشان يبقى أول قطعة في معرض أعمالك، وبعدين:

# الربط والرفع — مرة واحدة بس git remote add origin https://github.com/YOUR-USERNAME/my-portfolio.git git push -u origin main

افتح صفحة المستودع: ملفاتك موجودة، وتاريخ الـcommits موجود، وكل رسالة واضحة. ده مشروع «محترم» بمعايير السوق — مش عشان الكود معقد، لكن عشان إدارته احترافية.

المرحلة الخامسة: الـREADME واللمسة الأخيرة

ضيف ملف README.md يشرح المشروع، وارفعه:

# اكتب وصفًا بسيطًا ثم ارفع git add README.md git commit -m “Add README with project overview” git push

لاحظ إن آخر push كان من غير -u origin main — لأن الربط اتعمل مرة واحدة في المرحلة اللي فاتت وخلاص. من هنا ورايح: git push بس.

إيه اللي اتعلمته من التمرين ده؟

من غير ما تحس، طبّقت: init وadd وcommit وbranch وswitch وmerge وremote وpush — يعني 80% من شغلك اليومي الحقيقي. كرر التمرين ده على مشروع تاني من عندك، وهتلاقي الأوامر بتطلع من إيدك لوحدها من غير تفكير.

غلطات متوقعة في التمرين (وحلولها)

  • نسيت تعمل commit قبل ما تبدل الفرع: Git هيرفض أو يحذرك — اعمل git stash، بدّل، وارجع اعمل git stash pop.
  • كتبت رسالة commit غلط: git commit –amend -m “الرسالة الصح” — بس قبل الـpush.
  • الـpush رفض: غالبًا نسيت git pull الأول، أو رابط الـremote غلط — راجع بـgit remote -v.
  • رفعت ملف مكنش المفروض يترفع: ضيفه لـ.gitignore، ثم git rm –cached filename عشان يخرج من التتبع من غير ما يتمسح من جهازك، ثم commit وpush.

الأسئلة الشائعة

إيه الفرق بين Git وGitHub؟

Git برنامج بتنزله على جهازك وبيحفظ نسخ مشروعك محليًا من غير إنترنت. GitHub موقع بيستضيف نسخة من مشروعك أونلاين وبيضيف التعاون والمشاركة. العلاقة: Git هو الأساس، وGitHub مبني فوقه. اتعلم Git الأول، وبعدين GitHub هيبقى سهل.

هل Git صعب على المبتدئ؟

لأ — الصعوبة وهم البداية بس. الشغل اليومي الحقيقي 5 أوامر: pull وadd وcommit وpush وstatus. الفروع والمفاهيم المتقدمة بتيجي بالتدريج مع أول مشروع حقيقي. اللي بيصعّب الموضوع هو محاولة فهم كل حاجة نظريًا قبل التطبيق — ابدأ طبّق وهتفهم.

لازم أتعلم سطر الأوامر عشان أستخدم Git؟

أيوه — على الأقل الأساسيات. فيه واجهات رسومية لـGit، لكن سطر الأوامر هو اللغة المشتركة: كل الشروحات والتوثيق والحلول على الإنترنت مكتوبة بيه، وفرق الشغل بتتعامل بيه. الخبر الكويس إنك محتاج 18 أمر بس، مش كورس سطر أوامر كامل.

إيه الفرق بين git pull وgit fetch؟

الـfetch بينزّل التحديثات من GitHub لجهازك من غير ما يدمجها — بصة استكشافية آمنة. الـpull بينزّل ويدمج في نفس الخطوة. القاعدة العملية: استخدم pull في شغلك اليومي العادي، وfetch لما عاوز تشوف إيه اللي اتغير قبل ما تدمج.

عملت commit غلط — أصلحه إزاي؟

حسب الحالة: لو الغلطة في الرسالة بس ولسه مرفعتش، استخدم git commit –amend. لو عاوز تلغي تأثير الـcommit بأمان (خصوصًا لو اترفع)، استخدم git revert اللي بيعمل commit جديد بيعكس الغلطة من غير ما يمسح التاريخ. تجنب تعديل commits اتنشرت واشتغل عليها حد تاني.

إيه هو الـmerge conflict وبحله إزاي؟

بيحصل لما تعديلين يتعارضوا على نفس السطور في نفس الملف وGit ميعرفش يختار. الحل: افتح الملف وهتلاقي علامات توضح النسختين، احذف العلامات وخلّي النسخة النهائية اللي انت عاوزها، ثم git add وgit commit. مش خطأ — ده Git بيطلب رأيك بدل ما يختار غلط.

لازم أرفع شغلي على GitHub ولا Git لوحده كفاية؟

Git لوحده كفاية للحفظ والنسخ على جهازك. لكن GitHub بيضيف 3 حاجات مهمة: نسخة احتياطية بره جهازك، معرض أعمال يشوفه أصحاب الشغل، ومنصة تعاون مع فرق. للمبتدئ اللي عاوز شغل: GitHub مش رفاهية — هو سيرتك الذاتية العملية.

إيه الفرق بين merge وrebase؟

الاتنين بيدمجوا شغل فرع في فرع تاني. الـmerge بيحافظ على التاريخ زي ما حصل فعلًا — فيه commit دمج واضح. الـrebase بيرتب الـcommits في خط واحد نظيف كأن الشغل حصل بالترتيب. للمبتدئ: استخدم merge دايمًا لحد ما تفهم rebase كويس، لأن الـrebase بيعدّل التاريخ وغلطته مكلفة في الشغل الجماعي.

ملف .gitignore بيعمل إيه بالظبط؟

بيقول لـGit: «تجاهل الملفات دي تمامًا». بتحط فيه أي حاجة مينفعش تدخل المستودع: ملفات الأسرار وكلمات السر، مجلدات المكتبات الضخمة زي node_modules، وملفات السجلات المؤقتة. القاعدة: أي حاجة فيها بيانات حساسة أو بتتولد تلقائيًا مكانها في gitignore مش في الـcommit.

أقدر أستخدم Git لمشاريع مش برمجية؟

أيوه — Git بيتعامل مع أي ملفات نصية بكفاءة: مقالات، ملاحظات، ملفات إعدادات، حتى كتابة كتاب. الميزة واحدة: تاريخ كامل لكل تعديل وإمكانية الرجوع لأي نسخة. بس خد بالك إنه مش مناسب للملفات الثنائية الضخمة زي الفيديو والصور الكبيرة — معمول للنصوص أساسًا.

إيه أحسن صيغة لرسالة الـcommit؟

فعل أمر في المضارع + وصف مختصر: «Add login validation» أو «Fix mobile menu overlap». سطر واحد، commit واحد = تغيير واحد. تجنب «fix» و«update» و«final» — رسائل ميتة مش هتفهم منها حاجة بعد شهر. الرسالة الكويسة بتجاوب: إيه اللي اتغير؟ وليه؟

GitHub مجاني فعلًا ولا فيه خدعة؟

مجاني فعلًا للمبتدئ: مستودعات عامة وخاصة غير محدودة، ومساحة كافية للمشاريع العادية. فيه خطط مدفوعة بمميزات متقدمة للفرق والشركات (زي مساحات تخزين أكبر وأدوات متقدمة)، لكنك مش هتحتاج حاجة منها في البداية. ابدأ بالمجاني وانت مرتاح.

إعلان

إعلان

إعلان

إعلان