Git 2026

فصل ۱۴ · Remote

Remote — fetch، pull، push و tracking

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
🖥️ VS Code Git
  • Publish Branch اولین push و ساخت origin (با ورود GitHub)
  • آیکون ↻ Sync = pull سپس push
  • منوی ... جداگانه: Fetch / Pull / Push / Pull (Rebase)
  • نوار وضعیت: ↑1 ↓2 یعنی ahead/behind
  • git.autofetch: true در پس‌زمینه fetch می‌کند
⌨️ Terminal

git fetch origin git pull --ff-only git push -u origin HEAD

Sync و ahead/behind در VS Code

شکل ۱۴ب — نوار وضعیت: ↑ 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 امن

هرگز --force خام روی شاخهٔ مشترک
git push --force-with-lease
# اگر کس دیگری push کرده باشد، رد می‌شود

--force کورکورانه تاریخچهٔ سرور را عوض می‌کند. --force-with-lease فقط اگر remote همان چیزی باشد که تو آخرین‌بار دیدی.

در VS Code هنگام Push اگر rejected شدی، Force Push را نزن مگر روی شاخهٔ شخصی.

--force روی main

در Rulesets باید ممنوع باشد. اگر نیست، همین امروز ممنوعش کن (فصل ۲۷).

سؤالات مصاحبه (با پاسخ)

Junior — origin اسم خاصی است؟ قرارداد است؛ می‌تواند github باشد. فقط نام مستعار URL است.

Mid — چرا ff-only؟ جلوی mergeهای اتفاقی و تاریخچهٔ دندانه‌دار را می‌گیرد.

Senior — lease چه چیزی را می‌سنجد؟ هش refs/heads/... روی remote را با remote-tracking محلی مقایسه می‌کند.

✅ چک‌لیست فهم

  • fetch را بدون ترس می‌زنی
  • ahead/behind را می‌خوانی
  • -u عادت شده
  • force خام را کنار گذاشته‌ای

فصل بعد: GitHub به‌عنوان محصول — ریپو، README، Topics.

فصل ۱۴ از ۳۶ · مرجع جامع و حرفه‌ای Git و GitHub · ویرایش 1.0.0