Sokan Academy

این مقاله یک بررسی عمیق از دستور 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 صحبت خواهیم کرد.

در مقایسه با سایر سیستم های کنترل نسخه، کار با شاخه ها در گیت ساده تر و معمول تر است. این انعطاف پذیری گیت، شخصی سازی قدرتمندی را در گردش کاری گیت قادر می سازد. برای دریافت اطلاعات بیشتر در مورد گردش کار های گیت می توانید مقاله های زیر در سکان آکادمی را مطالعه کنید:

  1. 4 گردش‌کار در گیت
  2. معرفی گردش‌کار Feature Branch در گیت
  3. همه چیز درباره ی گردش کار Gitflow با مثال
  4. همه چیز درباره ی گردش کار Forking در Git

منبع

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

git branchgitکنترل نسخهورژن کنترلگیت

sokan-academy-footer-logo
کلیه حقوق مادی و معنوی این وب‌سایت متعلق به سکان آکادمی می باشد.