Git

از shakiba
نسخهٔ تاریخ ۶ سپتامبر ۲۰۲۶، ساعت ۰۶:۴۳ توسط Admin (بحث | مشارکت‌ها)
پرش به ناوبری پرش به جستجو

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، مطمئن شوید که تغییرات مهم را از دست نمی‌دهید.