{"id":77514,"date":"2026-07-07T03:35:54","date_gmt":"2026-07-07T03:35:54","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=77514"},"modified":"2026-07-07T03:35:56","modified_gmt":"2026-07-07T03:35:56","slug":"branching-strategy-master-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/branching-strategy-master-tutorial\/","title":{"rendered":"Branching Strategy Master Tutorial"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">From Beginner to Advanced: A Complete One-Stop Guide to Choosing, Designing, and Governing Branches<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. What is a branching strategy?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>branching strategy<\/strong> is a team\u2019s rulebook for how branches are created, used, reviewed, merged, released, protected, and deleted.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It answers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Which branch is production?<\/li>\n\n\n\n<li>Which branch do developers start from?<\/li>\n\n\n\n<li>How long can a branch live?<\/li>\n\n\n\n<li>When do we create feature branches?<\/li>\n\n\n\n<li>When do we create release branches?<\/li>\n\n\n\n<li>When do we create hotfix branches?<\/li>\n\n\n\n<li>Do we use <code>main<\/code>, <code>develop<\/code>, <code>release\/*<\/code>, <code>hotfix\/*<\/code>, or only trunk?<\/li>\n\n\n\n<li>How do changes move from development to production?<\/li>\n\n\n\n<li>How do we avoid merge hell?<\/li>\n\n\n\n<li>How do we support old versions?<\/li>\n\n\n\n<li>How do we roll back safely?<\/li>\n\n\n\n<li>How do CI\/CD, code review, and branch protection fit?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Simple definition:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>A branching strategy is the traffic control system for software changes.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">A weak strategy creates chaos.<br>A good strategy creates flow.<br>A great strategy lets teams move fast without making production fragile.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. Branching strategy vs Git workflow vs software delivery workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">These are related, but not the same.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Term<\/th><th>Meaning<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td><strong>Branching strategy<\/strong><\/td><td>How branches are structured and merged<\/td><td>Gitflow, trunk-based, GitHub Flow<\/td><\/tr><tr><td><strong>Git workflow<\/strong><\/td><td>How developers use Git day to day<\/td><td>branch \u2192 commit \u2192 PR \u2192 merge<\/td><\/tr><tr><td><strong>Version control workflow<\/strong><\/td><td>Complete source-control process<\/td><td>commits, branches, tags, reviews<\/td><\/tr><tr><td><strong>Software delivery workflow<\/strong><\/td><td>Full path from idea to production<\/td><td>plan \u2192 code \u2192 test \u2192 deploy \u2192 observe<\/td><\/tr><tr><td><strong>Release strategy<\/strong><\/td><td>How versions are shipped<\/td><td>tags, release branches, canary, blue-green<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Branching strategy is one layer inside the wider delivery system.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Software Delivery Workflow]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Version Control Workflow]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Git Workflow]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Branching Strategy]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Branch Names, Merge Rules, Release Rules, Hotfix Rules]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Why branching strategy matters<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Bad branching causes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>long merge conflicts<\/li>\n\n\n\n<li>broken <code>main<\/code><\/li>\n\n\n\n<li>unclear production state<\/li>\n\n\n\n<li>duplicated work<\/li>\n\n\n\n<li>unstable release branches<\/li>\n\n\n\n<li>forgotten hotfixes<\/li>\n\n\n\n<li>huge pull requests<\/li>\n\n\n\n<li>slow delivery<\/li>\n\n\n\n<li>risky production releases<\/li>\n\n\n\n<li>environment drift<\/li>\n\n\n\n<li>unclear rollback<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Good branching creates:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>safe collaboration<\/li>\n\n\n\n<li>faster review<\/li>\n\n\n\n<li>predictable releases<\/li>\n\n\n\n<li>cleaner history<\/li>\n\n\n\n<li>lower production risk<\/li>\n\n\n\n<li>easier hotfixes<\/li>\n\n\n\n<li>better CI\/CD<\/li>\n\n\n\n<li>better audit trail<\/li>\n\n\n\n<li>simpler rollback<\/li>\n\n\n\n<li>happier engineers<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The official Git book describes branching and merging as normal daily operations, including creating a branch for work, switching to a hotfix, and merging completed work back.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. The most important mental model<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A branch is not a place to hide work forever.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A branch is a temporary safety boundary.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Branch = temporary isolation for a clear purpose\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Every branch must answer:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Why does <span class=\"hljs-keyword\">this<\/span> branch exist?\nWhat risk does it isolate?\nWhen will it be merged or deleted?\nWho owns it?\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If nobody can answer those questions, the branch is probably technical garbage slowly fossilizing in your repository. Tiny archaeology site. Bad vibes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. The five reasons branches exist<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Most branches exist for one of five reasons.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Purpose<\/th><th>Branch type<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>New work<\/td><td>Feature branch<\/td><td><code>feature\/add-login<\/code><\/td><\/tr><tr><td>Normal bug fix<\/td><td>Bugfix branch<\/td><td><code>bugfix\/payment-timeout<\/code><\/td><\/tr><tr><td>Production emergency<\/td><td>Hotfix branch<\/td><td><code>hotfix\/prod-crash<\/code><\/td><\/tr><tr><td>Release stabilization<\/td><td>Release branch<\/td><td><code>release\/2.4.0<\/code><\/td><\/tr><tr><td>Old version support<\/td><td>Support branch<\/td><td><code>support\/1.9-lts<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If a branch does not support development, review, release, hotfix, or support, question it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Core branch types<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">6.1 <code>main<\/code> \/ <code>master<\/code> \/ <code>trunk<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the primary integration branch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Modern repositories usually use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Older repositories may still use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">master\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Trunk-based teams may call it:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">trunk\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In trunk-based development, teams collaborate around a single branch called trunk, main, or mainline, avoiding long-running development branches.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6.2 Feature branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Used for new work.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">feature\/add-user-login\nfeature\/device-search\nfeature\/report-<span class=\"hljs-keyword\">export<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Feature branches should be short-lived. The trunk-based development reference describes short-lived feature branches as branches intended to come back as pull requests into trunk\/main.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6.3 Bugfix branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Used for non-emergency defects.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">bugfix\/login-timeout\nbugfix\/wrong-invoice-total\nbugfix\/api-<span class=\"hljs-literal\">null<\/span>-response\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6.4 Hotfix branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Used for urgent production repair.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">hotfix\/payment-crash\nhotfix\/security-token-leak\nhotfix\/prod-login-failure\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Hotfix branches must be small, focused, quickly reviewed, and merged back into every active branch that needs the fix.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6.5 Release branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Used to stabilize a version before shipping.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">release\/1.5.0\nrelease\/2026.07\nrelease\/mobile-4.2.0\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Release branches are useful when QA, certification, app-store approval, enterprise release windows, or version support require a controlled stabilization line.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6.6 Support \/ LTS branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Used to maintain old versions.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">support\/1.9-lts\nsupport\/2.x\nmaintenance\/2025-lts\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">These branches exist when customers or systems cannot immediately upgrade to the newest version.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6.7 Environment branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Used when branches map directly to environments.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dev\nstaging\nproduction\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">GitLab\u2019s documentation lists branch-per-environment as one possible branching strategy, alongside web-service and long-lived release-branch approaches.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Environment branches can work, but they can also drift badly if teams make direct changes in different branches.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. The lifecycle of a healthy branch<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">flowchart TD\n    A&#91;Create <span class=\"hljs-keyword\">from<\/span> correct base] --&gt; B&#91;Make small commits]\n    B --&gt; C&#91;Push branch]\n    C --&gt; D&#91;Open PR\/MR]\n    D --&gt; E&#91;CI checks]\n    D --&gt; F&#91;Code review]\n    E --&gt; G{Checks pass?}\n    F --&gt; H{Approved?}\n    G -- No --&gt; B\n    H -- No --&gt; B\n    G -- Yes --&gt; I&#91;Merge]\n    H -- Yes --&gt; I\n    I --&gt; J&#91;Delete branch]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Healthy branches are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>clearly named<\/li>\n\n\n\n<li>short-lived<\/li>\n\n\n\n<li>owned<\/li>\n\n\n\n<li>reviewed<\/li>\n\n\n\n<li>tested<\/li>\n\n\n\n<li>merged<\/li>\n\n\n\n<li>deleted<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Unhealthy branches are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>old<\/li>\n\n\n\n<li>unclear<\/li>\n\n\n\n<li>huge<\/li>\n\n\n\n<li>unreviewed<\/li>\n\n\n\n<li>never merged<\/li>\n\n\n\n<li>never deleted<\/li>\n\n\n\n<li>impossible to rebase<\/li>\n\n\n\n<li>terrifying to touch<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Branch lifetime guide<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Branch type<\/th><th>Ideal lifetime<\/th><th>Maximum recommended lifetime<\/th><\/tr><\/thead><tbody><tr><td><code>feature\/*<\/code><\/td><td>Hours to 3 days<\/td><td>1 week<\/td><\/tr><tr><td><code>bugfix\/*<\/code><\/td><td>Hours to 2 days<\/td><td>1 week<\/td><\/tr><tr><td><code>hotfix\/*<\/code><\/td><td>Minutes to hours<\/td><td>1 day<\/td><\/tr><tr><td><code>release\/*<\/code><\/td><td>Days to weeks<\/td><td>Release-dependent<\/td><\/tr><tr><td><code>support\/*<\/code><\/td><td>Months to years<\/td><td>Product-dependent<\/td><\/tr><tr><td><code>experiment\/*<\/code><\/td><td>Hours to days<\/td><td>1\u20132 weeks<\/td><\/tr><tr><td>Environment branch<\/td><td>Long-lived<\/td><td>Must be strictly governed<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">xychart-beta\n    title <span class=\"hljs-string\">\"Branch age vs merge risk\"<\/span>\n    x-axis &#91;<span class=\"hljs-string\">\"Hours\"<\/span>, <span class=\"hljs-string\">\"1 day\"<\/span>, <span class=\"hljs-string\">\"3 days\"<\/span>, <span class=\"hljs-string\">\"1 week\"<\/span>, <span class=\"hljs-string\">\"2 weeks\"<\/span>, <span class=\"hljs-string\">\"1 month\"<\/span>]\n    y-axis <span class=\"hljs-string\">\"Integration risk\"<\/span> <span class=\"hljs-number\">0<\/span> --&gt; <span class=\"hljs-number\">100<\/span>\n    bar &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">25<\/span>, <span class=\"hljs-number\">45<\/span>, <span class=\"hljs-number\">75<\/span>, <span class=\"hljs-number\">95<\/span>]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The chart is conceptual, but the lesson is painfully real:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Long-lived branches <span class=\"hljs-keyword\">do<\/span> not remove integration pain.\nThey delay it and make it bigger.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. The major branching strategies<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The major strategies are:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Mainline strategy<\/li>\n\n\n\n<li>Feature branch strategy<\/li>\n\n\n\n<li>GitHub Flow<\/li>\n\n\n\n<li>GitLab Flow<\/li>\n\n\n\n<li>Gitflow<\/li>\n\n\n\n<li>Trunk-based development<\/li>\n\n\n\n<li>Release branch strategy<\/li>\n\n\n\n<li>Environment branch strategy<\/li>\n\n\n\n<li>Fork-based strategy<\/li>\n\n\n\n<li>GitOps branching strategy<\/li>\n\n\n\n<li>Monorepo branching strategy<\/li>\n\n\n\n<li>Support\/LTS strategy<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mindmap\n  root((Branching Strategies))\n    Mainline\n    Feature Branch\n    GitHub Flow\n    GitLab Flow\n    Gitflow\n    Trunk Based Development\n    Release Branch\n    Environment Branch\n    Fork Based\n    GitOps\n    Monorepo\n    Support LTS\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Strategy 1: Mainline strategy<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Everyone works close to one main branch.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"A\"<\/span>\n    commit id: <span class=\"hljs-string\">\"B\"<\/span>\n    commit id: <span class=\"hljs-string\">\"C\"<\/span>\n    commit id: <span class=\"hljs-string\">\"D\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>solo developers<\/li>\n\n\n\n<li>prototypes<\/li>\n\n\n\n<li>small internal tools<\/li>\n\n\n\n<li>learning repositories<\/li>\n\n\n\n<li>scripts<\/li>\n\n\n\n<li>tiny teams with strong discipline<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Pros<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Benefit<\/th><th>Explanation<\/th><\/tr><\/thead><tbody><tr><td>Simple<\/td><td>Few branches<\/td><\/tr><tr><td>Fast<\/td><td>No complex promotion<\/td><\/tr><tr><td>Easy to understand<\/td><td>Good for beginners<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Cons<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Risk<\/th><th>Explanation<\/th><\/tr><\/thead><tbody><tr><td>Easy to break main<\/td><td>If no reviews\/checks<\/td><\/tr><tr><td>Weak governance<\/td><td>No release structure<\/td><\/tr><tr><td>Risky for large teams<\/td><td>Too much direct integration<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended rules<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">main must always build\ncommit small\npull before push\nuse CI\ntag important versions\navoid direct production deployment <span class=\"hljs-keyword\">from<\/span> laptops\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Verdict<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mainline is fine for small\/simple work. For professional teams, add PRs, CI, and branch protection quickly.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Strategy 2: Feature branch strategy<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each task gets its own temporary branch.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\nbugfix\/*\nhotfix\/*\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"main-1\"<\/span>\n    branch feature\/login\n    checkout feature\/login\n    commit id: <span class=\"hljs-string\">\"login-1\"<\/span>\n    commit id: <span class=\"hljs-string\">\"login-2\"<\/span>\n    checkout main\n    merge feature\/login\n    branch bugfix\/payment\n    checkout bugfix\/payment\n    commit id: <span class=\"hljs-string\">\"fix-payment\"<\/span>\n    checkout main\n    merge bugfix\/payment\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Workflow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;feature branch]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;PR\/MR]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;CI + review]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;merge to main]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;delete branch]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>most engineering teams<\/li>\n\n\n\n<li>backend services<\/li>\n\n\n\n<li>frontend apps<\/li>\n\n\n\n<li>Terraform repositories<\/li>\n\n\n\n<li>Kubernetes manifests<\/li>\n\n\n\n<li>documentation<\/li>\n\n\n\n<li>teams not ready for full trunk-based development<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Pros<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Benefit<\/th><th>Explanation<\/th><\/tr><\/thead><tbody><tr><td>Clear isolation<\/td><td>Work does not immediately affect main<\/td><\/tr><tr><td>PR-friendly<\/td><td>Natural review workflow<\/td><\/tr><tr><td>Beginner-friendly<\/td><td>Easy to understand<\/td><\/tr><tr><td>Works with CI\/CD<\/td><td>Good default<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Cons<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Risk<\/th><th>Explanation<\/th><\/tr><\/thead><tbody><tr><td>Branches can live too long<\/td><td>Creates merge conflicts<\/td><\/tr><tr><td>Huge PRs<\/td><td>Review quality drops<\/td><\/tr><tr><td>Delayed feedback<\/td><td>Problems appear late<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Best practice<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Keep feature branches short-lived and PRs small.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. Strategy 3: GitHub Flow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Flow is a lightweight branch-based workflow. GitHub\u2019s official documentation describes it as: create a branch, make changes, create a pull request, address review comments, merge, and delete the branch.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Create branch]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Make commits]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Open pull request]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Review and discuss]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;CI checks]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Merge to main]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Deploy]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\nbugfix\/*\nhotfix\/*\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Philosophy<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main is always deployable.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>web applications<\/li>\n\n\n\n<li>SaaS products<\/li>\n\n\n\n<li>APIs<\/li>\n\n\n\n<li>documentation sites<\/li>\n\n\n\n<li>internal tools<\/li>\n\n\n\n<li>teams that deploy frequently<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Not ideal for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>mobile app-store release cycles<\/li>\n\n\n\n<li>desktop software with long release windows<\/li>\n\n\n\n<li>firmware<\/li>\n\n\n\n<li>heavy certification processes<\/li>\n\n\n\n<li>products supporting many old versions<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Practical policy<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Branch <span class=\"hljs-keyword\">from<\/span> main.\nOpen pull request.\nRequire CI and review.\nMerge to main.\nDeploy <span class=\"hljs-keyword\">from<\/span> main.\nDelete branch.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Strategy 4: GitLab Flow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitLab Flow adds deployment, environment, and release guidance around feature branches and merge requests. GitLab describes GitLab Flow as a simpler alternative to Gitflow that combines feature-driven development and feature branches with issue tracking, while allowing production and stable branches.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Feature branch]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Merge request]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;main]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;staging]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;production]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Common GitLab Flow variants<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Variant A: Main + production branch<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nproduction\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Variant B: Environment branches<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nstaging\nproduction\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Variant C: Release branches<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nrelease\/1.0\nrelease\/1.1\nrelease\/2.0\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">GitLab\u2019s branching-strategy documentation describes models for web services, long-lived release branches, and branch-per-environment workflows.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>teams using GitLab<\/li>\n\n\n\n<li>staging \u2192 production promotion<\/li>\n\n\n\n<li>enterprise web apps<\/li>\n\n\n\n<li>release visibility<\/li>\n\n\n\n<li>teams wanting more structure than GitHub Flow but less ceremony than Gitflow<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Strength<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitLab Flow is a practical middle ground.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It says:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Keep development simple, but make deployment and release state explicit.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Strategy 5: Gitflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Gitflow is a structured branching model with multiple long-lived and short-lived branches.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typical branches:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\ndevelop\nfeature\/*\nrelease\/*\nhotfix\/*\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Atlassian describes Gitflow as assigning specific roles to branches such as feature, release, and hotfix branches, and notes that it is suitable for projects with scheduled release cycles.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"prod-1\"<\/span>\n    branch develop\n    checkout develop\n    commit id: <span class=\"hljs-string\">\"dev-1\"<\/span>\n    branch feature\/login\n    checkout feature\/login\n    commit id: <span class=\"hljs-string\">\"login-work\"<\/span>\n    checkout develop\n    merge feature\/login\n    branch release\/<span class=\"hljs-number\">1.1<\/span><span class=\"hljs-number\">.0<\/span>\n    checkout release\/<span class=\"hljs-number\">1.1<\/span><span class=\"hljs-number\">.0<\/span>\n    commit id: <span class=\"hljs-string\">\"release-fix\"<\/span>\n    checkout main\n    merge release\/<span class=\"hljs-number\">1.1<\/span><span class=\"hljs-number\">.0<\/span> tag: <span class=\"hljs-string\">\"v1.1.0\"<\/span>\n    checkout develop\n    merge release\/<span class=\"hljs-number\">1.1<\/span><span class=\"hljs-number\">.0<\/span>\n    checkout main\n    branch hotfix\/<span class=\"hljs-number\">1.1<\/span><span class=\"hljs-number\">.1<\/span>\n    checkout hotfix\/<span class=\"hljs-number\">1.1<\/span><span class=\"hljs-number\">.1<\/span>\n    commit id: <span class=\"hljs-string\">\"hotfix\"<\/span>\n    checkout main\n    merge hotfix\/<span class=\"hljs-number\">1.1<\/span><span class=\"hljs-number\">.1<\/span> tag: <span class=\"hljs-string\">\"v1.1.1\"<\/span>\n    checkout develop\n    merge hotfix\/<span class=\"hljs-number\">1.1<\/span><span class=\"hljs-number\">.1<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Branch roles<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Branch<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td><code>main<\/code><\/td><td>Production-ready code<\/td><\/tr><tr><td><code>develop<\/code><\/td><td>Integration branch for next release<\/td><\/tr><tr><td><code>feature\/*<\/code><\/td><td>New feature work<\/td><\/tr><tr><td><code>release\/*<\/code><\/td><td>Release stabilization<\/td><\/tr><tr><td><code>hotfix\/*<\/code><\/td><td>Emergency production repair<\/td><\/tr><tr><td><code>support\/*<\/code><\/td><td>Optional old-version maintenance<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>mobile apps<\/li>\n\n\n\n<li>desktop apps<\/li>\n\n\n\n<li>firmware<\/li>\n\n\n\n<li>SDKs<\/li>\n\n\n\n<li>on-prem software<\/li>\n\n\n\n<li>scheduled release cycles<\/li>\n\n\n\n<li>products needing formal release stabilization<\/li>\n\n\n\n<li>teams supporting old versions<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Pros<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Benefit<\/th><th>Explanation<\/th><\/tr><\/thead><tbody><tr><td>Very structured<\/td><td>Clear branch purpose<\/td><\/tr><tr><td>Release-friendly<\/td><td>Good for versioned products<\/td><\/tr><tr><td>Hotfix-friendly<\/td><td>Production repair path is explicit<\/td><\/tr><tr><td>Governance-friendly<\/td><td>Works with formal approval<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Cons<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Risk<\/th><th>Explanation<\/th><\/tr><\/thead><tbody><tr><td>More complex<\/td><td>Many branch types<\/td><\/tr><tr><td>Slower<\/td><td>More merging and coordination<\/td><\/tr><tr><td><code>develop<\/code> can rot<\/td><td>If not protected<\/td><\/tr><tr><td>Long-lived branches<\/td><td>More conflict risk<\/td><\/tr><tr><td>Overkill for SaaS<\/td><td>Continuous delivery teams often do not need it<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Verdict<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Gitflow is powerful when release complexity is real.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is overkill when a team can safely deploy from <code>main<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Strategy 6: Trunk-based development<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development means developers integrate small changes into one shared trunk frequently. The trunk-based development reference strongly recommends trunk-based development over models with multiple long-running branches and allows either direct-to-trunk commits for very small teams or short-lived pull-request branches.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"A\"<\/span>\n    branch tiny-change<span class=\"hljs-number\">-1<\/span>\n    checkout tiny-change<span class=\"hljs-number\">-1<\/span>\n    commit id: <span class=\"hljs-string\">\"B\"<\/span>\n    checkout main\n    merge tiny-change<span class=\"hljs-number\">-1<\/span>\n    branch tiny-change<span class=\"hljs-number\">-2<\/span>\n    checkout tiny-change<span class=\"hljs-number\">-2<\/span>\n    commit id: <span class=\"hljs-string\">\"C\"<\/span>\n    checkout main\n    merge tiny-change<span class=\"hljs-number\">-2<\/span>\n    commit id: <span class=\"hljs-string\">\"D\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nshort-lived\/*\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Core rule<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">The trunk is the center of gravity.\nBranches are temporary.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>mature CI\/CD teams<\/li>\n\n\n\n<li>SaaS<\/li>\n\n\n\n<li>APIs<\/li>\n\n\n\n<li>platform teams<\/li>\n\n\n\n<li>monorepos<\/li>\n\n\n\n<li>high-frequency deployment<\/li>\n\n\n\n<li>teams using feature flags<\/li>\n\n\n\n<li>teams with strong automated tests<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Required practices<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Practice<\/th><th>Why<\/th><\/tr><\/thead><tbody><tr><td>Small PRs<\/td><td>Easier review<\/td><\/tr><tr><td>Fast CI<\/td><td>Quick feedback<\/td><\/tr><tr><td>Feature flags<\/td><td>Hide incomplete work<\/td><\/tr><tr><td>Strong tests<\/td><td>Protect trunk<\/td><\/tr><tr><td>Quick rollback<\/td><td>Recover safely<\/td><\/tr><tr><td>Short branch life<\/td><td>Avoid merge pain<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Warning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development does <strong>not<\/strong> mean chaos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bad trunk-based:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Everyone pushes random code to main.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good trunk-based:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Small changes, strong CI, feature flags, <span class=\"hljs-keyword\">protected<\/span> main, fast rollback.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Strategy 7: Release branch strategy<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A release branch stabilizes a version while normal development continues elsewhere.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nrelease\/2.4.0\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"A\"<\/span>\n    commit id: <span class=\"hljs-string\">\"B\"<\/span>\n    branch release\/<span class=\"hljs-number\">2.4<\/span><span class=\"hljs-number\">.0<\/span>\n    checkout release\/<span class=\"hljs-number\">2.4<\/span><span class=\"hljs-number\">.0<\/span>\n    commit id: <span class=\"hljs-string\">\"rc-fix-1\"<\/span>\n    commit id: <span class=\"hljs-string\">\"rc-fix-2\"<\/span>\n    checkout main\n    commit id: <span class=\"hljs-string\">\"future-work\"<\/span>\n    checkout release\/<span class=\"hljs-number\">2.4<\/span><span class=\"hljs-number\">.0<\/span>\n    commit id: <span class=\"hljs-string\">\"release-ready\"<\/span> tag: <span class=\"hljs-string\">\"v2.4.0\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>QA cycles<\/li>\n\n\n\n<li>app-store approvals<\/li>\n\n\n\n<li>enterprise release windows<\/li>\n\n\n\n<li>certification<\/li>\n\n\n\n<li>customer-specific versions<\/li>\n\n\n\n<li>release candidates<\/li>\n\n\n\n<li>controlled production promotion<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Release branch rules<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Allowed:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">bug fixes\nversion bumps\nrelease notes\nsafe documentation updates\nrelease configuration fixes\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Not allowed:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">new<\/span> features\nlarge refactors\nexperimental changes\nunrelated cleanup\nrisky dependency upgrades\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Good release branch naming<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">release\/2.4.0\nrelease\/2026.07\nrelease\/mobile-5.1.0\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. Strategy 8: Environment branch strategy<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Branches represent environments.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dev\nstaging\nproduction\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;dev]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;staging]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;production]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>simple deployment triggers<\/li>\n\n\n\n<li>teams already using branch-based deployment<\/li>\n\n\n\n<li>some GitLab Flow setups<\/li>\n\n\n\n<li>smaller systems with strict promotion rules<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Major risk: branch drift<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;staging]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;production]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;staging-only fix]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;production-only hotfix]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Drift]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Safe rules<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you use environment branches:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Promotion direction must be clear.<\/li>\n\n\n\n<li>Never make random direct changes in production branch.<\/li>\n\n\n\n<li>Hotfixes must flow back to lower branches.<\/li>\n\n\n\n<li>CI must validate every promotion.<\/li>\n\n\n\n<li>Branch differences must be visible.<\/li>\n\n\n\n<li>Staging must not become a different product from production.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Better alternative for many teams<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main branch + environment folders + deployment pipeline\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">environments\/\n  dev\/\n  staging\/\n  production\/\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Strategy 9: Fork-based strategy<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Contributors fork the repository, work in their fork, and open pull requests to the upstream repository.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Upstream repository]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Contributor fork]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Contributor branch]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Pull request]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Maintainer review]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Merge upstream]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>open-source projects<\/li>\n\n\n\n<li>external contributors<\/li>\n\n\n\n<li>vendors<\/li>\n\n\n\n<li>public repositories<\/li>\n\n\n\n<li>situations where contributors should not have write access<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Typical flow<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">fork repo\ncreate branch in fork\npush changes\nopen pull request to upstream\nmaintainer reviews\nmerge\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. Strategy 10: GitOps branching strategy<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitOps uses Git as the desired state for infrastructure or application deployment.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;App source repo]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Build image]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Push image]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Update GitOps repo]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Argo CD \/ Flux sync]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Kubernetes cluster]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Recommended layout<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">gitops\/\n  apps\/\n    auth\/\n    payment\/\n    notification\/\n  environments\/\n    dev\/\n    staging\/\n    production\/\n  platform\/\n    ingress\/\n    monitoring\/\n    security\/\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best practice<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For most GitOps teams:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">one<\/span> <span class=\"hljs-title\">main<\/span> <span class=\"hljs-title\">branch<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">environment<\/span> <span class=\"hljs-title\">folders<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is often cleaner than long-lived environment branches.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Golden GitOps rule<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Build once. Promote the same artifact.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. Strategy 11: Monorepo branching strategy<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A monorepo stores many apps, services, packages, and infrastructure code in one repository.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">repo\/\n  apps\/\n    web\/\n    admin\/\n  services\/\n    auth\/\n    payment\/\n    notification\/\n  packages\/\n    common\/\n    ui\/\n  infra\/\n  docs\/\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Recommended strategy<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">trunk-based development\nshort-lived branches\nCODEOWNERS\npath-based CI\naffected-project builds\nfeature flags\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Change in monorepo]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Detect changed paths]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Find affected projects]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Run targeted tests]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Request CODEOWNERS review]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Merge to main]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Build affected artifacts]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Why trunk-based works well in monorepos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Long-lived branches in monorepos are especially painful because many teams touch the same repository. Short-lived branches and fast integration reduce conflict risk.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. Strategy 12: Support \/ LTS branching strategy<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Support branches maintain older versions.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nrelease\/3.0\nsupport\/2.x\nsupport\/1.9-lts\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;release\/3.0]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;support\/2.x]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;support\/1.9-lts]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Security fix]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>enterprise products<\/li>\n\n\n\n<li>SDKs<\/li>\n\n\n\n<li>libraries<\/li>\n\n\n\n<li>firmware<\/li>\n\n\n\n<li>operating-system-like products<\/li>\n\n\n\n<li>products with long customer upgrade cycles<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Backport rule<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A fix should be backported when it is:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>security-related<\/li>\n\n\n\n<li>data-loss-related<\/li>\n\n\n\n<li>production-crash-related<\/li>\n\n\n\n<li>compliance-related<\/li>\n\n\n\n<li>customer-critical<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Do not backport random refactors or new features unless there is a strong business reason.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Comparing branching strategies<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Strategy<\/th><th>Speed<\/th><th>Governance<\/th><th>Complexity<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>Mainline<\/td><td>High<\/td><td>Low<\/td><td>Low<\/td><td>Tiny teams<\/td><\/tr><tr><td>Feature branch<\/td><td>Medium-high<\/td><td>Medium<\/td><td>Medium<\/td><td>Most teams<\/td><\/tr><tr><td>GitHub Flow<\/td><td>High<\/td><td>Medium<\/td><td>Low-medium<\/td><td>SaaS\/web apps<\/td><\/tr><tr><td>GitLab Flow<\/td><td>Medium<\/td><td>High<\/td><td>Medium<\/td><td>Env promotion<\/td><\/tr><tr><td>Gitflow<\/td><td>Medium-low<\/td><td>High<\/td><td>High<\/td><td>Versioned releases<\/td><\/tr><tr><td>Trunk-based<\/td><td>Very high<\/td><td>High if automated<\/td><td>Medium-high<\/td><td>Mature CI\/CD<\/td><\/tr><tr><td>Release branch<\/td><td>Medium<\/td><td>High<\/td><td>Medium<\/td><td>QA\/release windows<\/td><\/tr><tr><td>Environment branch<\/td><td>Low-medium<\/td><td>Medium<\/td><td>Medium-high<\/td><td>Branch deploys<\/td><\/tr><tr><td>Fork-based<\/td><td>Medium<\/td><td>High<\/td><td>Medium<\/td><td>Open source<\/td><\/tr><tr><td>GitOps<\/td><td>High<\/td><td>High<\/td><td>Medium<\/td><td>Kubernetes\/platform<\/td><\/tr><tr><td>Monorepo trunk<\/td><td>Very high<\/td><td>High<\/td><td>High tooling<\/td><td>Large repos<\/td><\/tr><tr><td>Support\/LTS<\/td><td>Low-medium<\/td><td>Very high<\/td><td>High<\/td><td>Old versions<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. Strategy decision tree<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">flowchart TD\n    A&#91;Choose branching strategy] --&gt; B{External contributors?}\n    B -- Yes --&gt; C&#91;Fork-based strategy]\n    B -- No --&gt; D{<span class=\"hljs-keyword\">Do<\/span> you deploy many times per week?}\n    D -- Yes --&gt; E{Strong CI, tests, feature flags?}\n    E -- Yes --&gt; F&#91;Trunk-based development]\n    E -- No --&gt; G&#91;GitHub Flow <span class=\"hljs-keyword\">or<\/span> feature branch strategy]\n    D -- No --&gt; H{Scheduled versioned releases?}\n    H -- Yes --&gt; I{Need develop + release + hotfix structure?}\n    I -- Yes --&gt; J&#91;Gitflow]\n    I -- No --&gt; K&#91;Release branch strategy]\n    H -- No --&gt; L{Need staging to production promotion?}\n    L -- Yes --&gt; M&#91;GitLab Flow <span class=\"hljs-keyword\">or<\/span> GitOps environment folders]\n    L -- No --&gt; N&#91;Feature branch strategy]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Recommended strategy by project type<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Project type<\/th><th>Recommended strategy<\/th><\/tr><\/thead><tbody><tr><td>Solo project<\/td><td>Mainline<\/td><\/tr><tr><td>Small internal tool<\/td><td>GitHub Flow<\/td><\/tr><tr><td>SaaS backend<\/td><td>Trunk-based or GitHub Flow<\/td><\/tr><tr><td>Enterprise web app<\/td><td>GitLab Flow<\/td><\/tr><tr><td>Mobile app<\/td><td>Release branches or Gitflow<\/td><\/tr><tr><td>Desktop app<\/td><td>Gitflow<\/td><\/tr><tr><td>Firmware<\/td><td>Gitflow + support branches<\/td><\/tr><tr><td>SDK\/library<\/td><td>Release branches + SemVer<\/td><\/tr><tr><td>Terraform IaC<\/td><td>Feature branches + protected main<\/td><\/tr><tr><td>Kubernetes GitOps<\/td><td>Main + environment folders<\/td><\/tr><tr><td>Open source<\/td><td>Fork-based<\/td><\/tr><tr><td>Monorepo<\/td><td>Trunk-based + CODEOWNERS<\/td><\/tr><tr><td>Regulated system<\/td><td>Release branches + strict approval<\/td><\/tr><tr><td>Long-term enterprise product<\/td><td>Support\/LTS branches<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">AWS Prescriptive Guidance groups common Git branching choices around trunk, GitHub Flow, and Gitflow and recommends choosing based on organizational needs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. The best default strategy for most modern teams<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For most teams, start with this:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\nbugfix\/*\nhotfix\/*\nrelease\/* only when needed\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Rules<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>main<\/code> is always healthy.<\/li>\n\n\n\n<li>No direct push to <code>main<\/code>.<\/li>\n\n\n\n<li>Every change goes through PR\/MR.<\/li>\n\n\n\n<li>CI must pass before merge.<\/li>\n\n\n\n<li>At least one approval is required.<\/li>\n\n\n\n<li>Feature branches are short-lived.<\/li>\n\n\n\n<li>Release branches are created only for stabilization.<\/li>\n\n\n\n<li>Hotfix branches are created only for production emergencies.<\/li>\n\n\n\n<li>Branches are deleted after merge.<\/li>\n\n\n\n<li>Every production release is tagged.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub protected branch rules can prevent force pushes or deletion and can require status checks, pull request reviews, or linear history before changes land.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">26. Branch naming standard<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended format<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">type<\/span>&gt;<\/span>\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ticket-id<\/span>&gt;<\/span>-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">short-description<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Examples<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">feature\/EVP<span class=\"hljs-number\">-123<\/span>-add-device-search\nbugfix\/EVP<span class=\"hljs-number\">-224<\/span>-fix-login-timeout\nhotfix\/EVP<span class=\"hljs-number\">-911<\/span>-fix-prod-crash\nrelease\/<span class=\"hljs-number\">2.4<\/span><span class=\"hljs-number\">.0<\/span>\nsupport\/<span class=\"hljs-number\">1.9<\/span>-lts\ndocs\/EVP<span class=\"hljs-number\">-410<\/span>-update-runbook\nchore\/EVP<span class=\"hljs-number\">-301<\/span>-upgrade-dependencies\nsecurity\/EVP<span class=\"hljs-number\">-777<\/span>-rotate-token\nexperiment\/<span class=\"hljs-keyword\">new<\/span>-cache-design\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Branch prefix guide<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Prefix<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td><code>feature\/<\/code><\/td><td>New functionality<\/td><\/tr><tr><td><code>bugfix\/<\/code><\/td><td>Normal bug fix<\/td><\/tr><tr><td><code>hotfix\/<\/code><\/td><td>Urgent production fix<\/td><\/tr><tr><td><code>release\/<\/code><\/td><td>Release stabilization<\/td><\/tr><tr><td><code>support\/<\/code><\/td><td>Old-version maintenance<\/td><\/tr><tr><td><code>docs\/<\/code><\/td><td>Documentation<\/td><\/tr><tr><td><code>chore\/<\/code><\/td><td>Maintenance<\/td><\/tr><tr><td><code>refactor\/<\/code><\/td><td>Internal restructuring<\/td><\/tr><tr><td><code>security\/<\/code><\/td><td>Security fix<\/td><\/tr><tr><td><code>experiment\/<\/code><\/td><td>Temporary exploration<\/td><\/tr><tr><td><code>test\/<\/code><\/td><td>Test-only change<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. Branch protection strategy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Branching strategy is useless if it is not enforced.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended branch protection<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Branch<\/th><th>Protection level<\/th><\/tr><\/thead><tbody><tr><td><code>main<\/code><\/td><td>Very strong<\/td><\/tr><tr><td><code>release\/*<\/code><\/td><td>Strong<\/td><\/tr><tr><td><code>hotfix\/*<\/code><\/td><td>Fast but controlled<\/td><\/tr><tr><td><code>develop<\/code><\/td><td>Strong if used<\/td><\/tr><tr><td><code>production<\/code><\/td><td>Very strong<\/td><\/tr><tr><td><code>support\/*<\/code><\/td><td>Strong<\/td><\/tr><tr><td><code>feature\/*<\/code><\/td><td>Usually light<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><code>main<\/code> protection checklist<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">- direct push disabled\n- pull request required\n- required CI checks\n- required approvals\n- CODEOWNERS for critical paths\n- force push disabled\n- branch deletion disabled\n- signed commits if needed\n- admin bypass audited\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">GitHub branch protection rules can enforce required reviews and passing status checks for pull requests before merge.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. Merge strategy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A branching strategy must define how branches merge.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Merge options<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Merge type<\/th><th>Meaning<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>Merge commit<\/td><td>Preserve full branch history<\/td><td>Audit-heavy teams<\/td><\/tr><tr><td>Squash merge<\/td><td>One PR becomes one commit<\/td><td>Clean <code>main<\/code><\/td><\/tr><tr><td>Rebase merge<\/td><td>Replay commits linearly<\/td><td>Teams with strong Git discipline<\/td><\/tr><tr><td>Fast-forward<\/td><td>Move pointer only<\/td><td>Trunk\/mainline workflows<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Git\u2019s documentation explains that <code>git merge<\/code> integrates another branch into the currently checked-out branch.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended default<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Normal feature PRs: squash merge\nRelease branches: merge commit\nHotfix branches: merge commit or squash depending audit need\nLocal cleanup: rebase your own branch\nShared branch: <span class=\"hljs-keyword\">do<\/span> not rebase casually\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">29. Merge vs rebase<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Area<\/th><th>Merge<\/th><th>Rebase<\/th><\/tr><\/thead><tbody><tr><td>History<\/td><td>Preserves branch structure<\/td><td>Rewrites branch commits<\/td><\/tr><tr><td>Safety<\/td><td>Safer for shared branches<\/td><td>Safer for local cleanup<\/td><\/tr><tr><td>Readability<\/td><td>Can be noisy<\/td><td>Linear and clean<\/td><\/tr><tr><td>Conflict handling<\/td><td>Usually one merge conflict event<\/td><td>May resolve conflicts commit by commit<\/td><\/tr><tr><td>Best use<\/td><td>Shared integration<\/td><td>Cleaning your own branch<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Safe rule<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Rebase your own branch.\n<span class=\"hljs-keyword\">Do<\/span> not rebase shared branches unless the team explicitly agrees.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">30. Release branch strategy in detail<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A release branch exists to stabilize a version.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;main\/develop]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Create release\/2.5.0]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;QA testing]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Bug fixes only]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Release candidate]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Tag v2.5.0]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Deploy\/ship production]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Release branch rules<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Allowed:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">fixes\nversion bump\nrelease notes\nsafe documentation\nrelease config correction\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Not allowed:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">new<\/span> feature\nbig refactor\nexperimental dependency\nunrelated cleanup\nrisky architecture change\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Release branch commands<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout main\ngit pull --ff-only origin main\ngit checkout -b release\/2.5.0\ngit push -u origin release\/2.5.0\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">After stabilization:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git checkout main\ngit merge --no-ff release\/<span class=\"hljs-number\">2.5<\/span><span class=\"hljs-number\">.0<\/span>\ngit tag -a v2<span class=\"hljs-number\">.5<\/span><span class=\"hljs-number\">.0<\/span> -m <span class=\"hljs-string\">\"Release v2.5.0\"<\/span>\ngit push origin main v2<span class=\"hljs-number\">.5<\/span><span class=\"hljs-number\">.0<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Semantic Versioning defines <code>MAJOR.MINOR.PATCH<\/code>, where major versions indicate incompatible API changes, minor versions add backward-compatible functionality, and patch versions add backward-compatible bug fixes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">31. Hotfix branch strategy in detail<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Hotfix branches fix production fast but safely.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Production incident]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Find production commit\/tag]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Create hotfix branch]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Minimal fix]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Emergency PR]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Critical CI]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Merge]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Deploy]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Tag patch release]<\/span>\n    <span class=\"hljs-selector-tag\">I<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span><span class=\"hljs-selector-attr\">&#91;Back-merge\/cherry-pick to active branches]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Hotfix rules<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Start from the production branch or production tag.<\/li>\n\n\n\n<li>Fix only the incident.<\/li>\n\n\n\n<li>Avoid refactoring.<\/li>\n\n\n\n<li>Avoid unrelated dependency upgrades.<\/li>\n\n\n\n<li>Keep PR small.<\/li>\n\n\n\n<li>Run critical CI.<\/li>\n\n\n\n<li>Deploy.<\/li>\n\n\n\n<li>Tag the patch release.<\/li>\n\n\n\n<li>Merge or cherry-pick back to <code>main<\/code>, <code>develop<\/code>, or active release branches.<\/li>\n\n\n\n<li>Create follow-up cleanup ticket if needed.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Hotfix commands<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout main\ngit pull --ff-only origin main\ngit checkout -b hotfix\/2.5.1-payment-crash\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">After fix:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git add .\ngit commit -m <span class=\"hljs-string\">\"fix(payment): prevent crash on missing token\"<\/span>\ngit push -u origin hotfix\/<span class=\"hljs-number\">2.5<\/span><span class=\"hljs-number\">.1<\/span>-payment-crash\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">After merge:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">checkout<\/span> <span class=\"hljs-selector-tag\">main<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">pull<\/span> <span class=\"hljs-selector-tag\">--ff-only<\/span> <span class=\"hljs-selector-tag\">origin<\/span> <span class=\"hljs-selector-tag\">main<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">-a<\/span> <span class=\"hljs-selector-tag\">v2<\/span><span class=\"hljs-selector-class\">.5<\/span><span class=\"hljs-selector-class\">.1<\/span> <span class=\"hljs-selector-tag\">-m<\/span> \"<span class=\"hljs-selector-tag\">Hotfix<\/span> <span class=\"hljs-selector-tag\">v2<\/span><span class=\"hljs-selector-class\">.5<\/span><span class=\"hljs-selector-class\">.1<\/span>\"\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">push<\/span> <span class=\"hljs-selector-tag\">origin<\/span> <span class=\"hljs-selector-tag\">v2<\/span><span class=\"hljs-selector-class\">.5<\/span><span class=\"hljs-selector-class\">.1<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">32. Support branch and backport strategy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Support branches exist when old versions need fixes.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Fix in main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Backport to release\/3.0]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Backport to support\/2.x]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Backport to support\/1.9-lts]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Tag v3.0.4]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Tag v2.8.9]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Tag v1.9.17]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Backport decision table<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Change type<\/th><th>Backport?<\/th><\/tr><\/thead><tbody><tr><td>Security vulnerability<\/td><td>Yes<\/td><\/tr><tr><td>Data loss<\/td><td>Yes<\/td><\/tr><tr><td>Production crash<\/td><td>Usually yes<\/td><\/tr><tr><td>Compliance issue<\/td><td>Yes<\/td><\/tr><tr><td>Minor UI bug<\/td><td>Maybe<\/td><\/tr><tr><td>New feature<\/td><td>Usually no<\/td><\/tr><tr><td>Refactor<\/td><td>No<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Backport command<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">git checkout support\/2.x\ngit cherry-pick <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">fix-commit-sha<\/span>&gt;<\/span>\ngit push origin support\/2.x\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">33. Branching and CI\/CD<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Branches should trigger different CI\/CD behavior.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Branch pushed] --&gt; B{Branch type?}\n    B -- feature\/* --&gt; C&#91;Lint + unit test + build]\n    B -- main --&gt; D&#91;Full CI + deploy staging]\n    B -- release\/* --&gt; E&#91;Release validation]\n    B -- hotfix\/* --&gt; F&#91;Critical tests + fast checks]\n    B -- production --&gt; G&#91;Production deploy]\n    B -- support\/* --&gt; H&#91;Version-specific tests]\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Recommended pipeline behavior<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Branch<\/th><th>Pipeline<\/th><\/tr><\/thead><tbody><tr><td><code>feature\/*<\/code><\/td><td>lint, unit tests, build<\/td><\/tr><tr><td><code>bugfix\/*<\/code><\/td><td>lint, unit tests, build<\/td><\/tr><tr><td><code>main<\/code><\/td><td>full CI, integration tests, deploy lower env<\/td><\/tr><tr><td><code>release\/*<\/code><\/td><td>full regression\/release validation<\/td><\/tr><tr><td><code>hotfix\/*<\/code><\/td><td>critical CI, security check<\/td><\/tr><tr><td><code>support\/*<\/code><\/td><td>compatibility tests<\/td><\/tr><tr><td><code>production<\/code><\/td><td>deploy only from approved artifact<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">34. Branching and feature flags<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Feature flags are the secret weapon that lets teams keep branches short.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without flags:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Feature not ready \u2192 keep branch open for weeks\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">With flags:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Feature not ready \u2192 merge safely behind disabled flag\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Small feature branch]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Code behind feature flag]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Merge to main]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Deploy with flag OFF]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Enable internally]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Enable 10%]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Enable 100%]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Remove old flag]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Feature flag rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Every flag has an owner.<\/li>\n\n\n\n<li>Every flag has an expiry date.<\/li>\n\n\n\n<li>Critical flags are monitored.<\/li>\n\n\n\n<li>Old flags are removed.<\/li>\n\n\n\n<li>Flag changes are auditable.<\/li>\n\n\n\n<li>Flags should not become permanent configuration junk.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">35. Branching and database migrations<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Database migrations can destroy a beautiful branching strategy if handled badly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bad pattern<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Large feature branch changes schema for 3 weeks.\nMeanwhile main changes app behavior.\nRelease branch needs old schema.\nProduction hotfix now conflicts.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Safe pattern: expand \u2192 migrate \u2192 contract<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Expand schema]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Deploy backward-compatible app]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Backfill data]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Switch reads\/writes]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Contract old schema]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Rules<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Keep migrations small.<\/li>\n\n\n\n<li>Make schema changes backward compatible.<\/li>\n\n\n\n<li>Avoid destructive changes in the same release.<\/li>\n\n\n\n<li>Do not hide database changes inside huge PRs.<\/li>\n\n\n\n<li>Include rollback or fix-forward plan.<\/li>\n\n\n\n<li>Test old app + new schema and new app + old schema where needed.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">36. Branching strategy for Infrastructure as Code<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Infrastructure changes need stronger guardrails than normal app code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended branch model<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\nbugfix\/*\nhotfix\/*\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Usually avoid long-lived environment branches unless there is a very clear reason.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Create infra branch]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Edit Terraform\/Pulumi]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Format + validate]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Plan]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Security scan]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Cost\/blast-radius review]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Approval]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Merge]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Apply via pipeline]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">IaC PR must include<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>plan summary<\/li>\n\n\n\n<li>resources created<\/li>\n\n\n\n<li>resources changed<\/li>\n\n\n\n<li>resources destroyed<\/li>\n\n\n\n<li>security impact<\/li>\n\n\n\n<li>cost impact<\/li>\n\n\n\n<li>blast radius<\/li>\n\n\n\n<li>rollback plan<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Dangerous plan keywords<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">destroy\nreplace\nforces replacement\n<span class=\"hljs-number\">0.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span>\/<span class=\"hljs-number\">0<\/span>\npublic access\n<span class=\"hljs-keyword\">delete<\/span> database\ndisable encryption\nremove backup\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">37. Branching strategy for Kubernetes GitOps<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For Kubernetes GitOps, avoid making branches too clever.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended model<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Repository layout:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">clusters\/\n  dev\/\n  staging\/\n  production\/\napps\/\n  auth\/\n  payment\/\n  notification\/\nplatform\/\n  ingress\/\n  monitoring\/\n  security\/\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Promotion flow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;App PR merged]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Build image]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Update dev manifest]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Promote same image to staging]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Promote same image to production]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Argo CD \/ Flux sync]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">GitOps rule<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Git is desired state.\nProduction changes happen through reviewed Git changes.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">38. Branching strategy for microservices<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Microservices should not rely on branches to coordinate compatibility.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>backward-compatible APIs<\/li>\n\n\n\n<li>contract tests<\/li>\n\n\n\n<li>versioned endpoints<\/li>\n\n\n\n<li>feature flags<\/li>\n\n\n\n<li>independent deployment<\/li>\n\n\n\n<li>consumer-driven testing<\/li>\n\n\n\n<li>observability<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Bad microservice branching<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">service-a feature branch waits for service-b feature branch waits for service-c feature branch\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This creates distributed merge hell.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Better<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Service A change]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Backward-compatible API]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Contract tests]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Deploy Service A]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Monitor consumers]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Gradual rollout]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">39. Branching strategy for monorepos<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For monorepos, prefer:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nshort-lived feature branches\ntrunk-based development\nCODEOWNERS\npath-based CI\naffected-project builds\nfeature flags\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Monorepo branch flow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Change in repo]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Detect changed paths]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Find affected services\/packages]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Run targeted CI]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Request CODEOWNERS review]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Merge to main]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Build\/deploy affected artifacts]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Monorepo warning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Long-lived branches in monorepos are extra painful because many teams are modifying the same tree.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">40. Branching strategy for mobile apps<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Mobile apps often need release branches.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\nrelease\/ios-5.0.0\nrelease\/android-5.0.0\nhotfix\/*\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Mobile release flow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;release\/mobile-5.0.0]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;QA]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;App store submission]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Approval]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Staged rollout]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;tag v5.0.0]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Release branch receives stabilization fixes only.<\/li>\n\n\n\n<li>Tags must match shipped builds.<\/li>\n\n\n\n<li>APIs must remain backward compatible because old app versions stay in the wild.<\/li>\n\n\n\n<li>Hotfixes may require patch release branches.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">41. Branching strategy for libraries and SDKs<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Libraries need stronger version discipline.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nrelease\/*\nsupport\/*\nhotfix\/*\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use Semantic Versioning.<\/li>\n\n\n\n<li>Tag every release.<\/li>\n\n\n\n<li>Maintain changelog.<\/li>\n\n\n\n<li>Backport critical fixes.<\/li>\n\n\n\n<li>Breaking changes require major version.<\/li>\n\n\n\n<li>Support branches exist for old major versions if needed.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Example<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main              \u2192 v4 development\nsupport\/3.x       \u2192 v3 patches\nsupport\/2.x-lts   \u2192 v2 long-term support\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">42. Branching strategy for regulated systems<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Regulated systems need traceability.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nrelease\/*\nhotfix\/*\nsupport\/*\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Required controls<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>protected branches<\/li>\n\n\n\n<li>required reviewers<\/li>\n\n\n\n<li>CODEOWNERS<\/li>\n\n\n\n<li>required CI<\/li>\n\n\n\n<li>release tags<\/li>\n\n\n\n<li>deployment evidence<\/li>\n\n\n\n<li>rollback plan<\/li>\n\n\n\n<li>audit logs<\/li>\n\n\n\n<li>signed commits if required<\/li>\n\n\n\n<li>change ticket linkage<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Ticket]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Branch]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Commit]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;PR approval]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;CI result]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Release tag]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Deployment record]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Audit trail]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">43. Branch by abstraction<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Branch by abstraction is how advanced teams avoid long-running branches during large changes.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Old implementation]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Create abstraction]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Route old implementation through abstraction]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Add new implementation behind flag]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Migrate callers gradually]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Remove old implementation]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Example<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">feature\/<span class=\"hljs-keyword\">new<\/span>-payment-provider lives <span class=\"hljs-keyword\">for<\/span> <span class=\"hljs-number\">2<\/span> months\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">PR <span class=\"hljs-number\">1<\/span>: add PaymentProvider interface\nPR <span class=\"hljs-number\">2<\/span>: route old provider through interface\nPR <span class=\"hljs-number\">3<\/span>: add <span class=\"hljs-keyword\">new<\/span> provider behind flag\nPR <span class=\"hljs-number\">4<\/span>: migrate one flow\nPR <span class=\"hljs-number\">5<\/span>: migrate all flows\nPR <span class=\"hljs-number\">6<\/span>: remove old provider\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This keeps branches short and integration continuous.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">44. Stacked branches<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Stacked branches split large work into dependent PRs.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"main\"<\/span>\n    branch pr<span class=\"hljs-number\">-1<\/span>-abstraction\n    checkout pr<span class=\"hljs-number\">-1<\/span>-abstraction\n    commit id: <span class=\"hljs-string\">\"abstraction\"<\/span>\n    branch pr<span class=\"hljs-number\">-2<\/span>-api\n    checkout pr<span class=\"hljs-number\">-2<\/span>-api\n    commit id: <span class=\"hljs-string\">\"api\"<\/span>\n    branch pr<span class=\"hljs-number\">-3<\/span>-ui\n    checkout pr<span class=\"hljs-number\">-3<\/span>-ui\n    commit id: <span class=\"hljs-string\">\"ui\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Use stacked branches when<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>work has natural layers<\/li>\n\n\n\n<li>each layer can be reviewed separately<\/li>\n\n\n\n<li>one giant PR would be terrible<\/li>\n\n\n\n<li>changes can land progressively<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Risk<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Stacked branches require careful rebasing and clear communication.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">45. Branching anti-patterns<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 1: Long-lived feature branches<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">feature\/<span class=\"hljs-keyword\">new<\/span>-platform lives <span class=\"hljs-keyword\">for<\/span> <span class=\"hljs-number\">3<\/span> months\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>huge merge conflicts<\/li>\n\n\n\n<li>hidden integration bugs<\/li>\n\n\n\n<li>delayed feedback<\/li>\n\n\n\n<li>big-bang release risk<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>split work<\/li>\n\n\n\n<li>use feature flags<\/li>\n\n\n\n<li>use branch by abstraction<\/li>\n\n\n\n<li>merge small pieces frequently<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 2: <code>develop<\/code> as a dumping ground<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main is stable\ndevelop is chaos\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>develop<\/code> always broken<\/li>\n\n\n\n<li>releases start from unstable base<\/li>\n\n\n\n<li>nobody owns quality<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>protect <code>develop<\/code><\/li>\n\n\n\n<li>require CI<\/li>\n\n\n\n<li>keep it green<\/li>\n\n\n\n<li>remove it if not needed<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 3: Environment branches with direct fixes<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">production branch has hotfix\nstaging branch does not\nmain does not\nnobody remembers\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>hotfix branch from production<\/li>\n\n\n\n<li>merge\/cherry-pick back<\/li>\n\n\n\n<li>automate branch comparison<\/li>\n\n\n\n<li>never let production become secret code<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 4: Release branch becomes a feature branch<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">release\/<span class=\"hljs-number\">2.0<\/span> gets <span class=\"hljs-keyword\">new<\/span> dashboard feature\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Release branches accept stabilization only.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 5: No branch deletion<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">600 remote branches\nnobody knows what matters\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>auto-delete merged branches<\/li>\n\n\n\n<li>prune stale branches<\/li>\n\n\n\n<li>archive old release branches deliberately<\/li>\n\n\n\n<li>review stale branches monthly<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 6: Branching instead of feature flags<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Keep code unmerged for weeks because feature is not ready.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Merge safely behind disabled feature flag.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">46. Branching metrics<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Measure your branching strategy.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Metric<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Average branch age<\/td><td>Integration delay<\/td><\/tr><tr><td>Stale branch count<\/td><td>Repository hygiene<\/td><\/tr><tr><td>PR size<\/td><td>Review quality<\/td><\/tr><tr><td>PR cycle time<\/td><td>Delivery speed<\/td><\/tr><tr><td>Merge conflict frequency<\/td><td>Branch drift<\/td><\/tr><tr><td>CI failure rate<\/td><td>Quality health<\/td><\/tr><tr><td>Revert rate<\/td><td>Change risk<\/td><\/tr><tr><td>Hotfix frequency<\/td><td>Release quality<\/td><\/tr><tr><td>Deployment frequency<\/td><td>Delivery maturity<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Healthy signals<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">feature branches live 1\u20133 days\nPRs are small\nmain is green\nstale branches are low\nhotfix rate is decreasing\nrollback is fast\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">47. Branching commands cheat sheet<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Create feature branch<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout main\ngit pull --ff-only origin main\ngit checkout -b feature\/add-search\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Push branch<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git push -u origin feature\/add-search\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Update branch from main<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Merge option:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git fetch origin\ngit merge origin\/main\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Rebase option:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git fetch origin\ngit rebase origin\/main\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Delete branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Local:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git branch -d feature\/add-search\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Remote:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git push origin --<span class=\"hljs-keyword\">delete<\/span> feature\/add-search\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">List branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git branch\ngit branch -a\ngit branch --merged\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Prune deleted remote branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git fetch --prune\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Create release branch<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout main\ngit pull --ff-only origin main\ngit checkout -b release\/2.5.0\ngit push -u origin release\/2.5.0\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Create hotfix branch<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout main\ngit pull --ff-only origin main\ngit checkout -b hotfix\/2.5.1-payment-crash\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">48. Company-ready branching policy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this as a strong default.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Branching Strategy Policy\n\n<span class=\"hljs-number\">1.<\/span> main is the primary integration branch.\n<span class=\"hljs-number\">2.<\/span> main must always be healthy and releasable.\n<span class=\"hljs-number\">3.<\/span> Direct push to main is not allowed.\n<span class=\"hljs-number\">4.<\/span> All changes must go through pull requests or merge requests.\n<span class=\"hljs-number\">5.<\/span> CI must pass before merge.\n<span class=\"hljs-number\">6.<\/span> At least one approval is required.\n<span class=\"hljs-number\">7.<\/span> CODEOWNERS approval is required <span class=\"hljs-keyword\">for<\/span> critical paths.\n<span class=\"hljs-number\">8.<\/span> Feature branches must be short-lived.\n<span class=\"hljs-number\">9.<\/span> Release branches are created only <span class=\"hljs-keyword\">for<\/span> release stabilization.\n<span class=\"hljs-number\">10.<\/span> Hotfix branches are created only <span class=\"hljs-keyword\">for<\/span> production incidents.\n<span class=\"hljs-number\">11.<\/span> Support branches are created only <span class=\"hljs-keyword\">for<\/span> maintained old versions.\n<span class=\"hljs-number\">12.<\/span> Every production release must be tagged.\n<span class=\"hljs-number\">13.<\/span> Branches must be deleted after merge.\n<span class=\"hljs-number\">14.<\/span> Stale branches must be reviewed regularly.\n<span class=\"hljs-number\">15.<\/span> Secrets must never be committed.\n<span class=\"hljs-number\">16.<\/span> Infrastructure and database changes <span class=\"hljs-built_in\">require<\/span> explicit review.\n<span class=\"hljs-number\">17.<\/span> Rollback strategy must be known before production deployment.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">49. One-page branching standard<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\nbugfix\/*\nhotfix\/*\nrelease\/*\nsupport\/* only when needed\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Merge rules<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">feature\/* \u2192 main through PR\nbugfix\/* \u2192 main through PR\nhotfix\/* \u2192 main\/release\/support through emergency PR\nrelease\/* \u2192 main and tag\nsupport\/* \u2192 patch releases only\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Protection rules<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">main<\/span>: protected\n<span class=\"hljs-attribute\">release\/*<\/span>: protected\n<span class=\"hljs-attribute\">support\/*<\/span>: protected\n<span class=\"hljs-attribute\">hotfix\/*<\/span>: fast review\n<span class=\"hljs-attribute\">feature\/*<\/span>: normal review\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Tagging rules<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Production release: tag required\nHotfix release: patch tag required\nLibrary release: SemVer tag required\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Deletion rules<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Merged feature branches: <span class=\"hljs-keyword\">delete<\/span>\nMerged bugfix branches: <span class=\"hljs-keyword\">delete<\/span>\nOld release branches: archive or <span class=\"hljs-keyword\">delete<\/span> based on policy\nSupport branches: keep <span class=\"hljs-keyword\">while<\/span> version is supported\nExperiment branches: <span class=\"hljs-keyword\">delete<\/span> quickly\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">50. Final branching blueprint<\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Work item] --&gt; B{Type of work?}\n    B -- Feature --&gt; C&#91;feature\/* from main]\n    B -- Bugfix --&gt; D&#91;bugfix\/* from main]\n    B -- Production incident --&gt; E&#91;hotfix\/* from production tag\/main]\n    B -- Release stabilization --&gt; F&#91;release\/*]\n    B -- Old version fix --&gt; G&#91;support\/*]\n\n    C --&gt; H&#91;PR + CI + review]\n    D --&gt; H\n    E --&gt; I&#91;Emergency PR + critical CI]\n    F --&gt; J&#91;QA + fixes only]\n    G --&gt; K&#91;Backport PR]\n\n    H --&gt; L&#91;Merge to main]\n    I --&gt; L\n    I --&gt; M&#91;Backport if needed]\n    J --&gt; N&#91;Tag release]\n    K --&gt; O&#91;Tag patch release]\n\n    L --&gt; P&#91;Build artifact]\n    N --&gt; P\n    O --&gt; P\n    P --&gt; Q&#91;Deploy \/ release]\n    Q --&gt; R&#91;Observe]\n    R --&gt; S{Issue?}\n    S -- Yes --&gt; E\n    S -- No --&gt; T&#91;Done]\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">51. Final recommendation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For most teams, the best practical strategy is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Protected<\/span> main\nShort-lived feature branches\nPull requests \/ merge requests\nRequired CI\nRequired review\nSquash merge <span class=\"hljs-keyword\">for<\/span> normal work\nRelease branches only when needed\nHotfix branches <span class=\"hljs-keyword\">for<\/span> production emergencies\nTags <span class=\"hljs-keyword\">for<\/span> production releases\nFeature flags <span class=\"hljs-keyword\">for<\/span> incomplete work\nBranch cleanup after merge\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-59\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then evolve toward trunk-based development when your team has:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>fast CI<\/li>\n\n\n\n<li>strong automated tests<\/li>\n\n\n\n<li>small PR culture<\/li>\n\n\n\n<li>feature flags<\/li>\n\n\n\n<li>reliable rollback<\/li>\n\n\n\n<li>strong observability<\/li>\n\n\n\n<li>mature review habits<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Final principle:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Branches should reduce risk, not create bureaucracy.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A branch is valuable only if it helps with one of these:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>safe collaboration<\/li>\n\n\n\n<li>clean review<\/li>\n\n\n\n<li>controlled release<\/li>\n\n\n\n<li>emergency repair<\/li>\n\n\n\n<li>old-version support<\/li>\n\n\n\n<li>environment promotion<\/li>\n\n\n\n<li>production traceability<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If a branch does not do any of those things, simplify the model.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>From Beginner to Advanced: A Complete One-Stop Guide to Choosing, Designing, and Governing Branches 1. What is a branching strategy? A branching strategy is a team\u2019s rulebook&#8230; <\/p>\n","protected":false},"author":1,"featured_media":77515,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-77514","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=77514"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77514\/revisions"}],"predecessor-version":[{"id":77516,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77514\/revisions\/77516"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/77515"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=77514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=77514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=77514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}