Remote فقط یک نام برای آدرس مخزن روی سرور است (معمولاً origin). Tracking یعنی شاخهٔ محلی تو به کدام شاخهٔ سرور وصل است — از روی آن Git میگوید چند کامیت جلوتر یا عقبتری.
🎯 اهداف یادگیری
originرا بهعنوان نام مستعار URL توضیح دهی- fetch را از pull جدا کنی
-uو شاخهٔ بالادست را تنظیم کنی- force-with-lease را بهجای force خام استفاده کنی
🌐 Remote چیست؟
git remote -v # origin git@github.com:rezaian-dev/git-lab.git (fetch) # origin git@github.com:rezaian-dev/git-lab.git (push) git remote add origin git@github.com:rezaian-dev/git-lab.git git remote set-url origin git@github.com:rezaian-dev/git-lab.git
در VS Code: Publish Branch اگر origin نباشد، ویزارد GitHub را باز میکند.
📡 fetch ≠ pull
| فرمان | چه میکند |
|---|---|
git fetch |
اشیای جدید را میآورد؛ شاخهٔ محلی را حرکت نمیدهد |
git fetch --prune |
refهای حذفشده روی سرور را محلی پاک میکند |
git pull |
fetch + merge (یا rebase اگر تنظیم شده) |
git pull --ff-only |
فقط اگر fast-forward ممکن باشد — امنترین pull |
git fetch origin git log --oneline HEAD..origin/main # چه چیزی میآید؟ git merge --ff-only origin/main
- Publish Branch اولین push و ساخت origin (با ورود GitHub)
- آیکون ↻ Sync = pull سپس push
- منوی
...جداگانه: Fetch / Pull / Push / Pull (Rebase) - نوار وضعیت:
↑1 ↓2یعنی ahead/behind git.autofetch: trueدر پسزمینه fetch میکند
git fetch origin
git pull --ff-only
git push -u origin HEAD
شکل ۱۴ب — نوار وضعیت: ↑ ahead و ↓ behind. دکمهٔ Sync همان pull سپس push است.
📌 tracking
git switch -c feat/auth git push -u origin HEAD # -u = --set-upstream git status -sb # ## feat/auth...origin/feat/auth [ahead 1, behind 2]
- ahead = کامیت محلی که remote ندارد
- behind = کامیت remote که محلی نداری
- هر دو = واگرایی → باید merge یا rebase کنی قبل از push
🚀 push امن
git push --force-with-lease # اگر کس دیگری push کرده باشد، رد میشود
--force کورکورانه تاریخچهٔ سرور را عوض میکند. --force-with-lease فقط اگر remote همان چیزی باشد که تو آخرینبار دیدی.
در VS Code هنگام Push اگر rejected شدی، Force Push را نزن مگر روی شاخهٔ شخصی.
در Rulesets باید ممنوع باشد. اگر نیست، همین امروز ممنوعش کن (فصل ۲۷).
Junior — origin اسم خاصی است؟ قرارداد است؛ میتواند github باشد. فقط نام مستعار URL است.
Mid — چرا ff-only؟ جلوی mergeهای اتفاقی و تاریخچهٔ دندانهدار را میگیرد.
Senior — lease چه چیزی را میسنجد؟ هش refs/heads/... روی remote را با remote-tracking محلی مقایسه میکند.
✅ چکلیست فهم
- fetch را بدون ترس میزنی
- ahead/behind را میخوانی
-uعادت شده- force خام را کنار گذاشتهای
فصل بعد: GitHub بهعنوان محصول — ریپو، README، Topics.