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

git fetch

مقدمه

هنگامی که می خواهید commit ها و فایل ها را از یک مخزن remote در مخزن محلی خود دانلود کنید، دستور های git pull و git fetch برای انجام این کار در دسترس هستند. شما می توانید در نظر بگیرید git fetch نسخه ی امن این دو دوستور است. با این دستور شما می توانید محتوای remote را دانلود کنید اما وضعیت کاری محلی خود را به روز نکنید تا هیچ تاثیری بر کار توسعه محلی شما نداشته باشد. git pull جایگزینی تهاجمی تر است؛ این دستور محتوای remote را برای شاخه ی محلی در حال استفاده دانلود می کند و بلافاصله git merge را برای ایجاد یک merge commit برای محتوای جدیدِ remote اجرا می کند. اگر تغییرات در حال انجامی دارید این باعث به وجود آمدن conflict خواهد شد. 

git fetch چگونه با شاخه های remote کار می کند

برای درک بهتر اینکه  git fetchچگونه کار می کند بیاید دریابیم که گیت چگونه commit ها را سازماندهی و ذخیره می کند. در پشت صحنه، گیت commit های محلی و remote را در پوشه ی git/objects./. ذخیره می کند. گیت، commit های شاخه ی محلی و remote را جداگانه نگهداری می کند. مرجع برای شاخه های محلی در مسیر/git/refs/heads./. ذخیره می شود. اجرای دستور git branch یک لیست از مرجع های شاخه محلی تولید می کند. در زیر مثالی از دستور git branch آورده شده است:

git branch
main
feature1
debug2

بررسی محتویات دایرکتوری git/refs/heads./. خروجی مشابه را نشان می دهد.

ls ./.git/refs/heads
main
feature1
debug2

شاخه های remote هم درست مانند شاخه های محلی هستند. به جز نقشه ی commit هایی که از مخزن دیگران وجود دارد. شاخه های remote پیشوند remote دارند که شما آن ها را با شاخه های محلی اشتباه نگیرید. مانند شاخه های محلی، گیت برای شاخه های remote هم مرجع دارد. مرجع شاخه های remote در مسیر /git/refs/remotes./. قرار دارند. مثال بعدی شاخه هایی که ممکن است بعد از دریافت کردن یک مرجع remote با نام remote-repo ببینیم را نشان می دهد.

git branch -r
# origin/main
# origin/feature1
# origin/debug2
# remote-repo/main
# remote-repo/other-feature

این خروجی شاخه های محلی را که قبلا مورد بررسی قرار دادیم را نیز نمایش می دهد، اما اکنون آنها را با پیشوند origin نشان می دهد. علاوه بر این، ما اکنون شاخه های remote با پیشوند  Remote-Repo را می بینیم. شما می توانید یک شاخه remote را درست مانند یک شاخه ی محلی بررسی کنید، اما این باعث می شود شما در یک حالت HEAD جدا قرار بگیرید(درست مثل چک کردن یک commit قدیمی). شما می توانید آنها را به عنوان شاخه های فقط خواندنی در نظر بگیرید. برای مشاهده شاخه های remote خود، گزینه ی r- را به دستور git branch اضافه کنید.

شما می توانید شاخه های remote را با دستورهای git checkout و git log بررسی کنید. اگر تغییرات یک شاخه remote را تایید کنید، می توانید آن را به یک شاخه محلی با استفاده از دستور git merge، ادغام کنید. بنابراین، بر خلاف SVN، هماهنگ سازی مخزن محلی با یک مخزن remote، در واقع یک فرایند دو مرحله ای است:  دریافت کردن و ادغام کردن. دستور git pull یک میانبر مناسب برای این فرآیند است.

دستورات و گزینه های ورودی Git Fetch

git fetch <remote>

تمام شاخه های مخزن را دریافت می کند. این همچنین تمام commit ها و فایل های مورد نیاز را از مخزن دیگر دانلود می کند.

git fetch <remote> <branch>

همانند دستور قبل عمل می کند، اما تنها شاخه مشخص شده را دریافت می کند.

git fetch --all

یک حرکت قدرتمند است که تمام remote های ثبت شده و شاخه های آنها را دریافت می کند.

git fetch --dry--run

گزینه dry--run-- یک نسخه آزمایشی را اجرا خواهد کرد. این دستور اقداماتی که در طول این دریافت رخ خواهد داد را به عنوان خروجی می دهد ولی آن ها را اعمال نمی کند.

مثال هایی برای Git Fetch

  • دریافت یک شاخه ی remote

مثال زیر نشان می دهد که چگونه یک شاخه remote را دریافت کنید و حالت کار محلی خود را با محتویات remote به روز کنید. در این مثال، فرض می کنیم که یک مخزن اصلی مرکزی وجود دارد و از آن یک مخزن محلی با استفاده از دستور git clone، کپی شده است. اجازه دهید همچنین یک مخزن از راه دور اضافی به نام coworkers_repo که شامل یک شاخه با نام feature _branch است را فرض کنیم که آن را پیکربندی و دریافت می کنیم. با این فرضیه ها ما مثال را ادامه می دهیم.

ابتدا ما باید با استفاده از دستور git remote مخزن remote را پیکربندی کنیم.

git remote add coworkers_repo https://github.com/sokanacademy/coworkers_repo.git

در اینجا با استفاده از آدرس مخزن یک مرجع برای مخزن coworkers_repo ایجاد کرده ایم. حال با استفاده از دستور git fetch محتویات مخزن remote را دریافت می کنیم.

git fetch coworkers_repo coworkers/feature_branch
fetching coworkers/feature_branch
************************************************************
git checkout coworkers/feature_branch
Note: checking out coworkers/feature_branch'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

git checkout -b <new-branch-name>

خروجی از عملیات checkout نشان می دهد که ما در حالت HEAD جداگانه هستیم. در حالت HEAD جداگانه بودن به این معنی است که مرجع HEAD به جایی اشاره دارد که در تاریخچه ی محلی ما وجود ندارد. HEAD به مرجع coworkers/feature_branch اشاره دارد، ما می توانیم یک شاخه ی محلی جدید از آن را ایجاد کنیم.  خروجی در حالت HEAD جداگانه بودن به ما نشان می دهد که چگونه از دستور git checkout استفاده کنیم:

git checkout -b local_feature_branch

در اینجا ما یک شاخه محلی جدید به نام local_feature_branch ایجاد کرده ایم. این کار باعث می شود HEAD به آخرین محتوای بروز شده اشاره کند و ما می توانیم از این نقطه ادامه دهیم.

  • همگام سازی منبع با git fetch

مثال زیر در گردش کار معمولی برای هماهنگ سازی مخزن محلی خود با شاخه main مخزن مرکزی انجام می شود.

git fetch origin

          خروجی این دستور شاخه هایی را که دانلود شده اند نمایش می دهد:

a1e8fb5..45e66a4 main -> origin/main
a1e8fb5..9e8ab1c develop -> origin/develop
* [new branch] some-feature -> origin/some-feature

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

برای دیدن commit هایی که به  main اضافه شده است، می توانید دستور git log را با استفاده از فیلتر origin/main اجرا کنید:

git log --oneline main..origin/main

برای تایید تغییرات و merge آنها به شاخه main محلی خود از دستورات زیر استفاده کنید:

git checkout main
git log origin/main

سپس ما می توانیم از دستورgit merge origin/main استفاده کنیم:

git merge origin/main

شاخه های origin/main  و mian در حال حاضر به یک commit اشاره می کنند و شما با تغییرات بالادست هماهنگ هستید.

online-support-icon