این مقاله یک بررسی عمیق از دستور git branch
و یک بحث کلی در مورد مدل شاخه گذاری است. branching یک ویژگی موجود در اکثر سیستم های کنترل نسخه ی مدرن است. branching در سایر VCS ها می تواند عملیاتی گران قیمت، هم از نظر زمان و هم از نظر فضای ذخیره سازی باشد. در گیت، شاخه ها بخشی از روند توسعه روزمره شما هستند. شاخه های گیت به طور موثر یک اشاره گر به یک عکس از تغییرات شما هستند. هنگامی که شما می خواهید یک ویژگی جدید اضافه کنید یا یک باگ را رفع کنید بدون توجه به اینکه چقدر بزرگ یا چقدر کوچک است، شاخه جدیدی را برای انباشت تغییرات خود تنظیم می کنید. این باعث می شود که یک کد ناپایدار سخت تر به کد اصلی ادغام شود، و این به شما فرصتی می دهد تا قبل از ادغام کردن آن به شاخه اصلی، تاریخچه ی قابلیت های خود را تمیز کنید.
نمودار بالا یک مخزن را با دو خط توسعه جداگانه تجسم می کند، یکی برای یک ویژگی کوچک، و یکی برای یک ویژگی طولانی تر. با توسعه آنها در شاخه های جدا نمی توان بر روی هر دوی آنها به طور موازی کار کرد، اما همچنان شاخه ی اصلی master را از کد مشکوک حفظ می کند. پیاده سازی شاخه های گیت بسیار سبک تر از سایر سیستم های کنترل نسخه است. به جای کپی کردن فایل ها از پوشه ای به پوشه ای دیگر، گیت یک شاخه را به عنوان مرجع به یک commit ذخیره می کند. به این معنا که یک شاخه نشان دهنده نوک یک سری از commit است (شاخه یک ظرف برای commit نیست). تاریخچه یک شاخه، از طریق روابط بین commit ها تشکیل شده است.
همانطور که خواندید، به یاد داشته باشید که شاخه های گیت مانند شاخه های SVN نیستند. در حالی که شاخه های SVN فقط برای ضبط تلاش های گاه به گاه در مقیاس بزرگ استفاده می شود، شاخه های گیت، بخشی جدا ناپذیر از گردش کار روزمره شما هستند. ادامه ی این مقاله بر روی معماری داخلی شاخه گیت تمرکز می کند.
git branch چگونه کار می کند
یک شاخه نشان دهنده یک خط توسعه مستقل است. شاخه ها به عنوان انتزاعی برای فرآیندهای ویرایش، stage و commit هستند. شما می توانید به آنها به عنوان یک راه برای درخواست یک مسیر جاری جدید، ناحیه ی استقرار (staging area) و تاریخچه ی پروژه فکر کنید. Commit های جدید در تاریخچه شاخه ی فعلی ثبت می شوند، که منجر به یک fork در تاریخچه ی پروژه می شود.
دستور git branch
به شما امکان می دهد که شاخه ها را ایجاد کنید، لیست آن ها را مشاهده کنید، نام آن ها را تغییر دهید و شاخه ها را حذف کنید. این دستور اجازه نمی دهد که شما بین شاخه ها جابجا شوید یا تاریخچه fork شده ی شاخه ای را با شاخه ای دیگر ترکیب کنید. به این دلیل، git branch
به شدت با git checkout
و git merge
استفاده می شود.
ورودی های معمول دستور git branch
git branch
این دستور لیست تمام شاخه های مخزن شما را نمایش می دهد و معادل با دستور git branch --list
است.
git branch <branch>
این دستور یک شاخه جدید به نام <branch> ایجاد می کند و شما را به شاخه جدید منتقل نمی کند.
git branch -d <branch>
این دستور شاخه ی مشخص شده را حذف می کند. این عملیات ایمنی است زیرا که اگر شما تغییرات merge نشده داشته باشید، گیت مانع از حذف شاخه ی شما می شود.
git branch -D <branch>
شاخه مشخص شده را حذف می کند، حتی اگر تغییرات merge نشده داشته باشد.
git branch -m <branch>
شاخه فعلی را به <branch> تغییر نام می دهد.
git branch -a
لیست تمام شاخه های remote را نمایش می دهد.
چگونه یک شاخه ایجاد کنیم
مهم است بدانیم که شاخه ها فقط اشاره گر به commit ها هستند. هنگامی که یک شاخه ایجاد می شود، تمام کاری که گیت باید انجام دهد این است که یک اشاره گر جدید ایجاد کند، این کار مخزن را به هیچ وجه تغییر نمی دهد. فرض کنید شما با یک مخزن که به صورت زیر به نظر می رسد شروع به کار می کنید:
سپس، شما یک شاخه را با استفاده از دستور زیر ایجاد می کنید:
git branch sokanacademy-experiment
تاریخچه مخزن بدون تغییر باقی می ماند. همه این کار یک اشاره گر جدید به commit فعلی است:
توجه داشته باشید که این تنها شاخه ی جدید را ایجاد می کند. برای شروع اضافه کردن commit به آن، شما باید آن را با git checkout
انتخاب کنید و سپس از دستور های git add
و git commit
استفاده کنید.
ساختن یک شاخه ی remote
همه ی مثال های زده شده تا کنون در مورد عملیات بر روی شاخه های محلی بوده اند. دستور git branch
بر روی شاخه های remote هم کار می کند. به منظور کار بر روی شاخه های remote، ابتدا باید یک نسخه از مخزن remote پیکربندی شود و به پیکربندی مخزن محلی اضافه شود.
$ git remote add new-remote-repo https://bitbucket.com/user/repo.git
# Add remote repo to local repo config
$ git push <new-remote-repo> crazy-experiment~
# pushes the crazy-experiment branch to new-remote-repo
این دستور یک کپی از شاخه ی محلی sokanacademy-experiment را به مخزن push ، remote می کند.
حذف شاخه
هنگامی که کار خود را بر روی یک شاخه انجام دادید و آن را به کد اصلی merge کردید، شما می توانید شاخه را بدون از دست دادن هیچ سابقه ای حذف کنید:
git branch -d sokanacademy-experiment
با این حال، اگر شاخه merge نشده باشد، دستور بالا یک پیام خطا را منتشر خواهد کرد:
error: The branch 'sokanacademy-experiment' is not fully merged. If you are sure you want to delete it, run 'git branch -D 'sokanacademy-experiment'.
این اتفاق شما را از عدم دسترسی به خط هایی که توسعه داده اید حفظ می کند. اگر واقعا می خواهید شاخه را حذف کنید می توانید از گزینه ی D- استفاده کنید:
git branch -D sokanacademy-experiment
دستور بالا شاخه را بدون توجه به وضعیت آن و بدون هشدارها حذف می کند.
دستورات قبلی یک کپی محلی از یک شاخه را حذف خواهند کرد. شاخه ممکن است در مخزن remote وجود داشته باشد. برای حذف یک شاخه remote، دستور زیر را اجرا کنید:
git push origin --delete sokanacademy-experiment
یا
git push origin :sokanacademy-experiment
این دستورات یک سیگنال حذف را در مخزن ریموت بارگذاری می کند که منجر به حذف شاخه ی sokanacademy-experiment از مخزن remote شود.
جمع بندی
در این مقاله ما در مورد رفتار شاخه ای گیت یا Git branching و دستور git branch
صحبت کردیم. دستورهای git branch
توابع اولیه ای برای ایجاد کردن، لیست کردن، تغییر نام و حذف شاخه ها هستند. برای کارایی بیشتر این دستور روی شاخه های بدست آمده از ترکیب آن با دستورات دیگر مانند git checkout
استفاده می شود. در قسمت بعدی این بخش در مورد دستور git checkout
صحبت خواهیم کرد.
در مقایسه با سایر سیستم های کنترل نسخه، کار با شاخه ها در گیت ساده تر و معمول تر است. این انعطاف پذیری گیت، شخصی سازی قدرتمندی را در گردش کاری گیت قادر می سازد. برای دریافت اطلاعات بیشتر در مورد گردش کار های گیت می توانید مقاله های زیر در سکان آکادمی را مطالعه کنید:
- 4 گردشکار در گیت
- معرفی گردشکار Feature Branch در گیت
- همه چیز درباره ی گردش کار Gitflow با مثال
- همه چیز درباره ی گردش کار Forking در Git