Chapters ▾ 2nd Edition

3.3 انشعاب‌گیری در گیت (Git Branching) - مدیریت شاخه‌ها (Branch Management)

مدیریت شاخه‌ها (Branch Management)

حال که شاخه‌هایی را ایجاد، ادغام و حذف کرده‌اید، بیایید نگاهی به ابزارهای مدیریت شاخه بیندازیم که هنگام استفاده مداوم از شاخه‌ها به کارتان خواهند آمد.

دستور git branch فقط برای ایجاد و حذف شاخه‌ها نیست. اگر آن را بدون آرگومان اجرا کنید، فهرستی ساده از شاخه‌های فعلی‌تان را خواهید دید:

$ git branch
  iss53
* master
  testing

توجه کنید به علامت * که جلوی شاخه master قرار دارد؛ این علامت شاخه‌ای را نشان می‌دهد که در حال حاضر روی آن قرار دارید (یعنی شاخه‌ای که HEAD به آن اشاره می‌کند). این یعنی اگر در این لحظه کامیت کنید، شاخه master با کار جدید شما به جلو حرکت خواهد کرد. برای دیدن آخرین کامیت هر شاخه، می‌توانید دستور git branch -v را اجرا کنید:

$ git branch -v
  iss53   93b412c Fix javascript issue
* master  7a98805 Merge branch 'iss53'
  testing 782fd34 Add scott to the author list in the readme

گزینه‌های مفید --merged و --no-merged می‌توانند این فهرست را فیلتر کنند تا فقط شاخه‌هایی را نشان دهند که شما آن‌ها را به شاخه فعلی ادغام کرده‌اید یا هنوز نکرده‌اید. برای دیدن شاخه‌هایی که قبلاً به شاخه فعلی ادغام شده‌اند، می‌توانید دستور زیر را اجرا کنید:

$ git branch --merged
  iss53
* master

از آنجا که قبلاً شاخه iss53 را ادغام کرده‌اید، آن را در این فهرست خواهید دید. شاخه‌هایی که در این فهرست علامت * جلوی آن‌ها نیست عموماً قابل حذف با دستور git branch -d هستند؛ چون کار آن‌ها قبلاً در شاخه دیگری ادغام شده است و چیزی از دست نمی‌دهید.

برای دیدن همه شاخه‌هایی که کارهایشان هنوز ادغام نشده، می‌توانید دستور زیر را اجرا کنید:

$ git branch --no-merged
  testing

این شاخه دیگر شما را نشان می‌دهد. چون شامل کارهایی است که هنوز ادغام نشده، تلاش برای حذف آن با git branch -d با شکست مواجه خواهد شد:

$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.

اگر واقعاً می‌خواهید شاخه را حذف کنید و آن کارها را از دست بدهید، می‌توانید با گزینه -D این کار را اجباراً انجام دهید، همان‌طور که پیام راهنما اشاره می‌کند.

نکته

گزینه‌های ذکر شده، --merged و --no-merged، اگر آرگومان مشخصی مثل کامیت یا نام شاخه دریافت نکنند، به‌ترتیب شاخه‌هایی که به شاخه فعلی شما ادغام شده یا نشده‌اند را نشان می‌دهند.

شما همیشه می‌توانید آرگومان اضافی بدهید تا وضعیت ادغام را نسبت به شاخه دیگری بدون اینکه آن شاخه را چک‌اوت کنید، بپرسید؛ مثلاً، چه شاخه‌هایی به شاخه master ادغام نشده‌اند؟

$ git checkout testing
$ git branch --no-merged master
  topicA
  featureB

تغییر نام شاخه (Changing a branch name)

گوشزد

شاخه‌هایی که هنوز توسط همکاران دیگر استفاده می‌شوند را بازنام نکنید. شاخه‌ای مثل master/main/mainline را بدون خواندن بخش تغییر نام شاخه اصلی (Changing the master branch name) بازنام نکنید.

فرض کنید شاخه‌ای دارید به نام bad-branch-name و می‌خواهید آن را به corrected-branch-name تغییر دهید، در حالی که تمام تاریخچه حفظ شود. همچنین می‌خواهید نام شاخه را روی ریموت (GitHub، GitLab، یا سرور دیگر) تغییر دهید. چگونه این کار را انجام دهید؟

برای تغییر نام محلی یک برنچ از دستور git branch --move استفاده میکنیم:

شاخه را به صورت محلی با دستور `git branch --move` بازنام کنید:

این کار bad-branch-name شما را با corrected-branch-name جایگزین می‌کند، اما این تغییر فعلاً فقط محلی است. برای اینکه دیگران شاخه‌ی اصلاح‌شده را روی ریموت ببینند، آن را پوش کنید:

$ git push --set-upstream origin corrected-branch-name

حالا کمی وضعیت فعلی را بررسی می‌کنیم:

$ git branch --all
* corrected-branch-name
  main
  remotes/origin/bad-branch-name
  remotes/origin/corrected-branch-name
  remotes/origin/main

توجه کنید که شما روی شاخه corrected-branch-name هستید و این شاخه روی ریموت موجود است. با این حال، شاخه با نام اشتباه هنوز هم آنجا هست اما می‌توانید آن را با اجرای دستور زیر حذف کنید:

$ git push origin --delete bad-branch-name

حالا نام شاخه اشتباه کاملاً با نام اصلاح‌شده جایگزین شده است.

تغییر نام شاخه اصلی (Changing the master branch name)

هشدار

تغییر نام شاخه‌ای مثل master/main/mainline/default باعث شکستن یکپارچه‌سازی‌ها، سرویس‌ها، ابزارهای کمکی و اسکریپت‌های ساخت/انتشار می‌شود که مخزن شما استفاده می‌کند. قبل از این کار، حتماً با همکارانتان مشورت کنید. همچنین، مطمئن شوید که جستجوی کاملی در مخزن خود انجام داده و همه ارجاعات به نام شاخه قدیمی را در کد و اسکریپت‌ها به‌روزرسانی کرده‌اید.

شاخه محلی master را به main با دستور زیر تغییر نام دهید:

$ git branch --move master main

حالا شاخه محلی master وجود ندارد چون به شاخه main تغییر نام یافته است.

برای اینکه دیگران شاخه جدید main را ببینند، باید آن را به ریموت پوش کنید. این کار شاخه بازنام‌شده را روی ریموت در دسترس قرار می‌دهد.

$ git push --set-upstream origin main

حالا وضعیت زیر را داریم:

$ git branch --all
* main
  remotes/origin/HEAD -> origin/master
  remotes/origin/main
  remotes/origin/master

شاخه محلی master حذف شده و با شاخه main جایگزین شده است. شاخه main روی ریموت موجود است. با این حال، شاخه قدیمی master هنوز روی ریموت هست. همکاران دیگر تا زمانی که تغییرات بیشتری انجام ندهید، همچنان از شاخه master به عنوان پایه کارشان استفاده خواهند کرد.

حالا چند وظیفه دیگر برای تکمیل انتقال دارید:

  • هر پروژه‌ای که به این مخزن وابسته است، باید کد و/یا پیکربندی خود را به‌روزرسانی کند.

  • فایل‌های پیکربندی تست رانرها را به‌روزرسانی کنید.

  • اسکریپت‌های ساخت و انتشار را تنظیم کنید.

  • تنظیمات میزبان مخزن خود را برای مواردی مانند شاخه پیش‌فرض مخزن، قوانین ادغام و دیگر موارد مربوط به نام شاخه‌ها به‌روزرسانی کنید.

  • ارجاعات به شاخه قدیمی در مستندات را اصلاح کنید.

  • درخواست‌های کشش (pull requests) که هدفشان شاخه قدیمی است را ببندید یا ادغام کنید.

بعد از انجام تمام این کارها و وقتی مطمئن شدید شاخه main مانند شاخه master عمل می‌کند، می‌توانید شاخه master را حذف کنید:

$ git push origin --delete master
scroll-to-top