آشنایی با Git و GitHub
قبل از اینکه دستوری تایپ کنیم، بفهمیم Git چیست، چرا اختراع شد، چه تفاوتی با GitHub دارد و چطور آن را روی سیستم خود نصب و راهاندازی کنیم.
قبل از اینکه دستوری تایپ کنیم، بفهمیم Git چیست، چرا اختراع شد، چه تفاوتی با GitHub دارد و چطور آن را روی سیستم خود نصب و راهاندازی کنیم.
Git چیست؟
Git یک سیستم کنترل نسخه توزیعشده (Distributed Version Control System – DVCS) است. به زبان ساده، Git ابزاری است که:
- تاریخچه کامل تغییرات کد را نگه میدارد
- اجازه میدهد به هر نسخه قبلی برگردید
- به تیم اجازه میدهد همزمان روی یک پروژه کار کنند
- تعارضها را مدیریت میکند
- اجازه میدهد چندین نسخه موازی (branch) از کد داشته باشید
تاریخچه کوتاه
در سال ۲۰۰۵، تیم Linux از سیستم BitKeeper استفاده میکرد که license رایگانش لغو شد. Linus Torvalds (خالق Linux) در عرض چند ماه Git را نوشت با اهداف:
- سرعت بالا
- طراحی توزیعشده
- پشتیبانی از branching غیرخطی
- قابلیت مدیریت پروژههای بزرگ مثل Linux kernel
متمرکز vs توزیعشده
قبل از Git، اکثر سیستمهای کنترل نسخه (مثل SVN، CVS) متمرکز بودند:
Centralized (SVN):
┌─────────────┐
│ Central │ ← همه چیز اینجا
│ Repository │
└──────┬──────┘
│
┌───────┼───────┐
│ │ │
[Dev1] [Dev2] [Dev3] ← فقط working copy
❌ بدون اتصال به سرور: نمیتوان commit کرد
❌ سرور down: همهچیز متوقف
❌ تاریخچه کامل فقط روی سرور
Distributed (Git):
┌─────────────────┐
│ Remote (GitHub) │
└────────┬────────┘
│
┌───────────┼───────────┐
│ │ │
[Dev1] [Dev2] [Dev3]
✓ کپی ✓ کپی ✓ کپی
کامل کامل کامل
✓ هر developer تاریخچه کامل دارد
✓ بدون اتصال هم میتوان commit کرد
✓ هر کلون یک backup کامل است
تفاوت Git و GitHub
این یکی از سوالات رایج است. اشتباه نکنید:
| ویژگی | Git | GitHub |
|---|---|---|
| چیست؟ | ابزار خط فرمان | پلتفرم ابری |
| کجا اجرا میشود؟ | روی کامپیوتر شما | روی سرورهای GitHub Inc. |
| اولین انتشار | ۲۰۰۵ توسط Linus Torvalds | ۲۰۰۸ توسط Tom Preston-Werner و دیگران |
| مالکیت | متنباز – بدون مالک | مایکروسافت (از ۲۰۱۸) |
| نیاز به اینترنت؟ | خیر | بله |
| قابلیتهای اضافه | هیچ – فقط VCS | Issues، Pull Requests، Actions، Pages، Wiki، Projects |
| هزینه | کاملاً رایگان | plan رایگان + planهای پولی |
پلتفرمهای مشابه GitHub
GitHub تنها میزبان Git نیست. گزینههای دیگر:
- GitLab: محبوبترین رقیب، self-hosted امکانپذیر، CI/CD قدرتمند
- Bitbucket: محصول Atlassian، یکپارچه با Jira
- Gitea: متنباز و سبک، self-hosted
- Codeberg: غیرانتفاعی، مبتنی بر Gitea
- Azure DevOps: مایکروسافت برای enterprise
در این دوره GitHub را یاد میگیریم چون پرکاربردترین است، اما مفاهیم Git در همهجا یکسان است.
نصب Git در Windows
روش ۱: Git for Windows (پیشنهاد)
- به git-scm.com/download/win بروید
- installer را دانلود کنید (نسخه 64-bit)
- setup را اجرا کنید با گزینههای پیشفرض
- در مرحله “Choosing the default editor”، Notepad++ یا VS Code انتخاب کنید (نه Vim!)
- در “Adjusting your PATH”، گزینه دوم را انتخاب کنید (Git from command line and 3rd-party software)
- در “HTTPS transport backend”، OpenSSL را انتخاب کنید
- در “Configuring the line ending”، گزینه اول (Checkout Windows-style, commit Unix-style)
پس از نصب، Git Bash در منوی Start خواهید داشت که terminal مخصوص Git است.
تست نصب
git --version
# git version 2.43.0.windows.1
نصب Git در Linux
# Ubuntu / Debian
sudo apt update
sudo apt install git
# Fedora / RHEL
sudo dnf install git
# Arch
sudo pacman -S git
# تست
git --version
نصب Git در macOS
# با Homebrew (پیشنهاد)
brew install git
# یا - در صورت نصب Xcode Command Line Tools خودکار
xcode-select --install
# تست
git --version
پیکربندی اولیه
اولین کاری که بعد از نصب Git باید انجام دهید: تنظیم نام و ایمیل. این اطلاعات در هر commit ثبت میشوند.
# تنظیم نام (در commit ها نمایش داده میشود)
git config --global user.name "Mohammad Ali Nazeri"
# تنظیم ایمیل (همان ایمیل GitHub)
git config --global user.email "you@example.com"
# تنظیم default branch به main (بهجای master قدیمی)
git config --global init.defaultBranch main
# تنظیم editor پیشفرض
git config --global core.editor "code --wait" # برای VS Code
git config --global core.editor "nano" # یا nano
git config --global core.editor "notepad++" # برای ویندوز
# نمایش رنگی خروجی
git config --global color.ui auto
# تنظیم line endings (مهم برای ویندوز)
git config --global core.autocrlf true # ویندوز
git config --global core.autocrlf input # Linux/Mac
# مشاهده تنظیمات فعلی
git config --list
# مشاهده یک تنظیم خاص
git config --global user.name
سطوح config
Git سه سطح پیکربندی دارد:
| سطح | دستور | محل ذخیره | کاربرد |
|---|---|---|---|
| System | --system |
/etc/gitconfig | همه کاربران |
| Global | --global |
~/.gitconfig | یک کاربر، همه پروژهها |
| Local | --local |
.git/config | فقط یک پروژه |
اولویت: Local > Global > System
# مثال: ایمیل متفاوت برای پروژه کاری
cd /path/to/work-project
git config --local user.email "you@company.com"
# برای این پروژه از ایمیل کاری استفاده میشود
ساخت حساب GitHub
- به github.com بروید
- روی Sign up کلیک کنید
- ایمیل، رمز عبور و username انتخاب کنید (username بعداً در URL ریپازیتوری استفاده میشود)
- plan Free را انتخاب کنید (کافی است)
- ایمیل تأیید را بررسی کنید
- 2FA را فعال کنید – بسیار مهم برای امنیت!
نکات انتخاب username
- کوتاه و حرفهای – این URL پروفایل شماست
- اسم واقعی یا handle شما – مثل
github.com/manazeri - بدون اعداد عجیب یا کاراکتر خاص
- یکبار انتخاب میکنید، بعداً تغییرش سخت است
ادغام با IDE
اگرچه Git ابزار خط فرمان است، اکثر IDEها رابط گرافیکی برای آن دارند:
- VS Code: Source Control panel در sidebar – عالی برای روزمره
- JetBrains (PyCharm، IntelliJ، PhpStorm): integration بسیار قوی
- GitHub Desktop: GUI رسمی GitHub – برای مبتدیها
- GitKraken: زیبا و قدرتمند، رایگان برای پروژههای public
- Sourcetree: Atlassian، رایگان
اولین نگاه به یک ریپازیتوری Git
# تبدیل یک پوشه معمولی به Git repository
mkdir my-first-repo
cd my-first-repo
git init
# Initialized empty Git repository in /home/user/my-first-repo/.git/
# داخل پوشه نگاه کنید
ls -la
# . .. .git/
# پوشه .git محل نگهداری کل تاریخچه است
ls -la .git/
# HEAD config description hooks/ info/ objects/ refs/
چیزی که داخل .git/ وجود دارد
- HEAD: اشارهگر به branch فعلی
- config: تنظیمات این repository
- objects/: همه commitها، فایلها و treeها (هسته Git)
- refs/: پوینترها به branchها و tagها
- hooks/: اسکریپتهایی که در رویدادها اجرا میشوند
.git/ را هرگز دستی تغییر ندهید مگر اینکه دقیقاً بدانید چه میکنید. تمام دستورات Git این پوشه را مدیریت میکنند.
واژهنامه پایه
| واژه | معنی |
|---|---|
| Repository (Repo) | یک پروژه Git – شامل کد و تاریخچه |
| Commit | یک snapshot از پروژه در یک لحظه – مثل save |
| Branch | یک خط زمانی موازی – برای کار روی فیچر بدون تأثیر روی main |
| Merge | ادغام تغییرات یک branch به branch دیگر |
| Remote | نسخهای از repository روی سرور (مثل GitHub) |
| Clone | کپی کردن یک remote repository روی سیستم خود |
| Push | ارسال commitهای local به remote |
| Pull | دریافت تغییرات از remote |
| Fork | کپی کردن یک repo دیگران در حساب خود (در GitHub) |
| Pull Request (PR) | درخواست ادغام تغییرات شما در پروژه اصلی |
| Working Directory | فایلهایی که در حال ویرایش هستید |
| Staging Area | فایلهایی که آماده commit شدهاند |
| HEAD | اشاره به آخرین commit در branch فعلی |
سه ناحیه Git
Git در هر لحظه فایلها را در یکی از سه ناحیه نگه میدارد. این مفهوم را الان نخواهید فهمید کاملاً، اما در فصل بعد روشن میشود:
┌──────────────────┐ git add ┌──────────────────┐
│ Working │ ──────────────→ │ Staging Area │
│ Directory │ │ (Index) │
│ (فایلهای شما) │ ←────────────── │ │
└──────────────────┘ └────────┬─────────┘
│ git commit
▼
┌──────────────────┐
│ Repository │
│ (.git/objects) │
│ تاریخچه دائمی │
└──────────────────┘
ناحیهها به زبان ساده
- Working Directory: فایلهایی که الان روی دیسک میبینید و ویرایش میکنید
- Staging Area: لیستی از فایلهایی که “اینها را در commit بعدی شامل کن”
- Repository: تاریخچه دائمی commitها در پوشه .git
بهترین شیوهها
- همیشه نام و ایمیل را قبل از اولین commit تنظیم کنید
- از همان ایمیل GitHub در git config استفاده کنید (تا commitها به حساب شما متصل شوند)
- 2FA را فعال کنید
- username GitHub را با دقت انتخاب کنید
- Git Bash را بهجای CMD یا PowerShell در ویندوز استفاده کنید
- یاد گرفتن CLI قبل از GUI
جمعبندی
- Git یک سیستم کنترل نسخه توزیعشده است که Linus Torvalds در ۲۰۰۵ ساخت
- GitHub پلتفرم ابری برای میزبانی Git است (نه خود Git)
- Git در Windows/Linux/Mac قابل نصب است
- قبل از استفاده، نام و ایمیل را با git config تنظیم کنید
- Git سه ناحیه دارد: Working Directory، Staging Area و Repository
- پوشه .git قلب هر repository است
در فصل بعد، اولین repository خود را میسازیم و دستورات پایه Git را تمرین میکنیم.