Git
Chapters ▾ 2nd Edition

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

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

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

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

به سادگی امکان پذیر است که شما با مخازن “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)

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

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

ما پیش‌تر درباره چگونه دستور 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 در محیط ترمینال به جای کل آدرس آن مخزن استفاده کنید. برای مثال، اگر شما بخواهید تمام اطاعاتی که paul دارد را فچ یا دریافت کنید اما هنوز اطلاعات در مخزن خود ندارید، با اجرای دستور 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_branching] گفته‌ایم.)

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

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

$ git fetch <remote>

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

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

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

این کار شاید برای شما خیلی راحت‌تر یا مورد استقبال‌تر باشد، و به صورت پیش فرض دستور git clone خودکار برنچ مستر لوکال شما را برای دنبال کردن برنچ مستر(یا هرچی که آن شاخه به صورت پیش فرض نامیده‌ شود) ریموت تنظیم می‌کند.

اجرا کردن git pull به صورت کلی تمام اطلاعات را از سروری که شما کلون اصلی را انجام دادید؛ فچ می‌کند و به صورت خودکار سعی می‌کند به ادغام یا مرج کردن کد‌های سرور در جایی که شما در حال کار کردن هستید.

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

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

$ git push origin master

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

بازرسی ریموت

اگر می‌خواید درباره یک ریموت خاص اطلاعات بیشتری ببینید، می‌توانید از دستور git remote shot {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)

این دستور آدرس مخزن ریموت و همچنین اطلاعات برنچ‌هایی که دنبال می‌شوند را لیست می‌کند و مفید و مختصر به شما می‌گوید که اگر بر روی برنچ مستر هستید و دستور git pull را اجرا کنید، به صورت اتوماتیک اطلاعات که دریافت می‌کند در برنج مستر شما مرج می‌کند و همچنین لیست تمام ریموت‌های منبع که از آن پول کرده است را نمایش می‌دهد. این ساده‌ترین مثالی است که شما با آن برخورد خواهید کرد. وقتی از گیت در سطح وسیع‌‌تری استفاده کنید،‌احتمالا اطلاعات بیشتری با این دستور به شما نشان داده شود، 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 اجرایی خواهد شد.

Renaming and Removing Remotes

شما می‌توانید دستور 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

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