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