در این بخش به بررسی دستور 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