Git

از shakiba
پرش به ناوبری پرش به جستجو

Git چیست؟

Git یک سیستم کنترل نسخه (Version Control System) توزیع‌شده است که برای ردیابی تغییرات در فایل‌ها و هماهنگی کار بین چند نفر روی یک پروژه استفاده می‌شود. با Git می‌توان تاریخچهٔ کامل تغییرات یک پروژه را نگه داشت، به نسخه‌های قبلی بازگشت، و به‌صورت هم‌زمان با دیگران روی بخش‌های مختلف یک پروژه کار کرد.

مفاهیم پایه

  • Repository (مخزن): پوشه‌ای که Git تاریخچهٔ تغییرات آن را ردیابی می‌کند.
  • Working Directory: فایل‌های واقعی روی سیستم که در حال ویرایش آن‌ها هستید.
  • Staging Area (Index): فضای واسط بین Working Directory و مخزن؛ فایل‌هایی که آماده‌ی ثبت (commit) هستند.
  • Commit: یک نقطهٔ ذخیرهٔ دائمی در تاریخچهٔ پروژه، مثل عکس لحظه‌ای از وضعیت فایل‌ها.
  • Branch (شاخه): یک مسیر جداگانه برای توسعه، بدون تأثیر روی نسخهٔ اصلی.
  • HEAD: اشاره‌گری به آخرین commit در شاخه‌ای که در حال حاضر روی آن هستید.
  • Merge: ترکیب کردن تغییرات دو شاخه با هم.
  • Remote: نسخه‌ای از مخزن که روی یک سرور (مثل GitHub، GitLab) قرار دارد.
  • Clone: کپی کامل یک مخزن از راه دور روی سیستم شما.

نصب و تنظیمات اولیه

توضیح دستور
بررسی نصب بودن Git و نسخهٔ آن git --version
تنظیم نام کاربری (سراسری) git config --global user.name "نام شما"
تنظیم ایمیل (سراسری) git config --global user.email "email@example.com"
مشاهدهٔ تمام تنظیمات فعلی git config --list

شروع کار

توضیح دستور
ساخت یک مخزن جدید در پوشهٔ فعلی git init
کپی کردن یک مخزن از راه دور git clone [آدرس]
کپی کردن مخزن در یک پوشهٔ مشخص git clone [آدرس] [نام پوشه]

ثبت تغییرات

توضیح دستور
نمایش وضعیت فایل‌ها git status
اضافه کردن فایل به staging area git add [نام فایل]
اضافه کردن همهٔ فایل‌های تغییر یافته git add .
ثبت یک commit با توضیح git commit -m "پیام"
اضافه کردن و ثبت هم‌زمان (فایل‌های ردیابی‌شده) git commit -am "پیام"
اصلاح آخرین commit git commit --amend

مشاهدهٔ تاریخچه و تغییرات

توضیح دستور
نمایش تاریخچهٔ commit‌ها git log
نمایش خلاصه و یک‌خطی تاریخچه git log --oneline
نمایش تفاوت فایل‌های تغییر یافته (قبل از add) git diff
نمایش تفاوت فایل‌های staged git diff --staged
نمایش جزئیات یک commit خاص git show [commit-id]

کار با شاخه‌ها (Branch)

توضیح دستور
نمایش لیست شاخه‌ها git branch
ساخت شاخهٔ جدید git branch [نام]
رفتن به یک شاخه git checkout [نام]
رفتن به یک شاخه (روش جدیدتر) git switch [نام]
ساخت و رفتن به شاخهٔ جدید هم‌زمان git checkout -b [نام]
ادغام یک شاخه با شاخهٔ فعلی git merge [نام شاخه]
حذف یک شاخه git branch -d [نام]
حذف اجباری یک شاخهٔ ادغام‌نشده git branch -D [نام]

کار با ریموت (GitHub و مشابه)

توضیح دستور
اتصال به مخزن راه دور git remote add origin [آدرس]
نمایش لیست ریموت‌ها git remote -v
ارسال تغییرات به سرور git push origin [شاخه]
ارسال شاخهٔ جدید و تنظیم ردیابی آن git push -u origin [شاخه]
دریافت و ادغام تغییرات از سرور git pull origin [شاخه]
فقط دریافت تغییرات بدون ادغام git fetch origin

بازگشت و لغو تغییرات

توضیح دستور
لغو تغییرات یک فایل در Working Directory git checkout -- [فایل]
لغو تغییرات با دستور جدیدتر git restore [فایل]
خارج کردن فایل از staging area git reset [فایل]
بازگشت کامل به یک commit قبلی (خطرناک) git reset --hard [commit-id]
ساخت یک commit جدید که یک commit قبلی را خنثی می‌کند git revert [commit-id]

Stash (ذخیرهٔ موقت تغییرات)

توضیح دستور
ذخیرهٔ موقت تغییرات فعلی git stash
نمایش لیست stash‌ها git stash list
بازگردانی آخرین stash git stash pop
حذف آخرین stash بدون بازگردانی git stash drop

برچسب‌گذاری (Tag)

توضیح دستور
ساخت یک تگ ساده git tag [نام]
ساخت تگ با توضیح git tag -a [نام] -m "پیام"
نمایش لیست تگ‌ها git tag
ارسال تگ‌ها به سرور git push origin --tags

Rebase و Cherry-pick

توضیح دستور
اعمال دوبارهٔ commit‌های شاخهٔ فعلی روی شاخهٔ دیگر git rebase [نام شاخه]
rebase تعاملی برای ویرایش/ترکیب چند commit git rebase -i HEAD~[تعداد]
انتخاب و اعمال یک commit خاص از شاخهٔ دیگر git cherry-pick [commit-id]

حل تعارض (Merge Conflict)

وقتی دو شاخه تغییرات متفاوتی روی یک بخش از یک فایل داشته باشند، هنگام merge یا rebase تعارض (conflict) رخ می‌دهد. Git خطوط متعارض را با نشانه‌های زیر در فایل مشخص می‌کند:

<<<<<<< HEAD
محتوای شاخهٔ فعلی
=======
محتوای شاخهٔ دیگر
>>>>>>> نام-شاخه

برای حل تعارض باید فایل را به‌صورت دستی ویرایش کرد، نشانه‌ها را حذف کرد و نسخهٔ نهایی را انتخاب نمود، سپس:

توضیح دستور
اضافه کردن فایل حل‌شده به staging git add [فایل]
ادامهٔ فرآیند merge git commit
ادامهٔ فرآیند rebase بعد از حل تعارض git rebase --continue
لغو کامل عملیات merge git merge --abort

فایل .gitignore

فایل .gitignore برای مشخص کردن فایل‌ها و پوشه‌هایی است که نباید توسط Git ردیابی شوند (مثل فایل‌های موقت، پوشهٔ node_modules، یا فایل‌های تنظیمات حساس).

# نمونه محتوای .gitignore
node_modules/
.env
*.log
.DS_Store

نکات و بهترین شیوه‌ها

  • پیام commit‌ها را کوتاه، واضح و توصیفی بنویسید.
  • هر commit باید یک تغییر منطقی و مستقل را نشان دهد، نه چند تغییر نامرتبط با هم.
  • قبل از push کردن، همیشه با git pull آخرین تغییرات را دریافت کنید.
  • از شاخه‌های جداگانه (feature branch) برای هر ویژگی یا رفع باگ استفاده کنید و شاخهٔ اصلی (main/master) را همیشه پایدار نگه دارید.
  • پیش از rebase یا reset --hard، مطمئن شوید که تغییرات مهم را از دست نمی‌دهید.

GitHub چیست؟

GitHub یک پلتفرم آنلاین میزبانی مخازن Git است که علاوه بر ذخیرهٔ کد، امکاناتی مثل همکاری تیمی، مدیریت باگ و درخواست، و بررسی کد را فراهم می‌کند. مخزن‌های محلی که با Git می‌سازید را می‌توان روی GitHub آپلود (push) کرد تا دیگران هم بتوانند به آن دسترسی داشته باشند یا در توسعهٔ آن مشارکت کنند.

مفاهیم پایه در GitHub

  • Repository (Repo): یک پروژه که روی GitHub میزبانی می‌شود.
  • Fork: کپی کردن یک مخزن دیگران به حساب خودتان، برای اعمال تغییرات بدون تأثیر روی نسخهٔ اصلی.
  • Pull Request (PR): درخواست رسمی برای ادغام تغییرات شما با مخزن اصلی؛ معمولاً همراه با بررسی کد توسط دیگران.
  • Issue: ثبت باگ، درخواست ویژگی جدید، یا هر بحث مرتبط با پروژه.
  • Star: نشان‌دار کردن یک مخزن به‌عنوان علاقه‌مندی یا نشانه‌ای از محبوبیت آن.
  • Watch: دریافت اعلان از فعالیت‌های یک مخزن.
  • README.md: فایلی که معمولاً توضیحات کلی پروژه (نحوهٔ نصب، استفاده، مشارکت) را در خود دارد و در صفحهٔ اصلی مخزن نمایش داده می‌شود.
  • GitHub Actions: ابزار اتوماسیون (CI/CD) برای اجرای خودکار تست‌ها، ساخت پروژه یا استقرار (Deploy) پس از هر push.
  • Organization: فضایی برای مدیریت چند مخزن و چند عضو تیم زیر یک نام مشترک.

ساخت حساب و مخزن جدید

توضیح مسیر
ساخت حساب کاربری از github.com روی Sign up بزنید
ساخت مخزن جدید دکمهٔ + بالای صفحه سپس New repository
انتخاب Public یا Private هنگام ساخت مخزن مشخص می‌شود؛ Public برای همه قابل‌مشاهده، Private فقط برای اعضای مجاز
اضافه کردن README هنگام ساخت تیک گزینهٔ "Add a README file" را در فرم ساخت مخزن بزنید

اتصال پروژهٔ محلی به GitHub

توضیح دستور
اتصال مخزن محلی به یک مخزن خالی روی GitHub git remote add origin [آدرس مخزن]
تغییر نام شاخهٔ اصلی به main (در صورت نیاز) git branch -M main
ارسال اولین نسخه به GitHub git push -u origin main
کلون کردن یک مخزن از GitHub git clone [آدرس مخزن]

احراز هویت (Authentication)

از سال ۲۰۲۱ به بعد، GitHub دیگر اجازهٔ استفاده از رمز عبور معمولی برای عملیات Git (مثل push) را نمی‌دهد. به‌جای آن باید از یکی از روش‌های زیر استفاده کنید:

روش توضیح
Personal Access Token (PAT) از Settings > Developer settings > Personal access tokens توکن بسازید و به‌جای رمز عبور هنگام push استفاده کنید
SSH Key یک جفت کلید SSH بسازید و کلید عمومی را در Settings > SSH and GPG keys ثبت کنید تا نیازی به وارد کردن رمز نباشد
GitHub CLI (gh) ابزار خط فرمان رسمی گیت‌هاب که احراز هویت را ساده‌تر می‌کند

ساخت و استفاده از کلید SSH:

توضیح دستور
ساخت جفت کلید SSH جدید ssh-keygen -t ed25519 -C "email@example.com"
نمایش کلید عمومی برای کپی کردن cat ~/.ssh/id_ed25519.pub
تست اتصال SSH به GitHub ssh -T git@github.com
استفاده از آدرس SSH به‌جای HTTPS برای ریموت git remote set-url origin git@github.com:username/repo.git

جریان کار Fork و Pull Request

روش معمول مشارکت در پروژه‌های دیگران روی GitHub:

  1. روی دکمهٔ Fork در صفحهٔ مخزن اصلی بزنید تا یک کپی از آن به حساب شما اضافه شود.
  2. نسخهٔ fork‌شده را روی سیستم خودتان clone کنید.
  3. یک شاخهٔ جدید بسازید و تغییرات موردنظر را اعمال و commit کنید.
  4. تغییرات را به fork خودتان روی GitHub push کنید.
  5. از صفحهٔ مخزن، دکمهٔ New Pull Request را بزنید تا درخواست ادغام تغییرات به مخزن اصلی ارسال شود.
  6. مالک مخزن اصلی تغییرات را بررسی می‌کند و در صورت تأیید، آن را merge می‌کند.
توضیح دستور
اضافه کردن مخزن اصلی به‌عنوان یک ریموت دوم (برای هماهنگی با آپدیت‌های اصلی) git remote add upstream [آدرس مخزن اصلی]
دریافت آخرین تغییرات مخزن اصلی git fetch upstream
ادغام تغییرات مخزن اصلی با شاخهٔ فعلی git merge upstream/main

مدیریت Issue و پروژه

توضیح مسیر
ثبت یک Issue جدید تب Issues در صفحهٔ مخزن، سپس New issue
اتصال یک Pull Request به یک Issue (بستن خودکار آن) در توضیح PR بنویسید Closes #شماره‌ایشو
استفاده از برچسب (Label) برای دسته‌بندی Issue‌ها داخل صفحهٔ هر Issue، بخش Labels
مدیریت وظایف با تخته‌ی کانبان تب Projects در صفحهٔ مخزن یا سازمان

فایل‌های مهم در یک مخزن GitHub

فایل کاربرد
README.md توضیح کلی پروژه، نحوهٔ نصب و استفاده
.gitignore مشخص کردن فایل‌هایی که نباید ردیابی شوند
LICENSE مجوز استفاده و توزیع پروژه
.github/workflows/ فایل‌های تنظیمات GitHub Actions برای اجرای خودکار CI/CD
CONTRIBUTING.md راهنمای نحوهٔ مشارکت در پروژه برای دیگران

نکات و بهترین شیوه‌ها (GitHub)

  • همیشه یک فایل README واضح و کامل برای پروژه بنویسید تا دیگران سریع بفهمند پروژه چیست و چطور استفاده می‌شود.
  • برای پروژه‌های عمومی، یک فایل LICENSE مناسب انتخاب کنید تا شرایط استفاده از کد مشخص باشد.
  • از SSH به‌جای HTTPS برای اتصال استفاده کنید تا نیازی به وارد کردن توکن در هر push نباشد.
  • برای هر ویژگی یا رفع باگ، یک شاخهٔ جداگانه بسازید و از طریق Pull Request به شاخهٔ اصلی merge کنید، نه push مستقیم.
  • توضیحات Pull Request و Commit را واضح بنویسید تا بررسی کد برای دیگران ساده‌تر باشد.
  • از قابلیت GitHub Actions برای اجرای خودکار تست‌ها پیش از merge استفاده کنید تا کیفیت کد حفظ شود.