Release Branch — شاخهای در Git Flow است که از develop برای آمادهسازی یک انتشار خاص ایجاد میشود. در آن نسخه برنامه تثبیت میشود، آخرین باگها رفع و متادیتا بهروزرسانی میشود — بدون افزودن قابلیتهای جدید. به گفته Vincent Driessen, 2010، شاخه release آمادهسازی انتشار را از توسعه جاری جدا میکند که امکان انجام همزمان هر دو فعالیت را فراهم میکند.
نکات کلیدی
release/X.Y.Z بر اساس نسخه برنامه.Release Branch (شاخه انتشار) — شاخه موقتی در Git Flow است که از develop ایجاد میشود وقتی تیم تصمیم میگیرد مجموعه قابلیتهای فعلی برای انتشار آماده است. این شاخه دقیقاً به اندازه مدت زمان آمادهسازی نهایی انتشار وجود دارد — از چند ساعت تا چند روز.
هدف اصلی شاخه release — تثبیت مجموعه مشخصی از قابلیتها برای انتشار بدون توقف توسعه نسخههای بعدی است. در حالی که شاخه release برای انتشار آماده میشود، سایر توسعهدهندگان میتوانند به ادغام شاخههای feature در develop برای انتشار بعدی ادامه دهند.
در شاخه release قابلیتهای جدید ایجاد نمیشود — فقط رفع باگ، بهروزرسانی نسخه برنامه، بومیسازی و مستندات. پس از اتمام همه کارها، شاخه release در main ادغام میشود (به عنوان انتشار نشانهگذاری میشود) و دوباره در develop (تا رفع باگها به نسخههای آینده برسند).
به گفته Atlassian, 2024، شاخههای release برای پروژههای با چرخههای انتشار منظم حیاتی هستند — آنها قابلیت پیشبینی و ثبات فرآیند انتشار را تضمین میکنند.
چرخه حیات شاخه release از ایجاد تا حذف شامل چند مرحله است. درک هر مرحله به تیم کمک میکند اقدامات را هماهنگ کرده و از اشتباهات جلوگیری کند.
release/2.5.0 ایجاد میشود. develop به پذیرش شاخههای feature برای نسخه بعدی ادامه میدهد.v2.5.0.بند ۶ — ادغام معکوس در develop — اغلب فراموش میشود، اما حیاتی است. بدون آن، رفع باگهای انجام شده در release وارد develop نمیشوند و در انتشار بعدی همان اشتباهات ممکن است دوباره ظاهر شوند.
عمر شاخه release به پیچیدگی انتشار و کیفیت کد در develop بستگی دارد. به طور متوسط آمادهسازی برای یک برنامه موبایل متوسط ۲ تا ۵ روز کاری طول میکشد.
در شاخه release مجموعه محدودی از وظایف انجام میشود. هرگونه انحراف از این لیست مدل Git Flow را نقض کرده و برای ثبات انتشار ریسک ایجاد میکند.
| نوع تغییر | مجاز | مثال |
|---|---|---|
| نسخهبندی | بله | بهروزرسانی versionName در build.gradle |
| رفع باگ | بله | رفع crash هنگام راهاندازی |
| بومیسازی | بله | افزودن ترجمه برای صفحههای جدید |
| مستندات | بله | بهروزرسانی CHANGELOG و README |
| قابلیتهای جدید | خیر | افزودن صفحه پروفایل جدید |
| بازآرایی | خیر | بازنویسی لایه شبکه |
| بهروزرسانی کتابخانهها | با احتیاط | فقط نسخههای patch برای رفع باگ |
قانون ممنوعیت قابلیتهای جدید — مهمترین قانون در شاخه release است. اگر قابلیتی به انتشار نرسیده، منتظر چرخه بعدی میماند. تلاش برای وارد کردن قابلیت ناتمام به شاخه release — دلیل اصلی تأخیر در مهلتها و باگهای تولید است.
در شاخه release شماره نسخه برنامه حتماً بهروزرسانی میشود. برای Android این فیلدهای versionCode و versionName در build.gradle هستند، برای iOS — CFBundleShortVersionString در Info.plist.
// build.gradle (app-level) — بهروزرسانی نسخه در شاخه release
android {
defaultConfig {
versionCode 42
versionName "2.5.0"
}
}
// برای iOS — بهروزرسانی Info.plist
// CFBundleShortVersionString = 2.5.0
// CFBundleVersion = 42
توسعهدهندگان تازهکار اغلب شاخههای release و hotfix را اشتباه میگیرند، اگرچه هدف آنها اساساً متفاوت است. اشتباه در انتخاب نوع شاخه میتواند منجر به تأخیر رفع بحرانی یا اختلال در فرآیند انتشار شود.
اگر باگ در فرآیند آمادهسازی انتشار (در شاخه release) کشف شود — این یک رفع باگ معمولی است. اگر باگ در تولید (روی main) کشف شود — این hotfix است و حتی اگر شاخه release وجود داشته باشد، از main ایجاد میشود.
استاندارد یکپارچه نامگذاری شاخههای release پیمایش در مخزن را ساده میکند و به سیستمهای CI/CD اجازه میدهد به طور خودکار تشخیص دهند که شاخه به فرآیند انتشار مربوط است.
release/2.5.0.release/merlin.release/2024-12-01.قالب release/X.Y.Z — ترجیح داده میشود، زیرا شاخه را به وضوح به شماره نسخهای که به انتشار اختصاص مییابد مرتبط میکند. این کار جستجو و پردازش خودکار توسط اسکریپتهای CI/CD را ساده میکند.
ادغام معکوس (merge back) شاخه release در develop — یکی از مهمترین و در عین حال اغلب نادیده گرفته شدهترین عملیاتها است. بدون آن، تمام رفع باگهای انجام شده در release فقط در نسخه انتشار باقی میمانند و وارد چرخه انتشار بعدی نمیشوند.
فرآیند ادغام معکوس پس از آن انجام میشود که شاخه release قبلاً در main ادغام شده است. ابتدا release در develop ادغام میشود، سپس — حذف میشود. این تضمین میکند که develop شامل تمام اصلاحات انجام شده در فرآیند آمادهسازی انتشار است.
پس از ادغام معکوس ممکن است تضادهایی ایجاد شود — به خصوص اگر در develop شاخههای feature جدیدی ظاهر شده باشند که همان فایلها را تغییر دادهاند. توسعهدهنده مسئول انتشار این تضادها را حل کرده و develop را به سرور ارسال میکند.
برخی تیمها برای ادغام معکوس به جای merge از rebase استفاده میکنند تا تاریخچه خطی بماند. با این حال merge برای develop ایمنتر است، زیرا تاریخچه commitهایی را که ممکن است توسط سایر توسعهدهندگان استفاده شده باشند بازنویسی نمیکند.
بیایید چرخه کامل کار با شاخه release را بررسی کنیم: از ایجاد تا حذف پس از انتشار موفق برنامه موبایل نسخه ۲.۵.۰.
# 1. ایجاد شاخه release از develop
git checkout develop
git pull origin develop
git checkout -b release/2.5.0
# 2. بهروزرسانی نسخه و رفع باگ
git add build.gradle
git commit -m "Bump version to 2.5.0"
# 3. رفع باگها (فقط bugfixes)
git add src/fix/
git commit -m "Fix crash on payment screen"
# 4. ارسال شاخه release به سرور
git push origin release/2.5.0
# 5. ادغام release در main
git checkout main
git pull origin main
git merge --no-ff release/2.5.0
git tag -a v2.5.0 -m "Release 2.5.0"
git push origin main --tags
# 6. ادغام معکوس در develop
git checkout develop
git merge --no-ff release/2.5.0
git push origin develop
# 7. حذف شاخه release
git branch -d release/2.5.0
git push origin --delete release/2.5.0
دستورات ۵ و ۶ — ادغام دوگانه — حیاتی هستند. ابتدا main کد انتشار و تگ را دریافت میکند، سپس develop با رفع باگهای release همگامسازی میشود. اگر مرحله ۶ حذف شود، اصلاحات انتشار وارد چرخه توسعه بعدی نمیشوند.
برای پروژههای موبایل با انتشار منظم، فرآیند ایجاد شاخه release و بهروزرسانی نسخه میتواند از طریق اسکریپتهای CI/CD خودکار شود. GitHub Actions امکان ایجاد workflow را فراهم میکند که با کلیک دکمه، شاخه release با بهروزرسانی خودکار نسخه ایجاد کند.
برای پروژههای موبایل با انتشار منظم، فرآیند ایجاد شاخه release و بهروزرسانی نسخه میتواند از طریق اسکریپتهای CI/CD خودکار شود. GitHub Actions امکان ایجاد workflow را فراهم میکند که با کلیک دکمه، شاخه release با بهروزرسانی خودکار نسخه ایجاد کند.
# GitHub Actions — خودکارسازی ایجاد شاخه release
name: Create Release Branch
on:
workflow_dispatch:
inputs:
version:
description: 'Release version (e.g. 2.5.0)'
required: true
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Create release branch
run: |
git checkout develop
git checkout -b release/${{ inputs.version }}
git push origin release/${{ inputs.version }}
سوالات متداول
تنها یک شاخه release همزمان، اگر از Git Flow پیروی کنید. وجود دو شاخه release فعال به این معنی است که تیم سعی دارد دو انتشار را همزمان انجام دهد — این اصل انتشارهای متوالی را نقض کرده و باعث سردرگمی با نسخهها میشود.
commitهای قابلیت ناتمام را از شاخه release از طریق git revert حذف کرده و قابلیت را به انتشار بعدی موکول کنید. هرگز عملکرد ناتمام را به تولید منتشر نکنید — بدهی فنی و باگهای بالقوه ارزش عجله را ندارند.
برای انتشارهای ساده با یک رفع، میتوان شاخه release را نادیده گرفته و ادغام مستقیم از develop به main انجام داد. اما برای انتشارهای استاندارد، شاخه release الزامی است — نسخه را تثبیت میکند، آمادهسازی را جدا کرده و ادغام دوگانه رفع باگها را تضمین میکند.
از git revert در main برای ایجاد commit جدیدی استفاده کنید که تمام تغییرات انتشار را لغو میکند. سپس تگ انتشار را با دستور git push origin --delete vX.Y.Z حذف کنید. پس از رفع مشکلات، شاخه release جدیدی با شماره patch افزایش یافته ایجاد کنید.
Release candidate (RC) — مصنوع کامپایل است که تست نهایی را طی میکند. Release branch — شاخه Git است که release candidate از آن ایجاد میشود. یک شاخه release میتواند چندین کامپایل RC (RC1، RC2 و غیره) با رفع باگها ایجاد کند.
خلاصه
release/X.Y.Z با شماره نسخه بر اساس SemVer.ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید