سرفصل‌های آموزشی
آموزش کاربردی گیت برای برنامه نویسان
git pull

git pull

در قسمت قبل، دستور git push را بررسی کردیم و متوجه شدیم که از این دستور برای آپلود محتوا از مخزن remote به مخزن محلی استفاده می شود. در این قسمت می خواهیم دستور git pull را (که می توان گفت به نوعی معکوس دستور git push است)، بررسی کنیم.

از دستور git pull برای واکشی و دانلود محتوا از یک مخزن remote استفاده می شود. این دستور بلافاصله پس از دانلود از مخزن remote، مخزن محلی را برای مطابقت با محتوای دانلود شده به روزرسانی می کند. دستور git pull در واقع ترکیبی از دو دستور دیگر است: git fetch و پس از آن، git merge. در مرحله اول، git pull یک git fetch را به شاخه محلی که HEAD به آن اشاره شده است، اجرا می کند. پس از دانلود محتوا، git pull یک merge گردش کار وارد می کند. بنابراین یک commit جدید برای merge ایجاد می شود و HEAD برای اشاره به commit جدید به روز می شود.

استفاده از Git pull

git pull چگونه کار می کند:

دستور git pull ابتدا git fetch را اجرا می کند که محتوا را از مخزن remote مشخص شده، دانلود کند. سپس یک git merge اجرا می شود تا ref ها و head های محتوای remote را با یک commit merge جدید در مخزن محلی یکی کند. برای نشان دادن بهتر روند pull و merge، اجازه دهید مثال زیر را در نظر بگیریم. فرض کنید ما یک مخزن با یک شاخه ی master و یک origin remote داریم.

در این سناریو ، git pull تمام تغییرات را از نقطه ای که local و master از هم جدا شده اند، دانلود می کند. در این مثال، آن نقطه E است. commit ،git pull های remote را که A-B-C هستند، واکشی می کند. پس از آن، روند pull یک merge commit محلی جدید ایجاد می کند که حاوی محتوای commit های جدید remote است.

در نمودار بالا، commit جدید H را می بینیم. این commit یک merge commit جدید است که شامل محتویات commit های A-B-C  موجود در remote است. این مثال یکی از چند استراتژی merge کردن git pull است. یک گزینه rebase-- می تواند به git pull اضافه شود تا به جای merge commit، از استراتژی rebase merging استفاده شود. مثال بعدی نشان می دهد که چگونه یک rebase pull کار می کند. فرض کنید که ما در نقطه شروع نمودار اول خود هستیم و git pull --rebase را اجرا کرده ایم.

در این نمودار، می توانیم ببینیم که یک rebase pull باعث ایجاد commit جدید H نمی شود. در عوض، commit، rebase های remote) A -- B--C) را کپی کرده و commit های محلی E -- F -- G را بازنویسی می کند تا بعد از آن ها در تاریخچه ی اصلی مربوط به origin/master ظاهر شود.

گزینه های رایج

git pull <remote>

نسخه ی مشخص شده ی remote را از شاخه فعلی واکشی کرده و بلافاصله آن را در نسخه محلی، merge می کند. این دستور مانند این است که ابتدا <git fetch <remote و سپس  <git merge origin/<current-branch را اجرا کنیم.

 git pull --no-commit <remote>

مشابه فراخوانی پیش فرض، محتوای remote را واکشی می کند اما یک merge commit جدید ایجاد نمی کند.

git pull --rebase <remote>

همان دستور قبلی اما به جای استفاده از git merge برای merge شاخه ی remote با شاخه ی محلی، از git rebase استفاده شده است.

git pull --verbose

در هنگام pull، خروجی طولانی ارائه می دهد که محتوای در حال دانلود و جزئیات merge را نشان می دهد.

بحث در مورد git pull

git pull روشی آسان برای همگام سازی مخزن محلی با تغییرات remote است. نمودار زیر هر مرحله از فرایند pulling را توضیح می دهد.

git pull و همگام سازی

git pull یکی از دستوراتی است که مسئولیت "همگام سازی" محتوای remote را بر عهده دارد. دستور git fetch ممکن است با git pull اشتباه گرفته شود. هر دو دستور برای دانلود محتوای remote استفاده می شوند، اما یک برتری امنیتی بین git pull و git fetch وجود دارد: git fetch را می توان یک گزینه ایمن ولی git pull را ناامن دانست! git fetch محتوای remote را دانلود می کند و وضعیت مخزن محلی را تغییر نمی دهد. اما git pull، پس از دانلود محتوای remote، بلافاصله تلاش می کند حالت محلی را متناسب با آن محتوا تغییر دهد. بنابراین ممکن است ناخواسته باعث شود مخزن محلی در یک وضعیت متناقض قرار گیرد.

pull کردن با rebase

با استفاده از گزینه ی rebase-- می توان با جلوگیری از merge های غیرضروری، یک تاریخچه خطی را تضمین کرد. بسیاری از توسعه دهندگان، rebase را به merge ترجیح می دهند؛ زیرا مثل این است که بگوییم: "من می خواهم تغییرات خود را بالای آن چه که دیگران انجام داده اند قرار دهم." 

برای pull کردن با rebase--، یک گزینه پیکربندی اختصاصی وجود دارد:

git config --global branch.autosetuprebase alwa

بعد از اجرای این دستور، تمام دستورات git pull به جای git merge، با git rebase تمام می شوند.

مثال هایی از git pull

مثال های زیر نحوه استفاده از git pull را در سناریوهای رایج نشان می دهد: 

  • رفتار پیش فرض git pull:
git pull

 فراخوانی پیش فرض git pull برابر است با git fetch origin HEAD و git merge HEAD که HEAD در آن ها به شاخه فعلی اشاره می کند.

  • git pull بر روی مخزن remote:
git checkout new_feature
git pull <remote repo>

این مثال ابتدا یک checkout انجام داده و به شاخه ی اشاره شده می رود. به دنبال آن دستور git pull، به همراه یک وروردی اجرا می شود. این دستور به طور ضمنی از شاخه ی pull ،new_feature می کند. پس از اتمام دانلود، git merge آغاز می شود.

  • git pull rebase به جای merge:

 مثال زیر نحوه همگام سازی با شاخه ی master مخزن مرکزی با استفاده از rebase را نشان می دهد:

git checkout master
git pull --rebase origin

اجرای این دو دستور، تغییرات محلی شما را به بالای آن چه که دیگران در آن سهیم بوده اند، منتقل می کند.

جمع بندی

دستور git pull، روشی آسان برای همگام سازی مخزن محلی با تغییرات remote است. در این قسمت سعی کردیم این دستور و دیگر گزینه های مربوط به آن را بررسی کنیم. 

در قسمت بعدی از این آموزش با ما همراه باشید تا با چگونگی ایجاد درخواست pull آشنا شوید.

منبع

https://www.atlassian.com/git/tutorials/syncing/git-pull

 

online-support-icon