
یک شاخه اصلی (main) منبع حقیقت است.
تغییرات کوچک و پرتکرار به main میرسند.
برنچها اگر وجود دارند خیلی کوتاهعمر هستند (ساعتها تا حداکثر ۱–۲ روز).
«کار ناتمام» را با Feature Flag / Toggle و Backward Compatibility هندل میکنیم، نه با برنچ طولانی.
کیفیت با گیتهای اتومات + کدریویو سبک حفظ میشود، نه با فازهای طولانی فریز.
main (یا trunk): تنها شاخه دائمی
short-lived branches (اختیاری اما رایج):
feature/<ticket> یا fix/<ticket> با عمر کوتاه
release branch (فقط در صورت نیاز، موقتی):
وقتی production از یک commit قدیمیتر است یا نیاز به patch سریع روی نسخه منتشرشده دارید.
فیچر برنچ طولانی نداریم.
اگر کاری بزرگ است: به چند PR کوچک + feature flag بشکن.
چه چیزهایی اینجا هندل میشود؟
شکستن فیچر بزرگ به “vertical slices” (قابل merge شدن)
تعریف flagها
تعریف migration plan دیتابیس (اگر هست)
تعریف معیار Done و تستها
خروجی استاندارد:
هر slice یک Ticket + یک PR کوچک
استاندارد رایج:
تیمهای کوچک: مستقیم روی main با commits کوچک + CI
تیمهای متوسط/بزرگ: برنچ کوتاه + PR
فیچرهای نیمهکاره چطور merge میشن؟
با Feature Flag:
flag پیشفرض OFF
مسیرهای جدید پشت flag
UI/endpoint جدید hidden یا limited
بهترین استاندارد در trunk-based اینه که «تستها نزدیک به کد» و اتومات باشند:
unit tests
lint/format
type check (اگر دارید)
اجرای quick smoke
گیتهای لازم (Minimum Standard):
Build ✅
Unit tests ✅
Lint/Static analysis ✅
Security basic: dependency scan / SAST سبک ✅
حداقل یک لایه integration/contract سریع ✅
Coverage gate (اختیاری ولی مفید) ✅
تستهای سنگینتر (integration گستردهتر)
e2e/smoke روی محیط staging
performance sanity (اگر مهمه)
نکته: e2e را کم اما مؤثر نگه دارید (شکننده نشه).
کدریویو هست، ولی سبک، سریع، با SLA.
قواعد پیشنهادی:
PR کوچک (ترجیحاً < ۲۰۰–۴۰۰ خط تغییر)
۱ Reviewer کافی (برای تغییرات معمول)
۲ Reviewer برای تغییرات حساس (Security/Payments/Core)
Reviewer روی اینها تمرکز کند:
correctness & edge cases
backward compatibility
تست کافی
خوانایی/maintainability
migration safety
flag درست
Anti-pattern:
PR بزرگ و چندروزه → عملاً میشه mini-waterfall
merge فقط با CI green
حداقل ۱ approval
no direct push (برای اکثر تیمها)
squash merge یا rebase merge (سلیقهای، ولی تاریخچه تمیز مهمه)
commit message با ticket/semantic (مفید برای versioning)
build artifact (docker image / package)
ثبت artifact با یک شناسه:
git_sha
build number
deploy خودکار به staging
استاندارد:
smoke + regression کوتاه (روی flows حیاتی)
exploratory روی تغییرات جدید
اگر feature پشت flag است:
flag را در staging روشن میکنند یا برای user گروهی باز میکنند
دو مدل استاندارد:
هر merge با گیتها → مستقیم تا prod (با canary/flags)
هر merge آماده انتشار است
انتشار با “promote” کردن همان artifact انجام میشود
معمولاً روزانه/هفتگی “release train”
برای اینکه بگیم کد دقیقا چه نسخهای روی prod رفته.
استاندارد معمول:
روی همان commit که deploy میشود:
vMAJOR.MINOR.PATCH (SemVer)
یا release-2026.02.23-1 (Calendar Versioning)
قانون مهم:
تگ روی main است (یا روی release branch موقت)
artifact باید قابل trace باشد:
tag -> commit -> build -> deploy
اتومات از commit messages/PR titles
یا از labels (feature/fix/breaking)
PR کوتاه → merge main → deploy
ایجاد release/<version> موقت از همان tag
patch روی آن
deploy patch
بعد همان patch را به main هم merge/cherry-pick میکنیم
این بخش خیلی مهمه چون “نسخه برای همه” همیشه درست نیست.
راه استاندارد: Feature Flags / Tenant Config
flag میتواند:
global
per-tenant
درصدی (rollout)
گروهی (beta users)
مزیت: یک نسخه کد، rollout کنترلشده
نیاز: سیستم flag/config قوی + observability
این معمولاً ضد الگوی trunk-based است، اما اگر مجبورید:
به جای نگه داشتن شاخههای طولانی، بهتر:
یک “compat layer” و feature flags داشته باشید
- و نهایتاً tenantها را migrate کنید
اگر واقعاً نسخههای جدا لازم است:
release branches طولانی میشود (نزدیک به GitFlow) و هزینه نگهداشت بالا میرود
جمعبندی استاندارد:
در trunk-based، multi-version per tenant را با toggle/config حل میکنند، نه branch.
این جاییه که خیلیها زمین میخورند.
Expand: ستون/جدول جدید اضافه کن (بدون شکستن قدیمی)
اپلیکیشن همزمان از هر دو پشتیبانی کند
دادهها backfill شوند (job)
وقتی مطمئن شدی همه جا migrated:
Contract: حذف ساختار قدیمی
قانون طلایی:
هر deploy باید با نسخه قبلی همزیست باشد (rolling deploy safe)
ترانکبیسد ذاتاً ضد “فریز طولانی” است، ولی در عمل گاهی لازم میشود.
به جای فریز: Release cut + flags
main ادامه پیدا میکند
برای release فقط artifact مشخص promote میشود
اگر مجبور به فریز هستید:
فریز خیلی کوتاه (ساعتها) برای release window
-فقط برای تغییرات risky
بقیه merge میشوند ولی پشت flag OFF میمانند
بهترین استاندارد:
“Freeze code” را تبدیل کنید به “Freeze flags” (یعنی قابلیتها خاموش تا زمان آماده شدن)
Canary: درصد کمی از ترافیک tenantها/کاربرها
Blue-Green: دو محیط prod و سوئیچ
Rollback:
rollback به نسخه قبل باید سریع باشد
اما ترجیح trunk-based: roll forward (fix سریع)
برای DB: rollback سخت است، برای همین expand/contract حیاتی است
چیزهایی که خیلیها در فرآیند نمیگویند ولی باید باشد:
logging ساختاریافته با correlation id
metrics (latency, error rate, saturation)
tracing (اگر microservices)
alerts روی SLOها
health checks (readiness/liveness)
automated smoke در prod بعد از deploy
حداقل استاندارد:
dependency scanning (CVEs)
secret scanning
SAST سبک
برای تغییرات حساس: threat modeling سبک + manual review
یک تغییر فقط وقتی Done است که:
merge شده
تحت flag/باگیتها امن است
تستها پاس است
روی staging دیده شده (حداقل smoke)
release note قابل تولید است
observability برایش وجود دارد (حداقل log/metric)
اگر بخوام “همه موارد مهم” را یکجا لیست کنم:
Feature Flags (global + per-tenant + gradual rollout)
CI gates قبل از merge
branch protection
artifact immutability + promote
tagging/release notes
expand/contract برای DB
canary/blue-green یا حداقل rollback plan
monitoring + alerting
تعریف SLA برای code review
محدودیت اندازه PR + policy برنچ کوتاه
قرارداد API/contract tests بین سرویسها
مدیریت schema version و backward compatibility
مدیریت config per tenant
تست دادههای واقعینما (seed/masking)
چرخه خاموش کردن flagها (flag debt)
runbook برای incident + hotfix مسیر سریع
Ticket → PR کوچک
لوکال: unit+lint
PR: CI gates + 1 review
merge به main
CI: build artifact + deploy staging
QA: smoke/regression (flags)
promote به prod (canary اگر شد)
tag نسخه + release notes
monitor + rollback/roll-forward plan
پاکسازی: حذف flagهای قدیمی، contract migrations
0) اصول GitFlow
دو شاخه دائمی و اصلی داریم:
main (یا master): فقط کدِ Production-ready / نسخههای منتشرشده
develop: خط اصلی توسعه (Integration branch)
توسعه روزمره روی develop جمع میشود.
انتشار به prod از طریق release/*
هاتفیکس روی prod از طریق hotfix/*
فیچرها روی feature/* انجام میشوند.
main: هر commit (یا هر tag) نماینده یک ریلیز واقعی است.
develop: جدیدترین وضعیت توسعه و ادغام فیچرها.
feature/<name>: برای پیادهسازی فیچرها
release/<version>: آمادهسازی انتشار (freeze نسبی)
hotfix/<version>: رفع مشکل فوری روی production
چه میشود؟
از develop برنچ میزنید:
feature/ABC-123-user-profile
اینجا چه چیزهایی هندل میشود؟
کارهای بزرگ معمولاً روی همین feature branch انجام میشوند (برخلاف trunk-based که خرد میکردیم)
Feature flag هم میتواند باشد، ولی GitFlow بدون flag هم کار میکند چون فیچر جداست.
unit / lint / type check
استاندارد خوب:
build
unit
lint
security scan پایه
integration/contract سبک
در GitFlow معمولاً CI روی PR به develop خیلی مهم است چون develop محل ادغام چند فیچر است و سریع خراب میشود.
استاندارد GitFlow:
feature → PR به develop
code review (۱ یا ۲ نفر)
merge وقتی CI سبز است
نکته کلیدی GitFlow:
اختلاف و conflict زیادتر از trunk-based میشود چون feature branch ها ممکن است طولانی باشند.
اینجا GitFlow خیلی «رسماً» وارد فاز انتشار میشود.
وقتی تصمیم گرفتید نسخه منتشر کنید:
از develop برنچ میزنید:
release/1.8.0
از اینجا به بعد چه اتفاقی میافتد؟
Feature Freeze: فیچر جدید به این release branch اضافه نمیشود.
فقط اینها مجاز است:
باگفیکس
تغییرات نسخهدهی
مستندات release
آمادهسازی پکیج/کانفیگ
استاندارد GitFlow:
QA اصلی و سنگین معمولاً روی release branch انجام میشود:
regression کاملتر
e2e گسترده
تستهای عملکردی/سازگاری
UAT
release/1.8.0 به main merge میشود
روی main tag میزنیم:
v1.8.0
سپس:
همان release/1.8.0 به develop هم merge میشود
(تا باگفیکسهای مرحله release دوباره به خط توسعه برگردد)
✅ این نقطه، “لحظه رسمی انتشار” در GitFlow است
از main برنچ میزنید:
hotfix/1.8.1
fix انجام میشود + تست
merge به main
tag:
v1.8.1
merge به develop هم انجام میشود (خیلی مهم!)
چرا merge به develop؟
برای اینکه fix فقط روی prod نماند و در توسعه آینده گم نشود.
GitFlow ذاتاً کمک میکند نسخهها جدا نگه داشته شوند، ولی هزینه دارد.
ساده: release branch → main → همه tenantها
در GitFlow این سادهتر از trunk-based است، چون:
میتوانید release branch های جدا برای نسخههای مختلف نگه دارید
یا maintenance branch برای نسخههای قدیمی بسازید (مثلاً support/1.7)
ولی هزینهها:
backport bugfix ها به چند شاخه
انفجار تست و QA
مدیریت همگرایی سختتر
همان قواعد فنی پابرجاست، ولی زمانبندی فرق دارد:
تغییرات schema بزرگ معمولاً در feature branch شروع میشود
اما “قفل” و هماهنگی دیتابیس اغلب در release branch چک میشود
بهترین استاندارد همچنان:
expand/contract
backward compatible migrations
GitFlow باعث میشود migrationها ممکن است دیرتر “در کنار هم” تست شوند (چون feature branch ها جدا هستند).
برخلاف trunk-based که سعی میکنیم حذفش کنیم، در GitFlow:
فریز عملاً بخشی از فرایند است:
وقتی release branch ساخته شد، فیچر جدید وارد آن نمیشود
طول فریز بستگی به QA/UAT دارد (ممکن است چند روز تا چند هفته)
در GitFlow معمولاً:
ریلیزها کمتر و بزرگترند → ریسک هر ریلیز بالاتر
استانداردهای مفید:
deploy مرحلهای (staging → prod)
canary/blue-green (اختیاری ولی خیلی توصیه میشود)
rollback به tag قبلی در main
همان ابزارها باید باشد، اما گیتها معمولاً در چند نقطه اعمال میشود:
PR به develop
PR به release/*
merge به main (آخرین گیت)
feature/* از develop
توسعه + تست + CI
PR → merge به develop
زمان ریلیز: release/* از develop
QA سنگین روی release/* + باگفیکس فقط همینجا
merge release/* → main + tag نسخه
merge release/* → develop
hotfix: hotfix/* از main → merge به main + tag → merge به develop
چیزهایی که GitFlow را سخت میکند:
feature branch های طولانی → conflict زیاد
ادغام دیرهنگام → باگها دیر دیده میشوند
QA bottleneck روی release branch
backport های متعدد (اگر چند نسخه/tenant دارید)
drift بین develop و main اگر mergeها دقیق انجام نشود
نکته مهم: GitHub Flow خیلی نزدیک به Trunk-Based است، با این تفاوت که «همه چیز از طریق PR به main» انجام میشود و معمولاً یک develop دائمی نداریم.
یک شاخه اصلی: main
main همیشه deployable است (قابل انتشار)
هر کار (feature/bugfix/hotfix) روی یک branch کوتاهعمر انجام میشود
merge فقط از طریق Pull Request + گیتهای CI + review
بعد از merge: deploy (یا اتومات یا با دکمه Promote)
main
feature/<ticket>-<slug>
fix/<ticket>-<slug>
chore/<slug>
(اختیاری) release/<version> فقط اگر واقعاً لازم شد (در GitHub Flow اصولاً کمتر استفاده میشود)
قانون: برنچها کوتاه، PR کوچک، merge سریع.
از main برنچ میزنید:
feature/ABC-123-checkout-discounts
تغییرات را کوچک نگه میدارید (slice)
اینجا چی باید هندل بشه؟
اگر فیچر بزرگ است: از همین اول Feature Flag تعریف کنید
اگر DB دارد: plan برای migration امن (expand/contract)
GitHub Flow استانداردش اینه:
برنچ هست، ولی کوتاهعمر
فیچرهای نیمهکاره با Feature Flag merge میشوند (flag OFF)
بهترین تمرینها برای Flag
default OFF
قابلیت rollout (درصدی/گروهی/per-tenant)
لاگ و متریک برای مسیر flagged
برنامه جمع کردن flag بعد از rollout (flag debt)
lint/format
unit
quick smoke
اینها باید “Required checks” باشند:
Build ✅
Unit tests ✅
Lint / Static analysis ✅
Dependency/secret scan ✅
Integration/contract tests سبک ✅
deploy به staging (یا preview)
smoke/e2e کوتاه روی محیط واقعی
(اختیاری) تستهای سنگینتر شبانه/دورهای
GitHub Flow = PR-centric
PR کوچک
۱ reviewer کافی (۲ تا برای قسمتهای حساس)
Review روی:
correctness
تست کافی
backward compatibility
migration safety
flag درست
security impact
SLA پیشنهادی (استاندارد تیمهای چابک):
PRهای کوچک: همان روز
Branch protection استاندارد
Required status checks (CI باید سبز باشد)
Required approvals (حداقل ۱)
منع force-push
منع merge بدون review
squash merge یا merge commit (هر کدام، ولی consistency مهم است)
با باز شدن PR:
یک محیط موقت ساخته میشود (URL جدا)
QA و PO همانجا تست میکنند
با merge: محیط حذف میشود
بعد از merge، main اتومات روی staging میرود
QA روی staging تست میکند
✅ اگر زیرساخت دارید، Preview per PR بهترین تجربه را میدهد.
QA معمولاً اینجاهاست:
روی PR Preview (بهترین حالت)
یا بعد از merge روی staging
استاندارد عملی
QA دستی بیشتر روی:
regression مسیرهای حیاتی
exploratory
UX
cross-device/browser
اتوماسیون بیشتر روی:
smoke
e2e کوتاه
contract/integration
GitHub Flow دو حالت استاندارد دارد:
هر merge به main → اتومات تا prod (با canary و flags)
main همیشه آماده انتشار است
انتشار با “promote” یک artifact انجام میشود (مثلاً دکمه Release)
نکته مهم: در هر دو، main deployable میماند.
Tag روی همان commit که به production رفت
vMAJOR.MINOR.PATCH (SemVer)
یا release-YYYY.MM.DD.N (CalVer)
از PR title + labels (feature/fix/breaking)
یا Conventional Commits برای اتوماتسازی version bump
چون main منبع واحد است، مسیر سریع:
برنچ از main: hotfix/... یا fix/...
PR کوچک + CI + review سریع
merge به main
deploy سریع (در صورت نیاز bypass حداقلی با policy مشخص)
tag patch نسخه
اگر prod روی commit قدیمی باشد (کمتر رایج در GH Flow):
موقت release/<version> از tag ساخته میشود، patch میخورد، deploy میشود، بعد patch به main هم برمیگردد.
یک کدbase + یک pipeline
تفاوتها با:
feature flags per tenant
config per tenant
gradual rollout per tenant
این برخلاف روح GH Flow است و هزینه را زیاد میکند
راه بهتر: tenantها را با flag/config کنترل کنید نه با شاخههای طولانی
اگر مجبور شدید: release branch های پشتیبانی (maintenance) ایجاد میشود، ولی این شما را به سمت GitFlow میبرد.
همان استاندارد امن:
Expand → Backfill → Switch → Contract
deploy باید backward compatible باشد
اگر rolling deploy دارید، کد جدید و قدیم باید همزیست باشند
اصولاً فریز طولانی نداریم.
release cut = انتخاب یک commit/artifact برای prod
بقیه کارها میتوانند merge شوند ولی:
پشت feature flag OFF بمانند
اگر مجبورید:
فریز کوتاه در پنجره انتشار (ساعتها)
نه چند روز
استانداردهای توصیهشده:
canary (درصدی یا per-tenant)
blue-green
rollback به tag قبلی
ولی برای DB: rollback سخت → پس expand/contract حیاتی است
secret scanning
dependency scanning
SAST سبک
policy برای تغییرات حساس (۲ reviewer)
logging ساختاریافته
metrics + alerting
tracing (اگر microservices)
post-deploy smoke در prod
یک تغییر Done است اگر:
PR merge شده به main
CI سبز
review انجام شده
روی preview/staging تست شده (حداقل smoke)
release notes قابل تولید است
مانیتورینگ/لاگ قابل اتکا دارد
flag plan دارد (enable/cleanup)
branch از main
تغییر کوچک + تست لوکال
PR → CI checks + review
merge به main
deploy به staging/preview + QA
release/prod deploy (اتومات یا promote)
tag version + release notes
monitor + rollback/roll-forward
cleanup flags + debt
GitLab Flow ترکیبی از:
سادگی GitHub Flow
ساختار محیطی (environment-based)
و کنترل انتشار شبیه GitFlow
🔹 تفاوت اصلی با GitHub Flow:
در GitLab Flow معمولاً علاوه بر main، شاخههای محیطی مثل:
production
staging
preprod
هم داریم.
main → توسعه جاری
staging → نسخه آماده تست نهایی
production → آنچه روی prod است
feature/<ticket>
fix/<ticket>
hotfix/<ticket>
از main:
feature/ABC-123-payment-refactor
Feature Flag اگر فیچر بزرگ است
برنامه migration دیتابیس
تستهای مورد نیاز
unit
lint
type check
گیتهای استاندارد:
Build ✅
Unit tests ✅
Static analysis ✅
Security scan (SAST/Dependency) ✅
Integration test سبک ✅
MR باید سبز باشد تا merge شود.
وقتی MR approve شد:
feature → main
🔹 main باید همیشه stable و deployable باشد.
بعد از merge به main:
main → staging → production
دو مدل رایج:
merge main → staging
یک commit از main انتخاب میشود
همان commit به staging deploy میشود
QA اینجا تست میکند:
regression
smoke
exploratory
performance sanity
وقتی staging تأیید شد:
staging → production
یا promote همان artifact.
سپس:
Tag زده میشود:
v1.4.2
در GitLab Flow سه نقطه دارد:
1️⃣ Preview Environment (برای هر MR)
2️⃣ روی staging
3️⃣ smoke بعد از production deploy
استاندارد حرفهای:
Preview per MR (اگر زیرساخت دارید)
QA سنگینتر روی staging
smoke سریع روی prod
از production:
hotfix/1.4.3-critical-fix
جریان:
hotfix → production
hotfix → main
hotfix → staging
سپس:
Tag:
v1.4.3
این یکی از تفاوتهای مهم با GitHub Flow است:
چون شاخه production داریم، hotfix از آن زده میشود.
استانداردها:
SemVer:
vMAJOR.MINOR.PATCH
یا Calendar Versioning
Tag باید:
روی commit production باشد
artifact traceable باشد
Release Notes:
از MRها
یا Conventional Commits
یک کدbase
یک production
تفاوت tenantها با:
feature flags
config per tenant
gradual rollout
میتوانید شاخههای maintenance داشته باشید:
production-tenant-A
production-tenant-B
اما:
⚠ پیچیدگی و هزینه شدیداً بالا میرود.
بهترین استاندارد:
کنترل با config/flag نه با branch.
همان قاعده طلایی:
چون در GitLab Flow:
ممکن است main جلوتر از production باشد
باید migrationها backward compatible باشند
در GitLab Flow ممکن است:
هنگام آمادهسازی staging → production
فریز کوتاه روی staging داشته باشید
اما:
main میتواند جلو برود
فقط merge به staging متوقف میشود
این مدل فریز سالمتر از GitFlow است.
در CI GitLab معمولاً این stageها داریم:
build
test
security
package
deploy
Security Gates:
SAST
Dependency scan
Secret detection
Container scan
استانداردهای توصیهشده:
Canary deployment
Blue/Green
Feature flags rollout
Auto rollback بر اساس metrics
یک تغییر Done است اگر:
MR approve شده
CI سبز
merge به main
deploy به staging
QA تأیید
deploy به production
tag خورده
مانیتورینگ سالم است
feature → main → staging → production
Hotfix:
production → hotfix → production
↘ main
↘ staging
در این مدل، هر محیط (Environment) یک شاخه جدا دارد.
مثلاً:
main → توسعه
staging → تست
production → محیط واقعی
و کد با merge از یک محیط به محیط بعدی «حرکت» میکند.
main یا dev
staging
production
feature/<ticket>
fix/<ticket>
hotfix/<ticket>
از main:
feature/ABC-123-add-discount
اگر فیچر بزرگ است → Feature Flag تعریف شود
اگر تغییر DB دارد → migration plan (expand/contract)
تستها مشخص شوند
unit
lint
type check
گیتهای استاندارد:
Build
Unit tests
Static analysis
Security scan
Integration tests سبک
بعد از سبز شدن:
feature → main
وقتی آماده تست شد:
main → staging
یا با merge مستقیم
یا با انتخاب commit خاص
Deploy اتومات
QA:
regression
exploratory
smoke
performance sanity
بعد از تایید QA:
staging → production
Deploy prod
Tag نسخه:
v1.6.0
QA در این مدل معمولاً:
1️⃣ روی staging
2️⃣ smoke سریع بعد از prod
اگر زیرساخت دارید:
Preview environment برای هر feature branch هم میشود اضافه کرد
اگر باگ در production پیدا شد:
از production:
hotfix/critical-fix
جریان:
hotfix → production
hotfix → staging
hotfix → main
چرا merge به همه؟
چون اگر فقط روی production بماند، drift ایجاد میشود.
Tag باید:
روی production زده شود
قابل trace به commit و artifact باشد
استاندارد:
vMAJOR.MINOR.PATCH
Release notes:
از PRها
یا Conventional Commits
یک production branch
تفاوت tenantها با:
config per tenant
feature flag per tenant
rollout تدریجی
اگر tenant نسخه جدا بخواهد:
ممکن است branch های production جدا بسازید
production-tenant-A
production-tenant-B
اما:
⚠️ هزینه نگهداری بالا و merge پیچیده میشود.
بهترین روش:
کنترل با config نه branch.
خیلی مهم چون چند branch دائمی داریم.
قانون طلایی:
migration باید backward compatible باشد
چون main ممکن است جلوتر از production باشد
روش استاندارد:
Add column
Deploy
Backfill
Switch code
Remove old column
در این مدل معمولاً:
هنگام آمادهسازی staging → production
فریز کوتاه روی staging
اما:
main میتواند جلو برود
فقط merge به staging موقتاً متوقف میشود
در CI:
Build
Test
Security scan
Container scan
Secret detection
برای merge به production:
Manual approval
Change log بررسی شود
توصیهها:
Canary deploy
Blue/Green
Feature flags
Auto rollback بر اساس metrics
یک تغییر Done است اگر:
merge به main
merge به staging
QA تایید
merge به production
tag زده شده
مانیتورینگ سالم
چیزهایی که باید حواستان باشد:
1️⃣ Drift بین branchها
2️⃣ Merge conflict زیاد
3️⃣ تاخیر در انتقال تغییرات
4️⃣ Hotfix فراموش شود به main برگردد
5️⃣ Release بزرگ و ریسکی شود
feature → main → staging → production
Hotfix:
production → hotfix → production
↘ staging
↘ main
غیر از مدلهایی که گفتیم (Trunk-Based, GitFlow, GitHub Flow, GitLab Flow, Environment Branching)، چند مدل معروف و کاربردی دیگه هم هست که در دنیای واقعی استفاده میشن.
من همه مدلهای شناختهشده و پرکاربرد رو دستهبندی میکنم 👇


4
فقط یک شاخه اصلی (main)
همه مستقیم روی آن commit میزنند
تیمهای خیلی کوچک
پروژههای داخلی ساده
migration از SVN
ریسک بالا
بدون isolation
مناسب CI/CD حرفهای نیست


4
هر توسعهدهنده یک fork جدا دارد
تغییرات از طریق Pull Request به ریپوی اصلی میآید
پروژههای Open Source
سازمانهای بزرگ با دسترسی محدود
ایزوله کامل
امنیت بالا


4
انتشار در زمانهای ثابت (مثلاً هر دو هفته)
هر چیزی که آماده باشد سوار قطار میشود
Trunk-Based
یا GitHub Flow
SaaS با ریلیز منظم
تیمهای بزرگ که cadence مشخص دارند



4
همه سرویسها در یک repo
یک trunk
تغییرات کوچک و سریع
Meta
CI بسیار قوی
تستهای سریع
نسخهای از GitFlow با:
maintenance branch
support branch
long term support (LTS)
نرمافزارهای on-premise
محصولاتی با نسخههای همزمان فعال
خیلی از سازمانها یک مدل pure ندارند.
مثالها:
Trunk-Based + Environment Branch
GitHub Flow + Release Train
GitFlow سادهشده بدون develop
در عمل، اکثر شرکتها hybrid هستند.
یک نسخه پایدار برای مشتریان سازمانی
نسخه جدید برای مشتریان عمومی
مثلاً:
main
lts/1.0
lts/2.0
نیازمند:
backport مرتب
تیم جدا برای پشتیبانی نسخه قدیمی
این بیشتر استراتژی انتشار است تا برنچینگ، ولی مهمه:
Feature Flags
Canary
A/B Testing
Gradual Rollout
معمولاً روی:
Trunk-Based
GitHub Flow
سوار میشود.
برای R&D:
branchهای آزمایشی بلندمدت
merge فقط اگر موفق شد
کمتر رایج در محصول production-critical.
مدل
پیچیدگی
مناسب برای
Centralized
کم
تیم کوچک
GitHub Flow
کم
SaaS سریع
Trunk-Based
کم
CI/CD پیشرفته
GitFlow
زیاد
ریلیز دورهای
GitLab Flow
متوسط
سازمان محیطمحور
Environment Branching
متوسط
چند محیط سازمانی
Forking
متوسط
Open Source
Release Train
کم
ریلیز منظم
LTS Branching
زیاد
Enterprise
Hybrid
متغیر
سازمانهای واقعی