مرور شب امتحانی دستورات Git
/ 6 min read
Updated:Table of Contents
مرور شب امتحانی دستورات Git
شروع کار با Git
نصب و راهاندازی اولیه
# تنظیم نام و ایمیل (فقط یه بار)git config --global user.name "اسم شما"git config --global user.email "email@example.com"
# مشاهده تنظیمات فعلیgit config --listشروع یه پروژه جدید
دو حالت داریم:
حالت ۱: شروع از صفر
# رفتن به پوشه پروژهcd /path/to/your/project
# راهاندازی Gitgit init
# اضافه کردن ریموت (GitHub, GitLab و...)git remote add origin https://github.com/username/project-name.gitحالت ۲: کلون کردن پروژه موجود
git clone https://github.com/username/project-name.gitcd project-nameدستورات روتین Git
چک کردن وضعیت پروژه
# ببینید چه فایلهایی تغییر کردهgit statusخروجی git status چیزی شبیه این میشه:
On branch mainYour branch is up to date with 'origin/main'.
Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: README.md modified: package.json
Changes not staged for commit: (use "git add <file>..." to update what will be committed) modified: src/App.tsx modified: vite.config.tsاضافه کردن فایلها به stage
# همه فایلهای تغییر یافتهgit add .
# یه فایل خاصgit add filename.js
# چندین فایل خاصgit add file1.js file2.css file3.htmlکامیت کردن تغییرات
# کامیت با پیامgit commit -m "توضیح تغییرات"
# کامیت همه تغییرات (بدون نیاز به git add)git commit -am "پیام کامیت"ارسال به سرور
# ارسال به شاخه maingit push origin main
# ارسال به شاخه دیگه (مثلاً dev)git push origin devمفهوم Origin چیه؟
origin یه نام مستعار (alias) برای آدرس ریموت repository شماست. به جای اینکه هر بار آدرس کامل رو تایپ کنید:
git push https://github.com/myuser/myproject.git mainمیتونید بنویسید:
git push origin mainمشاهده ریموتهای تعریف شده
git remote -vخروجی:
origin https://github.com/myuser/myproject.git (fetch)origin https://github.com/myuser/myproject.git (push)نکات مهم قبل از کامیت
۱. همیشه git status بزنید
قبل از git add . حتماً git status بزنید تا ببینید چه فایلهایی تغییر کرده.
۲. فایل .gitignore رو فراموش نکنید
فایلهای حساس (پسورد، توکن، فایلهای کانفیگ) رو حتماً تو .gitignore بذارید:
# مثال .gitignorenode_modules/.env*.log.DS_Storedist/۳. پیامهای کامیت معنادار بنویسید
# بد ❌git commit -m "fix"
# خوب ✅git commit -m "رفع باگ لاگین در صفحه اصلی"کار با Branch ها
ایجاد و استفاده از Branch
# رفتن به شاخه اصلیgit checkout main
# مطمئن شدن از آخرین نسخهgit pull origin main
# ایجاد branch جدیدgit branch feature/login-page
# رفتن به branch جدیدgit checkout feature/login-page
# یا هر دو کار با یه دستورgit checkout -b feature/login-pageارسال Branch به ریموت
نکته مهم: branch های محلی خودکار به ریموت نمیرن! باید دستی بفرستیدشون:
# ارسال branch جدید به ریموتgit push origin feature/login-pageادغام (Merge) Branch ها
# برگشت به maingit checkout main
# دریافت آخرین تغییراتgit pull origin main
# ادغام branchgit merge feature/login-page
# ارسال تغییراتgit push origin mainحذف Branch ها
# حذف محلیgit branch -d feature/login-page
# حذف از ریموتgit push origin --delete feature/login-pageReset و بازگشت به عقب
انواع git reset
۱. git reset —soft
git reset --soft HEAD~1- کامیت حذف میشه اما تغییرات staged باقی میمونن
- برای ویرایش پیام کامیت آخر مفیده
۲. git reset —mixed (پیشفرض)
git reset HEAD~1# یاgit reset --mixed HEAD~1- کامیت حذف میشه، تغییرات unstaged میشن
- فایلها تو working directory باقی میمونن
۳. git reset —hard (خطرناک!)
git reset --hard HEAD~1- همه چیز حذف میشه! کامیت، stage، و تغییرات فایلها
- غیرقابل بازگشت (مگر با git reflog)
مفهوم HEAD
HEAD اشارهگر به موقعیت فعلی شماست تو Git. معمولاً به آخرین کامیت اشاره میکنه.
حالتهای HEAD
۱. Attached (متصل): به یه branch اشاره میکنه
git checkout main # HEAD متصل به main۲. Detached (جدا): مستقیماً به یه کامیت اشاره میکنه
git checkout a1b2c3d # HEAD جدا شدههشدار: تو حالت detached اگه کامیت کنید، ممکنه تغییراتتون گم شه!
تگگذاری (Tagging)
تگها برای علامتگذاری نسخههای مهم استفاده میشن:
# ایجاد تگ با توضیحgit tag -a v1.0.0 -m "نسخه اول محصول"
# ارسال تگ به ریموتgit push origin v1.0.0
# ارسال همه تگهاgit push origin --tags
# مشاهده تگهاgit tag
# مشاهده جزئیات تگgit show v1.0.0
# حذف تگ محلیgit tag -d v1.0.0
# حذف تگ از ریموتgit push origin --delete v1.0.0نکته: تگها قابل حرکت نیستند! همیشه به همون کامیت اشاره میکنن.
استراتژیهای Branching
۱. GitHub Flow (ساده و محبوب)
مناسب برای پروژههای کوچک تا متوسط:
main ─────────────────► │ └── feature/login ──┘- همه کار از
mainشروع میشه - هر ویژگی تو branch جدا
- Pull Request برای بررسی
- Merge و Deploy
۲. Git Flow (پیچیدهتر)
مناسب برای پروژههای بزرگ:
main ─────────────────►develop ──────────────► │ ├── feature/login ──┘ ├── release/v1.0 ───┘ └── hotfix/bug ─────┘شاخهها:
- main: کد آماده انتشار
- develop: کد در حال توسعه
- feature/*: ویژگیهای جدید
- release/*: آمادهسازی نسخه جدید
- hotfix/*: رفع باگهای فوری
انتخاب استراتژی
| اندازه تیم | سرعت انتشار | توصیه |
|---|---|---|
| ۱-۵ نفر | روزانه/هفتگی | GitHub Flow |
| ۵-۲۰ نفر | دوهفتهای | GitHub Flow + سازماندهی |
| ۲۰+ نفر | ماهانه | Git Flow |
Merge vs Rebase
Merge
git checkout maingit merge feature/loginویژگیها:
- تاریخچه حفظ میشه
- یه کامیت merge ایجاد میشه
- ایمن برای کار تیمی
Rebase
git checkout feature/logingit rebase mainویژگیها:
- تاریخچه خطی و تمیز
- کامیتها بازنویسی میشن
- فقط برای branch های محلی!
** هشدار**: هرگز از rebase روی branch هایی که دیگران روی اون کار میکنن استفاده نکنید!
git push -f (Force Push)
گاهی اوقات نیاز دارید تغییرات رو بهصورت اجباری بفرستید:
git push -f origin main# یاgit push --force origin main** خطرناک**: این دستور تاریخچه ریموت رو بازنویسی میکنه و ممکنه کار دیگران رو خراب کنه!
استفاده ایمنتر:
git push --force-with-lease origin mainاین دستور اگه کسی دیگه تغییری کرده باشه، اجازه push نمیده.
نکات و ترفندهای مفید
۱. مشاهده لاگ تغییرات
# لاگ سادهgit log
# لاگ خلاصهgit log --oneline
# لاگ گرافیکیgit log --graph --oneline۲. مقایسه تغییرات
# مقایسه working directory با stagegit diff
# مقایسه staged با آخرین کامیتgit diff --staged
# مقایسه دو کامیتgit diff commit1 commit2۳. Stash (نگهداری موقت)
# ذخیره موقت تغییراتgit stash
# مشاهده stash هاgit stash list
# بازگشت آخرین stashgit stash pop
# بازگشت stash خاصgit stash apply stash@{2}۴. Alias ها (میانبرها)
# تعریف میانبرهاgit config --global alias.st statusgit config --global alias.co checkoutgit config --global alias.br branch
# حالا میتونید بنویسید:git st # بجای git statusgit co main # بجای git checkout mainمشکلات رایج و راه حل
۱. فراموشی .gitignore
# حذف فایل از tracking (اما نگهداری محلی)git rm --cached filename
# حذف پوشه از trackinggit rm -r --cached foldername/۲. کامیتهای اضافی
اگه کامیتهای زیاد و بیخود دارید:
# ایجاد branch جدیدgit checkout -b cleanup-branch
# کار روی اون# بعداً merge با main۳. Conflict در Merge
# مشاهده فایلهای conflictgit status
# ویرایش دستی فایلها# حذف علامتهای <<<<<<< ======= >>>>>>>
# اضافه کردن فایلهای حل شدهgit add conflicted-file.js
# تکمیل mergegit commit۴. بازیابی کامیت حذف شده
# مشاهده تاریخچه کاملgit reflog
# بازگشت به کامیت خاصgit checkout commit-hash
# ایجاد branch جدید از آن نقطهgit checkout -b recovered-branchبهترین عادتها
۱. نامگذاری Branch ها
# خوب ✅feature/user-authenticationbugfix/login-errorhotfix/critical-security-patch
# بد ❌my-branchtestfix۲. پیامهای کامیت
# خوب ✅"Add user authentication system""Fix responsive design on mobile devices""Update dependencies to latest versions"
# بد ❌"fix""update""changes"۳. کامیتهای منظم
- هر ویژگی کامل = یک کامیت
- تغییرات مرتبط رو با هم کامیت کنید
- کامیتهای کوچک بهتر از کامیتهای بزرگ
۴. Branch های کوتاهمدت
- برای هر task یا feature یک branch
- بعد از merge سریعاً حذف کنید
- بیش از چند روز branch رو باز نذارید
نظر شما چیه؟