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

Git Checkout

در این بخش به بررسی دستور git checkout خواهیم پرداخت. در اصطلاحات checkout" ،Git" عمل جا به جایی بین نسخه های مختلف موجودیت هدف است. دستور git checkout بر روی سه موجودیت متمایز عمل می کند: فایل ها، commit ها و شاخه ها. علاوه بر تعریف "checkout"، معمولا عبارت "checking out" برای استفاده از دستور git checkout نیز به کار برده می شود. در مبحث Undoing Changes، دیدیم که چگونه می توان از git checkout برای مشاهده commit های قدیمی استفاده کرد. تمرکز بیشتر این مستند، عمل checkout در شاخه ها خواهد بود. 

Checkout شاخه ها، مانند checkout کردن commit ها و فایل های قدیمی است زیرا working directory به روز می شود تا با branch/revision مطابقت داشته باشد. با این حال، تغییرهای جدید در تاریخچه پروژه ذخیره می شوند (یعنی این یک عمل فقط خواندنی نیست.). 

Checking out شاخه ها 

دستور git checkout به شما امکان می دهد بین شاخه های ایجاد شده توسط git branch حرکت کنید. Checking out یک شاخه، فایل ها را در working directory به روز می کند تا با نسخه ذخیره شده در آن شاخه مطابقت داشته باشد و به Git می گوید که تمام commit های جدید را در آن شاخه ثبت کند. فکر کنید که این راهی است برای انتخاب خطی از توسعه که شما روی آن کار می کنید. 

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

ممکن است گاهی اوقات دستور git checkout با git clone اشتباه گرفته شود. تفاوت بین این دو دستور این است که clone برای واکشی کد از یک مخزن از راه دور کار می کند، در عوض checkout برای جا به جایی بین نسخه های کد موجود در سیستم محلی کار می کند.  

کاربرد: شاخه های موجود 

با فرض اینکه مخزنی که در آن کار می کنید شامل شاخه های قبلی (pre-existing branch) باشد، می توانید با استفاده از git checkout بین این شاخه ها جا به جا شوید. برای این که بفهمید چه شاخه هایی موجود است و نام شاخه فعلی چیست، git branch را اجرا کنید.

$> git branch 
main 
another_branch 
feature_inprogress_branch 
$> git checkout feature_inprogress_branch

مثال بالا نشان می دهد که چگونه می توان با اجرای دستور git branch لیستی از شاخه های موجود را مشاهده کرد و به یک شاخه مشخص (در این مثال feature_inprogress_branch) رفت. 

شاخه های جدید  

Git checkout به صورت دستی (hand-in-hand) با git branch کار می کند. از دستور git branch می توان برای ایجاد شاخه ی جدید استفاده کرد. وقتی می خواهید ویژگی جدیدی را شروع کنید، با استفاده از git branch new_branch شاخه ی جدیدی را ایجاد می کنید. پس از ایجاد می توانید از git checkout new_branch برای رفتن به آن شاخه استفاده کنید. همچنین، دستور git checkout پارامتر b- را می پذیرد که به عنوان روشی راحت عمل می کند که شاخه ی جدید را ایجاد و سریع به آن سوئیچ می کند. با جا به جایی بین آن ها با git checkout می توانید روی چندین ویژگی در یک مخزن واحد، کار کنید.

git checkout -b <new-branch>

مثال فوق هم زمان، ایجاد و check out می کند. گزینه b- یک پرچم (flag) راحتی است که به Git می گوید قبل از اجرای git branch ،git checkout را اجرا کند.

git checkout -b <new-branch> <existing-branch>

به طور پیش فرض git checkout -b شاخه ی جدید را در HEAD فعلی قرار می دهد. یک پارامتر شاخه ی اضافی اختیاری می تواند به git checkout منتقل شود. در مثال فوق، تصویب شده است که existing-branch ،new-branch (شاخه موجود) را به جای HEAD فعلی پایه گذاری می کند. 

تغییر شاخه ها 

تغییر شاخه ها عملی ساده است. با اجرای دستور زیر، HEAD به نقطه انتهایی اشاره می کند.

git checkout <branchname>

Git، تاریخچه عملیات checkout را در reflog مجدد پیگیری می کند. برای مشاهده تاریخچه می توانید git reflog را اجرا کنید.

Git Checkout یک شاخه ی از راه دور 

هنگام همکاری با یک تیم، استفاده از مخزن های از راه دور؛ عادی است. این مخزن ها ممکن است میزبانی و به اشتراک گذاشته شوند یا کپی محلی همکار دیگر باشند. هر مخزن از راه دور، مجموعه شاخه های خاص خود را خواهد داشت. برای checkout شاخه ی از راه دور، ابتدا باید محتوای شاخه را واکشی (fetch) کنید. 

git fetch --all

در نسخه های مدرن Git، می توانید شاخه ی از راه دور را مانند یک شاخه ی محلی checkout کنید. 

git checkout <remotebranch>

نسخه های قدیمی Git نیاز به ایجاد یک شاخه ی جدید بر اساس شاخه ی از راه دور دارند.

git checkout -b <remotebranch> origin/<remotebranch>

علاوه بر این می توانید یک شاخه محلی جدید را checkout کنید و آن را به آخرین commit شاخه ی از راه دور، تنظیم مجدد (reset) کنید.

git checkout -b <branchname>
git reset --hard origin/<branchname>

Detached Head (Head های جدا شده)

اکنون که سه کاربرد اصلی git checkout را در شاخه ها مشاهده کردیم، بحث در مورد حالت "detached HEAD" بسیار مهم است. به یاد داشته باشید که HEAD روش Git برای اشاره به snapshot فعلی است. دستور git checkout به سادگی HEAD را به روز می کند تا به شاخه ی مشخص شده یا commit شده اشاره کند. هنگامی که شاخه را نشان می دهد، Git چیزی نمی گوید، اما وقتی یک commit را بررسی می کنید، به حالت "detached HEAD" در می آید.

این هشداری است که به شما می گوید هر کاری که انجام می دهید از بقیه توسعه پروژه شما "detached" شده است. اگر بخواهید در حالی که در حالت HEAD detached شده هستید، یک ویژگی را توسعه دهید، نمی توانید به شاخه ی دیگر برگردید. وقتی که مجبور هستید به شاخه ی دیگری checkout کنید (برای مثال، ویژگی خود را در آن merge کنید) راهی برای ارجاع دادن به ویژگی شما وجود ندارد:

نکته این است که توسعه شما همیشه باید در یک شاخه انجام شود (نه هرگز در یک HEAD detached). این باعث می شود که شما همیشه به commit های جدید خود اشاره داشته باشید. با این حال، اگر فقط به یک commit قدیمی نگاه می کنید، مهم نیست که در یک HEAD detached شده باشید یا نه. 

خلاصه 

این بخش از مستند Git، بر استفاده از دستور git checkout هنگام تغییر شاخه ها متمرکز بود. به طور خلاصه، git checkout، هنگامی که بر روی شاخه ها استفاده می شود، منبع HEAD هدف را تغییر می دهد. می توان از آن برای ایجاد شاخه، تغییر شاخه و checkout شاخه ی از راه دور استفاده کرد. دستور git checkout ابزاری اساسی برای عملکرد استاندارد Git است. یک نمونه برای git merge  است. دستورات git checkout و git merge ابزار مهمی برای فعال کردن گردش کار git هستند.

منبع: 

https://www.atlassian.com/git/tutorials/using-branches/git-checkout 

online-support-icon