Git
Chapters ▾ 2nd Edition

2.5 مقدمات گیت - کار با ریموت‌ها

کار با ریموت‌ها

برای اینکه بتوانید در هر پروژهٔ گیت همکاری کنید، دانستن شیوهٔ مدیریت مخزن‌های ریموت لازم است. مخازن ریموت یک نسخه از پروژهٔ شما هستند که در اینترنت یا جایی دیگر در شبکه قرار دارند. می‌توانید چند تا از آنها داشته باشید که معمولاً هر کدام برای شما یا فقط قابل خواندن یا خواندنی/نوشتی هستند. همکاری با دیگران شامل درگیری با مدیریت این مخازن ریموت و پوش و پول کردن داده از و به آنها به هنگام اشتراک کار است. مدیریت مخازن ریموت به مفهوم دانستن نحوه افزودن مخازن ریموت، حذف کردن ریموت‌های منقضی، مدیریت شاخه‌های گوناگون ریموت و تعریف آنها به عنوان دنبال‌شده یا دنبال‌شنده و غیره است. در این بخش ما درباره برخی از مهارت‌‌های مدیریت-ریموت صبحت خواهیم کرد.

یادداشت
مخازن ریموت می‌توانند روی کامپیوتر محلی خودتان باشند.

به سادگی امکان پذیر است که شما با مخازن «remote» کار کنید که در واقع روی همان میزبانی هستند که شما هستید. واژهٔ «remote» لزوماً به معنی این نیست که مخزن دور از دسترس، روی اینترنت یا هرجای دیگری از شبکه باشد، تنها به این معنی است که مخزن جای دیگری است. کارکردن با اینگونه مخازن ریموت نیز همانند هر ریموت دیگری نیز شامل عملیات‌های پوش، پول و فچ رایج است.

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

برای دیدن سرورهای ریموت که پیکربندی شده‌اند، می‌توانید دستور git remote را اجرا کنید. این دستور نام‌های کوتاه سرورهای ریموتی که شما برگزیدید را نشان خواهد داد. اگر مخزن خود را کلون کرده‌اید، باید دست کم یک origin ببینید — که همان نام پیش‌فرضی است که گیت به سروری که از آن کلون کرده‌اید می‌دهد:

$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin

همچنین می‌توانید -v را بکار گیرید که به شما URLهایی که گیت برای اسامی کوتاه ذخیره کرده تا هنگام نوشتن و خواندن به آن ریموت استفاده شود را شامل می‌شود:

$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)

اگر بیش از یک سرور ریموت داشته باشید، این دستور همه را لیست می‌کند. برای نمونه، یک مخزن با چند ریموت‌های متعدد برای کار با چندین همکار چیزی شبیه این خواهد بود.

$ cd grit
$ git remote -v
bakkdoor  https://github.com/bakkdoor/grit (fetch)
bakkdoor  https://github.com/bakkdoor/grit (push)
cho45     https://github.com/cho45/grit (fetch)
cho45     https://github.com/cho45/grit (push)
defunkt   https://github.com/defunkt/grit (fetch)
defunkt   https://github.com/defunkt/grit (push)
koke      git://github.com/koke/grit.git (fetch)
koke      git://github.com/koke/grit.git (push)
origin    git@github.com:mojombo/grit.git (fetch)
origin    git@github.com:mojombo/grit.git (push)

این به معنی است که ما می‌توانیم مشارکت‌ها را از هر کدام از این کاربرها به راحتی دریافت کنیم. شاید ما به علاوه دسترسی برای پوش به یک یا چندی از این مخازن را نیز داشته باشیم، اگرچه در اینجا نمی‌توانیم به آن پی ببریم.

دقت کنید که این ریموت‌ها از پروتکل‌های متنوعی استفاده ‌می‌کنند؛ ما درباره این موضوع در راه‌اندازی گیت در سرور بیشتر خواهیم گفت.

اضافه کردن مخازن ریموت

پیشتر ذکر کردیم و چند مثال را بررسی کردیم که چگونه دستور git clone به طور ضمنی ریموت origin را برای شما اضافه می‌کند. اینجا نحوهٔ اضافه کردن ریموت به طور صریح قرار دارد. برای اضافه کردن یک مخزن گیت ریموت جدید با یک نام کوتاه که برای سهولت مراجعه استفاده می‌کنید، git remote add <shortname> <url> را اجرا کنید:

$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)
pb	https://github.com/paulboone/ticgit (fetch)
pb	https://github.com/paulboone/ticgit (push)

حالا می‌توانید از pb در محیط ترمینال به جای کل آدرس آن مخزن استفاده کنید. برای مثال، اگر بخواهید تمام اطاعاتی را که پاول دارد اما شما ندارید را فچ کنید، می‌توانید دستور git fetch pb اجرا کنید:

$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
 * [new branch]      master     -> pb/master
 * [new branch]      ticgit     -> pb/ticgit

برنچ master پاول حالا به صورت محلی در master/pb قابل دسترس دسترس است — شما می‌توانید این شاخه را در هر کدام از بر‌نچ‌های دلخواه خود ادغام کنید، یا می‌توانید یک برنچ محلی در آن نقطه را چک‌اوت کنید، اگر مایلید آنرا بازرسی کنید. (ما درباره برنچ‌ها و چگونگی استفاده از آن‌ها با جزئیات بیشتر در بخش شاخه‌سازی در گیت خواهیم گفت.)

فچ و پول کردن از مخازن ریموتتان

همانطور که مشاهده کردید، برای دریافت اطلاعات از پروژه‌های ریموت خود،‌می‌توانید این دستور را اجرا کنید:

$ git fetch <remote>

دستور به پروژه ریموت مراجعه می‌کند و همهٔ اطلاعات آن پروژه ریموت را که شما ندارید را پول می‌کند. بعد از انجام این کار، باید رفرنس‌هایی به تمام برنچ‌های آن ریموت داشته باشید، که می‌توانید آنها را در هر لحظه ادغام یا مورد نمایش قرار دهید.

اگر شما یک مخزن را کلون کنید، دستور به صورت خودکار آن مخزن را تحت عنوان «origin» اضافه می‌کند. پس git fetch origin تمامی کارها و اتفاقات جدیدی را که در آن سرور از وقتی که شما آن را کلون کرده‌اید (یا آخرین فچی که از آن کردید) دریافت می‌کند. خیلی مهم است که دقت کنید که دستور git fetch فقط اطلاعات را در مخزن محلی شما دانلود می‌کند — این دستور به صورت خودکار آن را با هیچ‌کدام از کار‌های شما ادغام یا کارهای فعلی شما را ویرایش نمی‌کند.

اگر برنچ جاری شما تنظیم شده باشد تا یک شاخه ریموت را دنبال کند (بخش بعدی و شاخه‌سازی در گیت‌ را برای اطلاعات بیشتر ببینید)، می‌توانید از دستور git pull استفاده کنید تا به صورت خودکار فچ و سپس ادغام آن با برنچ ریموت به برنچ فعلی شما انجام شود. شاید این، روند کاری راحت‌تر یا آسان‌تری برای شما باشد، و به صورت پیش‌فرض دستور git clone به طور خودکار برنچ master محلی شما را برای دنبال کردن برنچ master (یا هر چیزی که شاخه پیش فرض نامیده‌ شود) ریموت آن سروری که از آن کلون کردید تنظیم می‌کند. اجرا کردن git pull به صورت کلی تمام داده‌ها را از سروری که ابتدا از آن کلون کرده‌ بودید فچ می‌کند و به صورت خودکار سعی می‌کند تا آنرا در کدی که اکنون روی آن کار می‌کنید ادغام کند.

پوش کردن به ریموت‌هایتان

زمانی که پروژه‌ای دارید که در درجه‌ای است که می‌خواهید آن را به اشتراک بگذارید، باید آن را به بالادست پوش کنید. دستور این کار ساده است: git push <remote> <branch>. اگر می‌خواهید برنچ master را به سرور origin خود پوش کنید (مجدداً، کلون کردن هر دو این نام‌ها را به طور اتوماتیک برای شما تنظیم می‌کند)، می‌توانید این دستور را اجرا کنید تا هر کامیتی که گرفته‌اید را به سرور پوش کنید.

$ git push origin master

این دستور فقط زمانی کار می‌کند که شما مخزنی را از سروری کلون کرده باشید که دسترسی نوشتن نیز داشته باشید و کسی در این حین پوش نکرده باشد. اگر شما و شخصی دیگر در آن واحد کلون کنید و آنها به بالادست پوش کنند و سپس شما به بالادست پوش کنید، پوش شما بلافاصله رد خواهد شد. ابتدا شما کار آن‌ها را فچ کنید و آنرا در کار خود تعبیه کنید، پیش از اینکه مجاز به پوش شوید. برای جزئیات بیشتر درباره نحوه پوش روی یک سرور ریموت بخش شاخه‌سازی در گیت را مطالعه کنید.

بازرسی ریموت

اگر می‌خواید درباره یک ریموت خاص اطلاعات بیشتری ببینید، می‌توانید از دستور git remote show <remote> استفاده کنید. اگر این دستور را با یک اسم خاص کوتاه اجرا کنید، مثلاً origin، چیزی شبیه به این را خواهید دید:

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

این دستور URL مخزن ریموت و همچنین اطلاعات برنچ‌هایی که دنبال می‌شوند را لیست می‌کند. دستور به طور مفید و مختصر به شما می‌گوید که اگر بر روی برنچ master هستید و git pull را اجرا کنید، به صورت اتوماتیک، پس از فچ کردن تمام رفرنس‌های ریموت، برنچ master را با نسخه ریموت مرج می‌کند. همچنین تمام رفرنس‌های ریموتی را که پول کرده را لیست می‌کند.

این ساده‌ترین مثالی است که غالباً با آن مواجه می‌شوید. هرچند، وقتی از گیت در سطح وسیع‌‌تری استفاده کنید، احتمالاً اطلاعات بیشتری git remote show خواهید دید:

$ git remote show origin
* remote origin
  URL: https://github.com/my-org/complex-project
  Fetch URL: https://github.com/my-org/complex-project
  Push  URL: https://github.com/my-org/complex-project
  HEAD branch: master
  Remote branches:
    master                           tracked
    dev-branch                       tracked
    markdown-strip                   tracked
    issue-43                         new (next fetch will store in remotes/origin)
    issue-45                         new (next fetch will store in remotes/origin)
    refs/remotes/origin/issue-11     stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    dev-branch merges with remote dev-branch
    master     merges with remote master
  Local refs configured for 'git push':
    dev-branch                     pushes to dev-branch                     (up to date)
    markdown-strip                 pushes to markdown-strip                 (up to date)
    master                         pushes to master                         (up to date)

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

تغییر نام و حذف ریموت‌ها

شما می‌توانید دستور git remote rename را اجرا کنید تا نام کوتاه ریموت را عوض کنید. برای نمونه، اگر می‌خواهید نام pb را به paul تغییر دهید،‌ می‌توانید با دستور git remote rename این کار را انجام دهید:

$ git remote rename pb paul
$ git remote
origin
paul

شایان ذکر است که دستور بالا نام تمام برنچ‌های در پی ریموت شما را نیز تغییر می‌دهد. چیزی که سابقاً توسط pb/master به آن اشاره می‌شد، اکنون در paul/master قرار دارد.

اگر می‌خواهید یک ریموت را به هر دلیلی حذف کنید — سرور را جابه‌جا کرده‌اید دیگر از آن کپی خاص استفاده نمی‌کنید، یا شاید یک مشارکت‌کننده دیگر مشارکت نمی‌کند — می‌توانید یا از دستور git remote remove یا از دستور git remote rm استفاده کنید:

$ git remote remove paul
$ git remote
origin

یکبار که مرجع یک ریموت را به این صورت پاک کنید، تمامی برنچ‌های پیگیر و پیکیربندی‌های مرتبط با آن ریموت نیز از بین خواهند رفت.