ثبت‌نام

آموزش سریع Git ۲۰۲۶ | شروع کنترل نسخه در ۱۵ دقیقه

✍️ گام اول 📅 1405/05/27 👁️ 26 بازدید
آموزش سریع Git ۲۰۲۶ | شروع کنترل نسخه در ۱۵ دقیقه

تصور کنید روی یک پروژه‌ی مهم کار می‌کنید. یک باگ پیچیده پیدا می‌شود، کد را تغییر می‌دهید، اما نمی‌دانید نسخه‌ی قبلی چه بود. Ctrl+Z کار نمی‌کند. پوشه‌ها شلوغ شده‌اند و هیچ‌کس نمی‌داند کدام نسخه، نسخه‌ی نهایی است. این سناریو برای تقریباً هر برنامه‌نویسی در طول حرفه‌اش اتفاق افتاده است.

راه‌حل این مشکل، ابزاری است که در سال ۲۰۰۵ لینوس توروالدز، خالق لینوکس، برای مدیریت کدهای هسته‌ی لینوکس طراحی کرد: Git. امروز Git به استاندارد جهانی کنترل نسخه تبدیل شده و تقریباً در تمام پروژه‌های نرم‌افزاری جدی، از استارتاپ‌های کوچک تا سیستم‌های عظیم سازمانی، استفاده می‌شود. اگر Git بلد نباشید، یک شکاف مهارتی جدی دارید که در اولین مصاحبه‌ی شغلی مشخص می‌شود.

این مقاله یک معرفی و راهنمای شروع سریع است، نه یک دوره‌ی آموزشی کامل. هدف این است که در کمترین زمان ممکن، تصویر کلی Git را ببینید، با مفاهیم اصلی آشنا شوید، اولین قدم را بردارید و بدانید برای تعمیق دانش باید سراغ چه منابعی بروید. اگر به دنبال یک مرور سریع یا نقطه‌ی شروعی برای یادگیری Git هستید، این مقاله برای شماست.

 

فهرست مطالب

  1.  چرا بدون Git نمی‌شود کار کرد؟
  2. Git چه چیزی را تغییر می‌دهد؟
  3. شروع سریع: از نصب تا اولین Commit
  4. مفاهیم اصلی که باید بشناسید
  5. مسیر ادامه یادگیری
  6. پرسش‌های متداول

چرا بدون Git نمی‌شود کار کرد؟

قبل از یادگیری Git، بهتر است بدانید دقیقاً چه مشکلی را حل می‌کند. کار روی پروژه‌های نرم‌افزاری بدون کنترل نسخه، به شش چالش جدی منجر می‌شود که هر کدام به تنهایی می‌تواند یک پروژه را به شکست بکشاند.

مدیریت دستی نسخه‌ها

بدون Git، تنها راه حفظ نسخه‌های مختلف پروژه، ساخت کپی‌های جداگانه است. نتیجه، شلوغی سیستم فایل و سردرگمی در تشخیص نسخه‌ی نهایی است:

project_final/
project_final_v2/
project_final_really_final/
project_final_v2_final/
project_backup_آخر/

ناتوانی در بازگشت به عقب

ابزارهای undo در ویرایشگرها فقط چند ده تغییر اخیر را به خاطر می‌سپارند. بدون یک سیستم نسخه‌بندی، هر تغییر بزرگ یک ریسک واقعی است.

دشواری همکاری تیمی

ارسال کد از طریق ایمیل یا فضای ابری، منجر به بازنویسی یکدیگر، حذف ناخواسته‌ی تغییرات و سردرگمی می‌شود.

پیدا کردن منبع باگ‌ها

بدون تاریخچه‌ی تغییرات، پیدا کردن منبع باگ به یک جستجوی کورکورانه تبدیل می‌شود که ساعت‌ها یا روزها طول می‌کشد. با Git، دستوری مثل git bisect این کار را در چند دقیقه انجام می‌دهد.

ترس از تغییر و از دست رفتن خلاقیت

وقتی برنامه‌نویس از خراب شدن کد ترس داشته باشد، دست به تغییرات اساسی نمی‌زند. کد قدیمی باقی می‌ماند و پروژه به سمت رکود می‌رود.

از دست دادن دائمی پروژه

خرابی هارد، سرقت لپ‌تاپ یا اجرای اشتباه یک دستور حذف، می‌تواند ماه‌ها کار را در یک لحظه از بین ببرد. بدون یک نسخه‌ی پشتیبان قابل اعتماد، این فاجعه جبران‌ناپذیر است.

کار روی پروژه بدون کنترل نسخه، یعنی کار با بالاترین سطح ریسک ممکن. یک اشتباه کوچک می‌تواند نتیجه‌ی ماه‌ها تلاش را نابود کند.

Git چه چیزی را تغییر می‌دهد؟

Git یک سیستم کنترل نسخه‌ی توزیع‌شده است؛ یعنی هر توسعه‌دهنده یک نسخه‌ی کامل از تاریخچه‌ی پروژه را روی سیستم خود دارد. این معماری، استقلال و انعطاف‌پذیری بالایی به تیم می‌دهد. در ادامه، هفت تغییر اساسی که Git در فرآیند توسعه ایجاد می‌کند را می‌بینیم.

دسترسی به تاریخچه‌ی کامل پروژه

Git هر تغییر را در قالب یک Commit ذخیره می‌کند. هر لحظه از پروژه به صورت یک Snapshot کامل ثبت می‌شود و می‌توانید در صورت نیاز به هر نسخه‌ی قبلی بازگردید.

شاخه‌ها: توسعه‌ی موازی و ایمن

شاخه (Branch) یک نسخه‌ی موازی از پروژه است که به شما اجازه می‌دهد قابلیت جدیدی را بدون تأثیر روی کد اصلی توسعه دهید. اگر نتیجه رضایت‌بخش بود، شاخه را ادغام می‌کنید؛ در غیر این صورت، به سادگی آن را حذف می‌کنید.

همکاری تیمی بدون تداخل

هر عضو تیم روی شاخه‌ی خودش کار می‌کند. بعد از تکمیل کار، یک درخواست ادغام (Pull Request) ارسال می‌شود و سایر اعضا کد را بازبینی می‌کنند. این فرآیند، هم کیفیت کد را بالا می‌برد و هم از تداخل جلوگیری می‌کند.

ساخت نمونه‌کار حرفه‌ای

پروفایل عمومی Git یک توسعه‌دهنده، رزومه‌ی زنده‌ی اوست. کارفرمایان پیش از مصاحبه، فعالیت‌های فنی کاندید را بررسی می‌کنند. یک تاریخچه‌ی منظم از Commitها و پروژه‌های تمام‌شده، قوی‌تر از هر رزومه‌ی PDF است.

جسارت در کدنویسی

وقتی می‌دانید هر تغییری قابل بازگشت است، با اطمینان بیشتری آزمایش می‌کنید. این آزادی، منجر به نوآوری و رشد سریع‌تر مهارت می‌شود.

اتوماسیون با CI/CD

Git با ابزارهای CI/CD یکپارچه می‌شود. هر بار که کد را به مخزن ارسال می‌کنید، تست‌ها به صورت خودکار اجرا می‌شوند و در صورت موفقیت، کد روی سرور مستقر می‌شود.

پیدا کردن سریع منبع باگ

با دستور git bisect می‌توانید به صورت دودویی تاریخچه را بررسی کنید و در چند دقیقه بفهمید کدام Commit باعث بروز باگ شده است.

مقایسه‌ی جامع: قبل و بعد از Git

ویژگی بدون Git با Git
بازگشت به نسخه‌ی قبلی عملاً غیرممکن در چند ثانیه
همکاری تیمی ایمیل و فلش خودکار با Pull Request
آزمایش قابلیت جدید با ریسک بالا ایمن در شاخه‌ی جدید
پیدا کردن منبع باگ ساعت‌ها جستجو دقیقه‌ها با git bisect
انتشار نسخه‌ی جدید روزها هماهنگی دستی دقیقه‌ها با CI/CD
پشتیبان‌گیری کپی دستی خودکار روی مخزن راه دور
نمونه‌کار حرفه‌ای رزومه‌ی PDF بدون سند پروفایل زنده‌ی Git

شروع سریع: از نصب تا اولین Commit

در این بخش، سریع‌ترین مسیر برای شروع کار با Git را طی می‌کنیم. هدف، راه‌اندازی و اجرای اولین پروژه در کمتر از ۱۵ دقیقه است.

قدم اول: نصب Git

بسته به سیستم‌عامل خود، یکی از روش‌های زیر را انتخاب کنید:

  • ویندوز: از سایت رسمی git-scm.com دانلود کنید.
  • مک: دستور brew install git
  • لینوکس: sudo apt install git (اوبونتو) یا sudo dnf install git (فدورا)

پس از نصب، هویت خود را یک بار برای همیشه تنظیم کنید:

git config --global user.name "نام شما"
git config --global user.email "ایمیل شما"

قدم دوم: ساخت اولین مخزن

پوشه‌ی پروژه را بسازید و آن را به یک مخزن Git تبدیل کنید:

mkdir my-project
cd my-project
git init

پس از اجرای این دستور، یک پوشه‌ی مخفی به نام .git ساخته می‌شود که تمام تاریخچه‌ی پروژه در آن ذخیره خواهد شد. این پوشه را هرگز دستی ویرایش یا حذف نکنید.

قدم سوم: اولین Commit

echo "<h1>سلام دنیا</h1>" > index.html
git add index.html
git commit -m "feat: افزودن صفحه‌ی اصلی"

تبریک! اولین Snapshot پروژه‌ی شما ثبت شد. برای مشاهده‌ی وضعیت و تاریخچه:

git status
git log --oneline
git diff

قدم چهارم: کار با شاخه‌ها

برای توسعه‌ی قابلیت جدید، یک شاخه‌ی جداگانه بسازید:

git switch -c feature-login
# توسعه‌ی قابلیت
git add .
git commit -m "feat: افزودن فرم ورود"

git switch main
git merge feature-login
git branch -d feature-login

قدم پنجم: اتصال به مخزن راه دور

مخزن راه دور، نسخه‌ای از پروژه است که روی یک سرور نگهداری می‌شود. این سرور می‌تواند یک سرویس ابری باشد یا یک سرور اختصاصی که خودتان مدیریت می‌کنید.

git remote add origin YOUR_REPO_URL
git push -u origin main

پس از این تنظیمات، برای همگام‌سازی از دو دستور استفاده می‌کنید:

git pull      # دریافت تغییرات جدید از سرور
git push      # ارسال تغییرات محلی به سرور
اگر در مراحل ابتدایی برنامه‌نویسی هستید، پیشنهاد می‌کنم مقاله‌ی شروع اولین پروژه برنامه‌نویسی را مطالعه کنید تا با مسیر ساخت یک پروژه‌ی واقعی آشنا شوید.

دستورات ضروری Git

دستور کاربرد
git init ساخت مخزن جدید
git clone URL دریافت مخزن از راه دور
git status مشاهده‌ی وضعیت فایل‌ها
git add . افزودن تغییرات به Staging
git commit -m "message" ثبت تغییرات
git log --oneline تاریخچه‌ی خلاصه
git switch -c name ساخت و ورود به شاخه‌ی جدید
git merge name ادغام شاخه
git pull دریافت تغییرات از راه دور
git push ارسال تغییرات به راه دور
git restore file بازگرداندن یک فایل به آخرین Commit
git revert HASH خنثی‌سازی یک Commit

مفاهیم اصلی که باید بشناسید

در این بخش، مفاهیم کلیدی Git را به صورت خلاصه مرور می‌کنیم. این مفاهیم، پایه‌ی درک عمیق‌تر Git هستند و در منابع پیشرفته با جزئیات بیشتر بررسی می‌شوند.

Staging Area: فضای میانی

بین تغییرات فایل‌ها و Commit نهایی، Git یک فضای میانی به نام Staging Area دارد. شما ابتدا تغییرات را با git add به این فضا اضافه می‌کنید، سپس با git commit آن‌ها را به تاریخچه منتقل می‌کنید. این طراحی، امکان انتخاب دقیق تغییرات برای هر Commit را فراهم می‌کند.

Commit: Snapshot پروژه

هر Commit یک تصویر کامل از پروژه در لحظه‌ای مشخص است. این تصویر، شامل تمام فایل‌های پروژه (نه فقط تغییرات) می‌شود. هر Commit یک شناسه‌ی یکتا (Hash) دارد که برای مراجعه به آن استفاده می‌شود.

Branch: نسخه‌ی موازی

شاخه یک خط توسعه‌ی مستقل است. شاخه‌ی پیش‌فرض معمولاً main است. هر شاخه می‌تواند به طور مستقل تغییر کند و بعداً با سایر شاخه‌ها ادغام شود.

Merge: ادغام دو شاخه

Merge عملیات ادغام دو شاخه است. اگر هر دو شاخه یک فایل را تغییر داده باشند، Git یک Conflict گزارش می‌دهد که باید دستی حل شود. این فرآیند، بخشی طبیعی از کار تیمی است.

Remote: مخزن راه دور

مخزن راه دور، نسخه‌ای از پروژه است که روی سرور نگهداری می‌شود. دستور git push تغییرات محلی را به سرور ارسال می‌کند و git pull تغییرات سرور را به سیستم محلی می‌آورد.

Pull Request: قلب همکاری تیمی

وقتی کار روی یک شاخه تمام شد، یک درخواست ادغام ایجاد می‌کنید. سایر اعضای تیم کد را بازبینی می‌کنند و در صورت تأیید، تغییرات به شاخه‌ی اصلی ادغام می‌شوند. این فرآیند، کیفیت کد را به شدت بالا می‌برد.

CI/CD: اتوماسیون توسعه و انتشار

CI (Continuous Integration) یعنی هر تغییر به صورت خودکار تست می‌شود. CD (Continuous Deployment) یعنی انتشار خودکار روی سرور پس از موفقیت تست‌ها. این فرآیند، توسعه را سریع، ایمن و قابل اعتماد می‌کند.

Conventional Commits: استاندارد پیام Commit

یک پیام Commit خوب، کوتاه، شفاف و هدفمند است. برای یکدستی در تیم، از استانداردهایی مثل Conventional Commits استفاده می‌شود:

feat: افزودن فرم ورود کاربر
fix: رفع خطای اعتبارسنجی ایمیل
docs: به‌روزرسانی مستندات نصب
refactor: بهبود ساختار کد احراز هویت
test: افزودن تست برای API احراز هویت
chore: به‌روزرسانی وابستگی‌ها

فایل .gitignore

فایل .gitignore الگوهایی از فایل‌ها را مشخص می‌کند که Git نباید ردیابی کند. فایل‌های موقت، پوشه‌های وابستگی، فایل‌های محرمانه و خروجی‌های Build نباید در مخزن ذخیره شوند:

__pycache__/
*.pyc
.env
node_modules/
dist/
*.log
venv/
.idea/
.vscode/
فایل‌های حاوی اطلاعات حساس مثل رمزهای عبور، توکن‌های API و کلیدهای رمزنگاری، هرگز نباید در مخزن Git ذخیره شوند. حتی اگر بعداً آن‌ها را حذف کنید، در تاریخچه‌ی Git باقی می‌مانند.

امنیت در Git

  • هرگز رمز عبور، توکن یا کلید API را در مخزن قرار ندهید.
  • برای متغیرهای محیطی از فایل .env استفاده کنید و آن را در .gitignore قرار دهید.
  • به جای رمز عبور، از SSH Key استفاده کنید.
  • احراز هویت دو مرحله‌ای را روی حساب کاربری خود فعال کنید.
  • دسترسی‌ها را بر اساس اصل کمترین دسترسی تنظیم کنید.

اشتباهات رایج مبتدیان

  • Commit کردن فایل‌های حساس بدون توجه به .gitignore.
  • ساخت Commitهای بزرگ و نامرتبط که بازبینی را سخت می‌کند.
  • کار مستقیم روی شاخه‌ی main به جای ساخت شاخه‌ی جدید.
  • فراموش کردن git pull قبل از git push.
  • استفاده از Force Push روی شاخه‌های مشترک.
  • نادیده گرفتن Conflictها یا حل کردن سطحی آن‌ها.
  • نوشتن پیام‌های Commit مبهم و بی‌معنا.

مسیر ادامه یادگیری

مفاهیمی که در این مقاله دیدید، پایه‌ی کار با Git را تشکیل می‌دهند. اما Git ابزار عمیقی است و پس از تسلط بر مبانی، مسیر یادگیری ادامه دارد. در ادامه، مسیری پیشنهادی برای تعمیق مهارت‌های شما آمده است.

تکنیک‌های پیشرفته برای مطالعه‌ی بعدی

این مفاهیم، در موقعیت‌های خاص بسیار مفید هستند و پیشنهاد می‌شود پس از تسلط بر مبانی، هر کدام را در یک پروژه‌ی واقعی تمرین کنید:

  • Interactive Rebase: بازنویسی و مرتب‌سازی تاریخچه‌ی Commitها قبل از ادغام.
  • Cherry-pick: انتقال یک Commit مشخص از یک شاخه به شاخه‌ی دیگر.
  • Stash: ذخیره‌ی موقت تغییرات بدون Commit، برای جابه‌جایی سریع بین کارها.
  • Bisect: پیدا کردن Commit معیوب با جستجوی دودویی در تاریخچه.
  • Reflog: مشاهده‌ی تاریخچه‌ی کامل حرکات HEAD، حتی برای Commitهای حذف‌شده.
  • Submodules: نگهداری مخازن دیگر درون یک مخزن اصلی.
  • Worktree: کار همزمان روی چند شاخه در پوشه‌های مختلف.
  • Hooks: اجرای اسکریپت‌های خودکار در رویدادهای مختلف Git.

نقشه‌ی یادگیری هفتگی

  • هفته‌ی اول: تسلط بر init، add، commit، status، log
  • هفته‌ی دوم: branch، switch، merge، remote
  • هفته‌ی سوم: pull، push، fetch، clone
  • هفته‌ی چهارم: conflict، rebase، stash
  • ماه دوم: Pull Request، Issue، مشارکت در پروژه‌های متن‌باز
  • ماه سوم: CI/CD، استراتژی‌های شاخه‌سازی
  • ماه چهارم به بعد: تکنیک‌های پیشرفته و ابزارهای مکمل

منابع پیشنهادی برای مطالعه‌ی عمیق‌تر

  • Pro Git: کتاب رایگان و مرجع اصلی Git.
  • Learn Git Branching: محیط تعاملی برای تمرین شاخه‌ها.
  • مستندات رسمی Git: git-scm.com/doc
  • پروژه‌های متن‌باز: بهترین محیط برای یادگیری عملی.
  • دوره‌های ویدیویی: گزینه‌های رایگان و کاربردی در دسترس هستند.

پرسش‌های متداول درباره Git

Git در ساده‌ترین تعریف چیست؟

Git یک سیستم کنترل نسخه‌ی توزیع‌شده است که هر تغییر در پروژه را به صورت یک Snapshot ذخیره می‌کند. این یعنی هر لحظه می‌توانید به نسخه‌های قبلی بازگردید، تغییرات را بررسی کنید و با اعضای تیم همکاری کنید. Git در سال ۲۰۰۵ توسط لینوس توروالدز برای مدیریت کدهای هسته‌ی لینوکس ساخته شد.

تفاوت Git با سرویس‌های میزبانی مخازن چیست؟

Git روی سیستم شما نصب می‌شود و مدیریت نسخه را به صورت محلی انجام می‌دهد. سرویس‌های میزبانی، مخازن Git را روی سرور نگه می‌دارند و ابزارهایی مثل درخواست ادغام برای همکاری تیمی فراهم می‌کنند. این سرویس‌ها می‌توانند یک سرویس ابری عمومی باشند یا یک سرور اختصاصی که خودتان مدیریت می‌کنید. انتخاب بین این دو، بستگی به این دارد که حریم خصوصی، کنترل داده‌ها و هزینه تا چه اندازه برایتان اهمیت دارد. برای نمونه، اگر به دلیل محدودیت‌های دسترسی نمی‌توانید از سرویس‌های عمومی استفاده کنید، سرویس‌های میزبانی داخلی یا خودمیزبان نیز گزینه‌های مناسبی هستند. پایاگیت (بر پایه Gitea، در حال حاضر آزمایشی) یکی از این گزینه‌هاست که می‌توانید در مقاله معرفی پایاگیت با آن آشنا شوید.

یادگیری Git چقدر طول می‌کشد؟

برای یادگیری دستورات پایه، چند روز کافی است. برای تسلط بر مفاهیم پیشرفته مثل Rebase و استراتژی‌های شاخه‌سازی، چند هفته زمان لازم است. حرفه‌ای شدن در Git به تمرین عملی مداوم نیاز دارد و معمولاً چند ماه طول می‌کشد.

آیا Git فقط برای برنامه‌نویسان مناسب است؟

خیر. Git برای مدیریت هر مجموعه‌ای که در طول زمان تغییر می‌کند مفید است: نوشتن کتاب، مدیریت یادداشت‌ها، ذخیره‌ی فایل‌های تنظیمات شخصی و حتی مستندسازی پروژه‌های غیرفنی.

CI/CD چیست و چرا اهمیت دارد؟

CI (یکپارچه‌سازی مداوم) یعنی هر تغییر در کد به صورت خودکار تست می‌شود تا از ایجاد خطا جلوگیری شود. CD (استقرار مداوم) یعنی انتشار خودکار نسخه‌های جدید روی سرور پس از تأیید تست‌ها. این دو در کنار هم، فرآیند توسعه و انتشار نرم‌افزار را سریع، ایمن و قابل اعتماد می‌کنند.

آیا Git رایگان است؟

بله. Git یک نرم‌افزار کاملاً رایگان و متن‌باز است که می‌توانید بدون هیچ محدودیتی روی هر تعداد پروژه استفاده کنید.

Branch (شاخه) چیست و چه کاربردی دارد؟

شاخه یک نسخه‌ی موازی از پروژه است که به شما اجازه می‌دهد قابلیت جدیدی را بدون تأثیر روی کد اصلی توسعه دهید. اگر نتیجه رضایت‌بخش بود، شاخه را ادغام می‌کنید؛ در غیر این صورت، به سادگی آن را حذف می‌کنید.

اگر کد اشتباهی را Push کردم چه کنم؟

اگر هنوز کسی تغییرات را دریافت نکرده، می‌توانید با git reset آن Commit را لغو کنید. اگر سایر اعضای تیم تغییرات را Pull کرده‌اند، بهترین راه استفاده از git revert است که یک Commit جدید برای خنثی‌سازی تغییر اشتباه ایجاد می‌کند، بدون آن‌که تاریخچه بازنویسی شود.

تفاوت git switch و git checkout چیست؟

دستور git checkout در نسخه‌های قدیمی Git برای اهداف مختلفی استفاده می‌شد: تغییر شاخه، بازگرداندن فایل و ایجاد شاخه‌ی جدید. از سال ۲۰۱۹، Git دو دستور تخصصی‌تر معرفی کرد: git switch برای تغییر شاخه و git restore برای بازگرداندن فایل‌ها. استفاده از این دو دستور جدید، واضح‌تر و ایمن‌تر است.

جمع‌بندی

Git دیگر یک ابزار اختیاری نیست؛ یک مهارت پایه برای هر برنامه‌نویس حرفه‌ای است. در این مقاله، یک مرور سریع از Git داشتیم: چالش‌های کار بدون کنترل نسخه را دیدیم، با هفت مزیت اصلی Git آشنا شدیم، اولین قدم‌های عملی را برداشتیم و مهم‌ترین مفاهیم را مرور کردیم.

این مقاله یک نقطه‌ی شروع بود، نه یک مقصد. برای تسلط واقعی بر Git، باید در پروژه‌های واقعی کار کنید و به تدریج تکنیک‌های پیشرفته‌تر را یاد بگیرید. مسیر یادگیری که در بخش قبل آمد، می‌تواند راهنمای شما در این مسیر باشد.

یادگیری Git شبیه یادگیری یک زبان جدید است: در ابتدا سخت به نظر می‌رسد، اما با تمرین روزانه، به یک ابزار طبیعی در کار تبدیل می‌شود. مهم‌ترین نکته این است که همیشه در پروژه‌های واقعی از Git استفاده کنید. هر پروژه‌ی جدید، فرصتی است برای تمرین مفهوم تازه‌ای از Git.

اگر می‌خواهید بلافاصله پس از یادگیری Git، مهارت خود را در یک پروژه‌ی واقعی به کار بگیرید، مقاله‌ی ۶۰ پروژه برنامه‌نویسی برای رزومه می‌تواند نقطه‌ی شروع مناسبی برای شما باشد.

همین امروز اولین مخزن Git خود را بسازید. هر پروژه‌ی حرفه‌ای، از یک git init ساده شروع می‌شود.

دسته‌بندی‌های مرتبط با این مطلب
آزمایشی

گفتگو درباره این پست

هنوز پیامی ثبت نشده است.



×
تصویر پروفایل
⏳ در حال بارگذاری...