در قسمت قبل، دستور 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