مقدمه

تا اینجای کار، تمام فعالیت‌های ما روی یک مخزن محلی (Local Repository) روی کامپیوتر خودمان متمرکز بوده است. این برای پروژه‌های شخصی کافی است، اما قدرت واقعی گیت در قابلیت همکاری تیمی آن نهفته است. برای همکاری، شما نیاز به یک مخزن مرکزی دارید که همه اعضای تیم بتوانند به آن دسترسی داشته باشند.

در دنیای گیت، به این مخازن اشتراکی که روی یک سرور میزبانی می‌شوند، مخازن ریموت (Remote Repositories) گفته می‌شود. پلتفرم‌هایی مانند گیت‌هاب، گیت‌لب و بیت‌باکت، سرویس‌هایی برای میزبانی این مخازن ریموت ارائه می‌دهند. در این درس، یاد می‌گیریم چگونه مخزن محلی خود را به یک مخزن ریموت متصل کرده و تغییرات را بین آن‌ها همگام‌سازی کنیم.

ریموت (Remote) چیست؟

یک ریموت در واقع یک «نام مستعار» یا یک «شورت‌کات» برای آدرس URL یک مخزن دیگر است. شما می‌توانید چندین ریموت برای یک مخزن محلی داشته باشید. به طور قراردادی، نام ریموت اصلی که مخزن از آن کلون شده یا مخزن اصلی پروژه است را origin می‌گذارند.

مشاهده ریموت‌ها

برای دیدن لیست ریموت‌هایی که برای مخزن شما تعریف شده‌اند، از دستور git remote استفاده کنید:

git remote

اگر از آپشن -v (مخفف verbose) استفاده کنید، علاوه بر نام ریموت، آدرس URL آن را نیز مشاهده خواهید کرد. شما دو آدرس برای هر ریموت می‌بینید: یکی برای دریافت (fetch) و دیگری برای ارسال (push) تغییرات.

git remote -v
origin  https://github.com/user/repo.git (fetch)
origin  https://github.com/user/repo.git (push)

افزودن یک ریموت جدید

اگر یک مخزن را با git init به صورت محلی ایجاد کرده‌اید، در ابتدا هیچ ریموتی ندارد. شما باید به صورت دستی آن را اضافه کنید. برای مثال، پس از ساخت یک مخزن جدید در گیت‌هاب، می‌توانید آن را به عنوان ریموت origin به پروژه محلی خود اضافه کنید:

git remote add origin <URL>

همگام‌سازی با ریموت

چهار دستور اصلی برای تعامل با ریموت‌ها وجود دارد: fetch، push، pull و clone که با آخری در درس‌های قبل آشنا شدیم.

ارسال تغییرات به ریموت: git push

وقتی شما تعدادی کامیت را در مخزن محلی خود ایجاد کرده‌اید، برای به اشتراک گذاشتن آن‌ها با دیگران، باید آن‌ها را به مخزن ریموت push کنید. دستور git push این کار را انجام می‌دهد.

git push <remote-name> <branch-name>

برای مثال، برای ارسال تغییرات برنچ main محلی به ریموت origin:

git push origin main

نکته مهم: گیت تنها در صورتی به شما اجازه push می‌دهد که مخزن ریموت، کامیتی جلوتر از کامیت‌های شما نداشته باشد. اگر شخص دیگری تغییراتی را قبل از شما push کرده باشد، شما ابتدا باید آن تغییرات را دریافت کرده و با کد خود ادغام کنید.

دریافت تغییرات از ریموت: git fetch و git pull

برای دریافت اطلاعات از مخزن ریموت، دو دستور اصلی وجود دارد که تفاوت ظریفی با هم دارند:

  • git fetch: این دستور فقط اطلاعات جدید (کامیت‌ها، برنچ‌ها، تگ‌ها) را از ریموت دانلود می‌کند و در مخزن محلی شما ذخیره می‌کند، اما هیچ تغییری در پوشه کاری (Working Directory) شما ایجاد نمی‌کند. این یک عملیات امن است که به شما اجازه می‌دهد تغییرات دیگران را ببینید (مثلاً با git log origin/main) بدون اینکه با کد فعلی شما ادغام شوند.
  • git pull: این دستور در واقع ترکیبی از دو دستور است: ابتدا یک git fetch اجرا می‌کند و سپس بلافاصله سعی می‌کند برنچ ریموت را با برنچ محلی شما ادغام (merge) کند. این دستور پوشه کاری شما را تغییر می‌دهد.
# فقط دانلود اطلاعات جدید
git fetch origin

# دانلود اطلاعات جدید و ادغام فوری آن با برنچ فعلی
git pull origin main

در یک جریان کاری حرفه‌ای، بسیاری از توسعه‌دهندگان ترجیح می‌دهند از fetch استفاده کنند تا ابتدا تغییرات را بررسی کرده و سپس به صورت دستی با merge یا rebase آن را ادغام کنند. اما برای سادگی، pull نیز بسیار رایج است.

برنچ‌های تعقیب‌کننده (Tracking Branches)

وقتی شما یک مخزن را clone می‌کنید، گیت به صورت خودکار یک ارتباط بین برنچ محلی شما (مثلاً main) و برنچ ریموت (origin/main) برقرار می‌کند. به این برنچ محلی، «برنچ تعقیب‌کننده» می‌گویند.

مزیت این ارتباط این است که شما می‌توانید از دستورات git pull و git push بدون ذکر نام ریموت و برنچ استفاده کنید. گیت به صورت خودکار می‌داند که باید با کدام ریموت و برنچ همگام‌سازی شود.

وقتی برای اولین بار یک برنچ محلی جدید را push می‌کنید، می‌توانید با آپشن -u (مخفف --set-upstream) این ارتباط را برقرار کنید:

git push -u origin feature-branch

از این پس، برای این برنچ کافیست فقط از git push و git pull استفاده کنید.