{"id":77508,"date":"2026-07-07T02:14:57","date_gmt":"2026-07-07T02:14:57","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=77508"},"modified":"2026-07-07T02:14:59","modified_gmt":"2026-07-07T02:14:59","slug":"source-control-branching-model-master-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/source-control-branching-model-master-tutorial\/","title":{"rendered":"Source Control Branching Model Master Tutorial"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">From Beginner to Advanced: A Complete One-Stop Guide for Designing Branching Strategies<\/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 source control branching model?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>source control branching model<\/strong> is the agreed structure and rule system for creating, using, merging, releasing, and deleting branches in a source control repository.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It defines:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Which branch represents production.<\/li>\n\n\n\n<li>Where developers create new work.<\/li>\n\n\n\n<li>How long branches live.<\/li>\n\n\n\n<li>How code moves between branches.<\/li>\n\n\n\n<li>When release branches are created.<\/li>\n\n\n\n<li>How hotfixes are handled.<\/li>\n\n\n\n<li>How environments map to source control.<\/li>\n\n\n\n<li>Who can merge into important branches.<\/li>\n\n\n\n<li>What automation must pass before merge.<\/li>\n\n\n\n<li>How to keep the repository clean, safe, and releasable.<\/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\">A branching model is the traffic system for source code.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Without it, everyone drives wherever they want. With it, teams know exactly where changes enter, where they are reviewed, where they are released, and how production is protected.<\/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 model vs Git workflow vs version control workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">These terms are related, but not identical.<\/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>Version control system<\/strong><\/td><td>Tool used to track changes<\/td><td>Git, SVN, Mercurial, Perforce<\/td><\/tr><tr><td><strong>Source control workflow<\/strong><\/td><td>Full process from change to release<\/td><td>Branch \u2192 PR \u2192 CI \u2192 merge \u2192 deploy<\/td><\/tr><tr><td><strong>Branching model<\/strong><\/td><td>Branch structure and merge rules<\/td><td>Gitflow, trunk-based, GitHub Flow<\/td><\/tr><tr><td><strong>Release model<\/strong><\/td><td>How code becomes a version or deployment<\/td><td>Tags, release branches, GitOps promotion<\/td><\/tr><tr><td><strong>Review model<\/strong><\/td><td>How changes are approved<\/td><td>PR, MR, changelist, CODEOWNERS<\/td><\/tr><tr><td><strong>Deployment model<\/strong><\/td><td>How code reaches environments<\/td><td>CI\/CD, GitOps, manual promotion<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A branching model is one major part of the wider source control workflow.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Why branching models exist<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A repository is not just a folder of code. It is a collaboration system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Branching models solve these problems:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Multiple developers working at the same time.<\/li>\n\n\n\n<li>Features taking different amounts of time.<\/li>\n\n\n\n<li>Production needing stability.<\/li>\n\n\n\n<li>Bugs needing emergency fixes.<\/li>\n\n\n\n<li>Releases needing version control.<\/li>\n\n\n\n<li>Some work needing review before merge.<\/li>\n\n\n\n<li>Some changes being too risky to ship immediately.<\/li>\n\n\n\n<li>Older versions needing support.<\/li>\n\n\n\n<li>CI\/CD needing a predictable source of truth.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Git\u2019s official documentation describes branches as a normal part of real-world workflows, including creating branches for work, switching to a hotfix when needed, and merging changes 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 branch is not the goal<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A beginner asks:<\/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\">Which branch should I create?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">A senior engineer asks:<\/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\">What risk am I isolating?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">An architect asks:<\/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\">What delivery system are we designing?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Branches are not decoration. Every branch should have a reason.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">flowchart TD\n    A&#91;Need to isolate work?] --&gt; B&#91;Create branch]\n    B --&gt; C&#91;Review branch purpose]\n    C --&gt; D{Does <span class=\"hljs-keyword\">this<\/span> branch protect speed, quality, release, or production?}\n    D -- Yes --&gt; E&#91;Valid branch]\n    D -- No --&gt; F&#91;Unnecessary complexity]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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\">5. The five core purposes of branches<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Every branch usually exists for one of five reasons.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Branch purpose<\/th><th>What it protects<\/th><th>Example branch<\/th><\/tr><\/thead><tbody><tr><td><strong>Development isolation<\/strong><\/td><td>Unfinished work<\/td><td><code>feature\/add-login<\/code><\/td><\/tr><tr><td><strong>Integration<\/strong><\/td><td>Shared team work<\/td><td><code>main<\/code>, <code>develop<\/code><\/td><\/tr><tr><td><strong>Release stabilization<\/strong><\/td><td>Version quality<\/td><td><code>release\/2.1.0<\/code><\/td><\/tr><tr><td><strong>Production repair<\/strong><\/td><td>Emergency fixes<\/td><td><code>hotfix\/payment-crash<\/code><\/td><\/tr><tr><td><strong>Environment promotion<\/strong><\/td><td>Deployment stages<\/td><td><code>staging<\/code>, <code>production<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If a branch does not serve one of these purposes, question whether it should exist.<\/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 Main branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The main branch is the primary integration line.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common names:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nmaster\ntrunk\nmainline\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Modern teams usually use <code>main<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In trunk-based development, the primary branch is commonly called trunk, main, or mainline, and developers integrate frequently into it while 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\">A feature branch isolates new work.<\/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\">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-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\">Feature branches should be short-lived. The longer they live, the higher the merge risk.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" 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;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 + 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;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-3\"><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<h2 class=\"wp-block-heading\">6.3 Bugfix branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A bugfix branch fixes a normal defect that is not an emergency production incident.<\/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\">A hotfix branch fixes a production issue urgently.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">hotfix\/payment-crash\nhotfix\/prod-login-failure\nhotfix\/security-token-leak\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Hotfix branches should be:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>short-lived<\/li>\n\n\n\n<li>minimal<\/li>\n\n\n\n<li>reviewed quickly<\/li>\n\n\n\n<li>tested with critical checks<\/li>\n\n\n\n<li>merged back into all relevant active branches<\/li>\n\n\n\n<li>tagged if they create a production release<\/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\">6.5 Release branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A release branch stabilizes a version before it is shipped.<\/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:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>QA needs time.<\/li>\n\n\n\n<li>Production release is scheduled.<\/li>\n\n\n\n<li>App store approval exists.<\/li>\n\n\n\n<li>Enterprise customers require versioned packages.<\/li>\n\n\n\n<li>You support multiple versions.<\/li>\n\n\n\n<li>Not every merged change should ship immediately.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">AWS Prescriptive Guidance describes Gitflow as a model that works well for scheduled release cycles where features are collected into a release and moved through development, release, and production 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.6 Support branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A support branch maintains an older version.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">support\/1.0\nsupport\/2.4-lts\nmaintenance\/2025-lts\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use support branches when customers cannot upgrade immediately or when you maintain long-term support versions.<\/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 Experiment branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">An experiment branch is for temporary exploration.<\/p>\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\">experiment\/<span class=\"hljs-keyword\">new<\/span>-cache-engine\nspike\/oauth-provider-test\nprototype\/<span class=\"hljs-keyword\">new<\/span>-dashboard\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\">Experiment branches must have an expiry. Otherwise, they become branch graveyards.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6.8 Environment branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Environment branches map branches to deployment 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 documents branch-per-environment as one possible branching strategy, alongside web-service and long-lived release-branch models.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Environment branches can work, but they can also become messy if teams randomly merge between them without strict promotion rules.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Branch lifespan: the most important hidden factor<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The biggest branching model mistake is not choosing Gitflow or trunk-based development.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The biggest mistake is letting branches live too long.<\/p>\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 lifetime vs integration 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\">\"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\">20<\/span>, <span class=\"hljs-number\">40<\/span>, <span class=\"hljs-number\">70<\/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\">This is a conceptual risk model. The practical lesson is simple:<\/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\">Long-lived branches delay integration pain. They do not remove it.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. The golden branching rule<\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">The more frequently you integrate, the less painful integration becomes.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development strongly emphasizes short-lived branches or direct-to-trunk commits, with feature branches coming back quickly as pull requests into trunk\/main.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Branching model maturity levels<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" 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\">L1<\/span><span class=\"hljs-selector-attr\">&#91;Level 1: No model]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L2<\/span><span class=\"hljs-selector-attr\">&#91;Level 2: Main branch only]<\/span>\n    <span class=\"hljs-selector-tag\">L2<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L3<\/span><span class=\"hljs-selector-attr\">&#91;Level 3: Feature branches]<\/span>\n    <span class=\"hljs-selector-tag\">L3<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L4<\/span><span class=\"hljs-selector-attr\">&#91;Level 4: Pull requests]<\/span>\n    <span class=\"hljs-selector-tag\">L4<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L5<\/span><span class=\"hljs-selector-attr\">&#91;Level 5: Protected main]<\/span>\n    <span class=\"hljs-selector-tag\">L5<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L6<\/span><span class=\"hljs-selector-attr\">&#91;Level 6: CI gates]<\/span>\n    <span class=\"hljs-selector-tag\">L6<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L7<\/span><span class=\"hljs-selector-attr\">&#91;Level 7: Release \/ hotfix branches]<\/span>\n    <span class=\"hljs-selector-tag\">L7<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L8<\/span><span class=\"hljs-selector-attr\">&#91;Level 8: Feature flags]<\/span>\n    <span class=\"hljs-selector-tag\">L8<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L9<\/span><span class=\"hljs-selector-attr\">&#91;Level 9: Trunk-based or GitOps maturity]<\/span>\n    <span class=\"hljs-selector-tag\">L9<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L10<\/span><span class=\"hljs-selector-attr\">&#91;Level 10: Enterprise branch governance]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Level<\/th><th>Behavior<\/th><th>Risk<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>No branch rules<\/td><td>Extreme<\/td><\/tr><tr><td>2<\/td><td>Everyone pushes to main<\/td><td>High<\/td><\/tr><tr><td>3<\/td><td>Feature branches exist<\/td><td>Medium-high<\/td><\/tr><tr><td>4<\/td><td>Pull requests required<\/td><td>Medium<\/td><\/tr><tr><td>5<\/td><td>Main branch protected<\/td><td>Lower<\/td><\/tr><tr><td>6<\/td><td>CI required<\/td><td>Low<\/td><\/tr><tr><td>7<\/td><td>Release\/hotfix process exists<\/td><td>Lower<\/td><\/tr><tr><td>8<\/td><td>Feature flags reduce release risk<\/td><td>Low<\/td><\/tr><tr><td>9<\/td><td>Frequent integration and automated deploy<\/td><td>Very low<\/td><\/tr><tr><td>10<\/td><td>Audited, governed, measurable<\/td><td>Enterprise-grade<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub branch protection rules can enforce workflows such as required approvals and passing status checks before pull requests merge into protected branches.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. The major source control branching models<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The common models are:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Mainline model<\/li>\n\n\n\n<li>Feature branch model<\/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 model<\/li>\n\n\n\n<li>Environment branch model<\/li>\n\n\n\n<li>Fork-based model<\/li>\n\n\n\n<li>GitOps branching model<\/li>\n\n\n\n<li>Monorepo branching model<\/li>\n\n\n\n<li>Support\/LTS branching model<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mindmap\n  root((Branching Models))\n    Mainline\n    Feature Branch\n    GitHub Flow\n    GitLab Flow\n    Gitflow\n    Trunk Based\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\">11. Model 1: Mainline branching model<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The mainline model uses one primary 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\">How it works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Developers commit directly to <code>main<\/code>, or very small branches are merged quickly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Solo projects<\/li>\n\n\n\n<li>Tiny teams<\/li>\n\n\n\n<li>Prototypes<\/li>\n\n\n\n<li>Learning repositories<\/li>\n\n\n\n<li>Internal scripts<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Bad for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Large teams<\/li>\n\n\n\n<li>Production-critical systems<\/li>\n\n\n\n<li>Regulated environments<\/li>\n\n\n\n<li>Slow CI<\/li>\n\n\n\n<li>Weak review culture<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Rules if you use it<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>main<\/code> must always build.<\/li>\n\n\n\n<li>Pull before work.<\/li>\n\n\n\n<li>Push small commits.<\/li>\n\n\n\n<li>Use CI.<\/li>\n\n\n\n<li>Use tags for important versions.<\/li>\n\n\n\n<li>Avoid direct production deploys without validation.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Verdict<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mainline is simple, but without protection it becomes dangerous quickly.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. Model 2: Feature branch model<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each feature, bug, or task gets a temporary branch.<\/p>\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\">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    branch bugfix\/payment-timeout\n    checkout bugfix\/payment-timeout\n    commit id: <span class=\"hljs-string\">\"fix-1\"<\/span>\n    checkout main\n    merge feature\/login\n    merge bugfix\/payment-timeout\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\">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\">Process<\/h2>\n\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\">flowchart TD\n    A&#91;Start <span class=\"hljs-keyword\">from<\/span> main] --&gt; B&#91;Create feature branch]\n    B --&gt; C&#91;Commit changes]\n    C --&gt; D&#91;Push branch]\n    D --&gt; E&#91;Open PR \/ MR]\n    E --&gt; F&#91;CI checks]\n    E --&gt; G&#91;Code review]\n    F --&gt; H{Pass?}\n    G --&gt; I{Approved?}\n    H -- No --&gt; C\n    I -- No --&gt; C\n    H -- Yes --&gt; J&#91;Merge to main]\n    I -- Yes --&gt; J\n    J --&gt; K&#91;Delete branch]\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\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Most modern software teams<\/li>\n\n\n\n<li>Backend services<\/li>\n\n\n\n<li>Frontend apps<\/li>\n\n\n\n<li>DevOps repositories<\/li>\n\n\n\n<li>Infrastructure as Code<\/li>\n\n\n\n<li>Teams still maturing toward trunk-based development<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Benefits<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Easy to understand.<\/li>\n\n\n\n<li>Isolates work.<\/li>\n\n\n\n<li>Supports pull requests.<\/li>\n\n\n\n<li>Keeps <code>main<\/code> protected.<\/li>\n\n\n\n<li>Works well with CI\/CD.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Risks<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Feature branches can become long-lived.<\/li>\n\n\n\n<li>Big branches create painful conflicts.<\/li>\n\n\n\n<li>Developers may delay integration.<\/li>\n\n\n\n<li>Reviews become too large.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Policy<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Feature branches should live for hours or days, not weeks.\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\">13. Model 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: create a branch, make commits, open a pull request, review, merge, and deploy. GitHub\u2019s own documentation describes GitHub Flow as a lightweight branch-based workflow.<\/p>\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;Create branch from main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Commit changes]<\/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;Discuss and 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;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-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\">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\n<p class=\"wp-block-paragraph\"><code>main<\/code> is always deployable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Web apps<\/li>\n\n\n\n<li>SaaS<\/li>\n\n\n\n<li>APIs<\/li>\n\n\n\n<li>Documentation repos<\/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 apps with store approval<\/li>\n\n\n\n<li>Desktop software<\/li>\n\n\n\n<li>Firmware<\/li>\n\n\n\n<li>Products with long QA cycles<\/li>\n\n\n\n<li>Teams supporting many old versions<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Example branch policy<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Branch<\/th><th>Rule<\/th><\/tr><\/thead><tbody><tr><td><code>main<\/code><\/td><td>Protected, always deployable<\/td><\/tr><tr><td><code>feature\/*<\/code><\/td><td>Short-lived, PR required<\/td><\/tr><tr><td><code>hotfix\/*<\/code><\/td><td>Emergency production fix<\/td><\/tr><tr><td><code>release\/*<\/code><\/td><td>Optional, only if needed<\/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\">14. Model 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 combines feature branches and merge requests with issue tracking, production branches, environment branches, or release branches. 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-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\">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-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\">Common GitLab Flow patterns<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Pattern 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\">Pattern B: Main + 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\">Pattern C: Main + 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 says branching and code-management strategies depend on product needs and lists major categories such as web services, long-lived release branches, and branch-per-environment models.<\/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>Teams needing environment promotion<\/li>\n\n\n\n<li>Teams that want more structure than GitHub Flow<\/li>\n\n\n\n<li>Enterprise web services<\/li>\n\n\n\n<li>Projects with production\/stable branches<\/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 sits nicely between lightweight GitHub Flow and heavier Gitflow.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Model 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 branches and supporting 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 a branching model that uses feature branches and multiple primary branches; it is more branch-heavy than trunk-based development.<\/p>\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\">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-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<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>Stabilization before release<\/td><\/tr><tr><td><code>hotfix\/*<\/code><\/td><td>Emergency production fix<\/td><\/tr><tr><td><code>support\/*<\/code><\/td><td>Optional older-version maintenance<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Gitflow lifecycle<\/h2>\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;develop]<\/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;release 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;main]<\/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;tag version]<\/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;hotfix branch]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/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\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Versioned software<\/li>\n\n\n\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>Products with scheduled release trains<\/li>\n\n\n\n<li>Teams that need formal stabilization<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Weaknesses<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>More branches to manage.<\/li>\n\n\n\n<li><code>develop<\/code> can become unstable.<\/li>\n\n\n\n<li>Long-lived branches increase conflict risk.<\/li>\n\n\n\n<li>Slower than trunk-based development.<\/li>\n\n\n\n<li>Overkill for many web services.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Practical rule<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use Gitflow only when release management complexity is real.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do not use Gitflow just because it sounds professional.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Model 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 is a branching model where developers integrate small changes into a single shared trunk\/main branch frequently. The trunk-based development reference site argues against long-running branches and supports direct-to-trunk or short-lived pull-request branches.<\/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\">\"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-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\">Branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nshort-lived\/*\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Some very mature teams may commit directly to trunk, but many modern teams still use short-lived PR branches.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Key rule<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Branches are temporary. Trunk is the center of gravity.\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>SaaS<\/li>\n\n\n\n<li>APIs<\/li>\n\n\n\n<li>high-performing teams<\/li>\n\n\n\n<li>monorepos<\/li>\n\n\n\n<li>platform teams<\/li>\n\n\n\n<li>teams with strong CI\/CD<\/li>\n\n\n\n<li>teams using feature flags<\/li>\n\n\n\n<li>teams doing continuous delivery<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Required practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Small changes<\/li>\n\n\n\n<li>Fast CI<\/li>\n\n\n\n<li>Strong automated tests<\/li>\n\n\n\n<li>Feature flags<\/li>\n\n\n\n<li>Quick code review<\/li>\n\n\n\n<li>Easy rollback<\/li>\n\n\n\n<li>Main branch always healthy<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Feature flags are critical<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Feature flags separate merge from release.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" 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;Code merged to main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Feature flag OFF]<\/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;Deploy safely]<\/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;Enable internally]<\/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 10%]<\/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 100%]<\/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\">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\">Trunk-based warning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development is not \u201ceveryone randomly pushes to main.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Real trunk-based development is disciplined, automated, and tested.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. Model 7: Release branch model<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The release branch model creates a branch for each release line.<\/p>\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<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" 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.0<\/span>\n    checkout release\/<span class=\"hljs-number\">2.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.0<\/span>\n    commit id: <span class=\"hljs-string\">\"release-ready\"<\/span> tag: <span class=\"hljs-string\">\"v2.0.0\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><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 stabilization<\/li>\n\n\n\n<li>release candidates<\/li>\n\n\n\n<li>certification cycles<\/li>\n\n\n\n<li>mobile releases<\/li>\n\n\n\n<li>enterprise product releases<\/li>\n\n\n\n<li>long-lived customer versions<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Rules<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Allowed on release branch:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>bug fixes<\/li>\n\n\n\n<li>release notes<\/li>\n\n\n\n<li>version bumps<\/li>\n\n\n\n<li>stabilization changes<\/li>\n\n\n\n<li>documentation corrections<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Not allowed:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>new features<\/li>\n\n\n\n<li>major refactors<\/li>\n\n\n\n<li>risky dependency upgrades<\/li>\n\n\n\n<li>unrelated cleanup<\/li>\n\n\n\n<li>experimental changes<\/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\">18. Model 8: Environment branch model<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each branch represents an environment.<\/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-18\" 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\/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-18\"><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 branch-triggered deployments<\/li>\n\n\n\n<li>GitLab-style environment promotion<\/li>\n\n\n\n<li>small teams with strict promotion discipline<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Common problem<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Environment branches drift.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">staging has changes that production does not have\nproduction has hotfixes that staging does not have\nmain has future work that neither has\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This becomes confusing quickly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Better modern alternative<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main branch + environment folders + promotion 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\">19. Model 9: Fork-based branching model<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">External contributors fork the repository, work in their own fork, and submit pull requests back to the upstream repository.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" 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-19\"><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>public repositories<\/li>\n\n\n\n<li>vendor contributions<\/li>\n\n\n\n<li>cases where contributors should not have write access<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Common branch structure<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Contributor fork:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/fix-readme\nbugfix\/api-timeout\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Upstream repository:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nrelease\/*\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. Model 10: GitOps branching model<\/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 of infrastructure or deployment configuration.<\/p>\n\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;Application 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;Update GitOps repo]<\/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;Argo CD \/ Flux]<\/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;Kubernetes cluster]<\/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\">Common GitOps structures<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Option A: Directory per environment<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">clusters\/\n  dev\/\n  staging\/\n  production\/\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Option B: Branch per environment<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">env\/dev\nenv\/staging\nenv\/production\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Option C: Directory per cluster<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">clusters\/\n  ap-northeast-1-dev\/\n  ap-northeast-1-prod\/\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 teams:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" 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\">folders<\/span> <span class=\"hljs-title\">per<\/span> <span class=\"hljs-title\">environment<\/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\">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 avoids messy environment branch drift.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. Model 11: Monorepo branching model<\/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 projects 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 model<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For monorepos, trunk-based development often works best.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nshort-lived feature branches\nCODEOWNERS\npath-based CI\nfeature flags\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Why?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Long-lived branches in monorepos become painful because many teams modify the same 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\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Monorepo change]<\/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;Run affected 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;Request CODEOWNERS 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;Build affected artifacts only]<\/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\">Monorepo branch rules<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Rule<\/th><th>Reason<\/th><\/tr><\/thead><tbody><tr><td>Keep branches short-lived<\/td><td>Avoid conflicts across teams<\/td><\/tr><tr><td>Use path-based CI<\/td><td>Avoid running everything<\/td><\/tr><tr><td>Use CODEOWNERS<\/td><td>Require right reviewers<\/td><\/tr><tr><td>Use feature flags<\/td><td>Hide incomplete work<\/td><\/tr><tr><td>Avoid release branches unless necessary<\/td><td>Release branches become complex in monorepos<\/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\">22. Model 12: Support\/LTS branching model<\/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.5-lts\nsupport\/1.9-lts\n<\/code><\/span><\/pre>\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;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.5-lts]<\/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-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\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>enterprise software<\/li>\n\n\n\n<li>libraries<\/li>\n\n\n\n<li>SDKs<\/li>\n\n\n\n<li>operating systems<\/li>\n\n\n\n<li>firmware<\/li>\n\n\n\n<li>products with long customer upgrade cycles<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Backporting<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A bug fix may need to be applied to multiple active support branches.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" 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;Cherry-pick 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;Cherry-pick to support\/2.5-lts]<\/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;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\">E<\/span><span class=\"hljs-selector-attr\">&#91;Tag v2.5.12]<\/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\">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\">23. Branching model comparison table<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Model<\/th><th>Branch count<\/th><th>Speed<\/th><th>Governance<\/th><th>Complexity<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>Mainline<\/td><td>Low<\/td><td>High<\/td><td>Low<\/td><td>Low<\/td><td>Solo\/tiny teams<\/td><\/tr><tr><td>Feature branch<\/td><td>Medium<\/td><td>Medium-high<\/td><td>Medium<\/td><td>Medium<\/td><td>Most teams<\/td><\/tr><tr><td>GitHub Flow<\/td><td>Low-medium<\/td><td>High<\/td><td>Medium<\/td><td>Low-medium<\/td><td>Web\/SaaS<\/td><\/tr><tr><td>GitLab Flow<\/td><td>Medium<\/td><td>Medium<\/td><td>High<\/td><td>Medium<\/td><td>Env promotion<\/td><\/tr><tr><td>Gitflow<\/td><td>High<\/td><td>Medium<\/td><td>High<\/td><td>High<\/td><td>Versioned releases<\/td><\/tr><tr><td>Trunk-based<\/td><td>Low<\/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>Medium<\/td><td>High<\/td><td>Medium<\/td><td>QA\/release windows<\/td><\/tr><tr><td>Environment branch<\/td><td>Medium<\/td><td>Low-medium<\/td><td>Medium<\/td><td>Medium-high<\/td><td>Simple branch deploys<\/td><\/tr><tr><td>Fork-based<\/td><td>Medium<\/td><td>Medium<\/td><td>High<\/td><td>Medium<\/td><td>Open source<\/td><\/tr><tr><td>GitOps<\/td><td>Medium<\/td><td>High<\/td><td>High<\/td><td>Medium<\/td><td>Kubernetes\/platform<\/td><\/tr><tr><td>Monorepo trunk<\/td><td>Low<\/td><td>Very high<\/td><td>High<\/td><td>High tooling needed<\/td><td>Large repos<\/td><\/tr><tr><td>Support\/LTS<\/td><td>High<\/td><td>Low-medium<\/td><td>Very high<\/td><td>High<\/td><td>Older 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\">24. How to choose the right branching model<\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Choose branching model] --&gt; B{External contributors?}\n    B -- Yes --&gt; C&#91;Fork-based model]\n    B -- No --&gt; D{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 \/ Feature branch model]\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 model]\n    H -- No --&gt; L{Need environment promotion?}\n    L -- Yes --&gt; M&#91;GitLab Flow or GitOps folders]\n    L -- No --&gt; N&#91;Feature branch model]\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\">25. Branching model 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 model<\/th><\/tr><\/thead><tbody><tr><td>Solo learning 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>Gitflow or release branches<\/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 branch + protected main<\/td><\/tr><tr><td>Kubernetes GitOps<\/td><td>Main + environment folders<\/td><\/tr><tr><td>Open source<\/td><td>Fork-based model<\/td><\/tr><tr><td>Monorepo<\/td><td>Trunk-based + CODEOWNERS<\/td><\/tr><tr><td>Regulated system<\/td><td>Release branches + approvals<\/td><\/tr><tr><td>Game development<\/td><td>Stream\/lock model or Perforce-style<\/td><\/tr><tr><td>Long-term enterprise product<\/td><td>Support\/LTS branches<\/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\">26. The source control branching design framework<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Before selecting a branching model, ask these questions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">26.1 Release cadence<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Question<\/th><th>Impact<\/th><\/tr><\/thead><tbody><tr><td>Do we release daily?<\/td><td>Prefer trunk-based\/GitHub Flow<\/td><\/tr><tr><td>Do we release weekly\/monthly?<\/td><td>Feature branch or GitLab Flow<\/td><\/tr><tr><td>Do we release quarterly?<\/td><td>Release branches\/Gitflow<\/td><\/tr><tr><td>Do customers run old versions?<\/td><td>Support branches<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">26.2 Deployment model<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Question<\/th><th>Impact<\/th><\/tr><\/thead><tbody><tr><td>Is every merge deployable?<\/td><td>Trunk-based\/GitHub Flow<\/td><\/tr><tr><td>Do we promote through environments?<\/td><td>GitLab Flow\/GitOps<\/td><\/tr><tr><td>Are releases manual?<\/td><td>Release branches<\/td><\/tr><tr><td>Is deployment separate from release?<\/td><td>Feature flags<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">26.3 Team size<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Team size<\/th><th>Recommended model<\/th><\/tr><\/thead><tbody><tr><td>1\u20133 engineers<\/td><td>Mainline\/GitHub Flow<\/td><\/tr><tr><td>4\u201320 engineers<\/td><td>Feature branch\/GitHub Flow<\/td><\/tr><tr><td>20\u2013100 engineers<\/td><td>Trunk-based\/GitLab Flow<\/td><\/tr><tr><td>100+ engineers<\/td><td>Trunk-based, monorepo, CODEOWNERS, automation<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">26.4 Risk level<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Risk level<\/th><th>Branching style<\/th><\/tr><\/thead><tbody><tr><td>Low risk<\/td><td>Lightweight branches<\/td><\/tr><tr><td>Medium risk<\/td><td>PR + CI + protected main<\/td><\/tr><tr><td>High risk<\/td><td>Release branches + approvals<\/td><\/tr><tr><td>Critical\/regulatory<\/td><td>Audited branches + change control<\/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. The best default branching model for most teams<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For most modern teams, use 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>All changes go through PR\/MR.<\/li>\n\n\n\n<li>CI must pass before merge.<\/li>\n\n\n\n<li>At least one review required.<\/li>\n\n\n\n<li>Feature branches must be short-lived.<\/li>\n\n\n\n<li>Hotfix branches start from production state.<\/li>\n\n\n\n<li>Release branches are created only when stabilization is needed.<\/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 branches can prevent deletion or force pushing and can require status checks 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\">28. 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-25\" 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-25\"><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-26\" 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-26\"><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 type 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 capability<\/td><\/tr><tr><td><code>bugfix\/<\/code><\/td><td>Normal defect fix<\/td><\/tr><tr><td><code>hotfix\/<\/code><\/td><td>Emergency production fix<\/td><\/tr><tr><td><code>release\/<\/code><\/td><td>Release stabilization<\/td><\/tr><tr><td><code>support\/<\/code><\/td><td>Older 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 changes<\/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\">29. Branch protection model<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Important branches need protection.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended protection rules<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Branch<\/th><th>Protection<\/th><\/tr><\/thead><tbody><tr><td><code>main<\/code><\/td><td>Strongest protection<\/td><\/tr><tr><td><code>release\/*<\/code><\/td><td>Strong protection<\/td><\/tr><tr><td><code>hotfix\/*<\/code><\/td><td>Fast review, critical CI<\/td><\/tr><tr><td><code>develop<\/code><\/td><td>Protected if used<\/td><\/tr><tr><td><code>production<\/code><\/td><td>Very strong protection<\/td><\/tr><tr><td><code>staging<\/code><\/td><td>Protected if environment branch<\/td><\/tr><tr><td><code>feature\/*<\/code><\/td><td>Usually no strict protection<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Main branch protection<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">- No direct push\n- Pull request required\n- Required status checks\n- Required approval\n- CODEOWNERS review for critical paths\n- No force push\n- No branch deletion\n- Signed commits if required\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Branch protection and required status checks are platform-level enforcement mechanisms, not just team wishes. GitHub documents that required status checks can block merging until checks pass.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">30. Merge model<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A branching model is incomplete without a merge model.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Common merge strategies<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Strategy<\/th><th>Meaning<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>Merge commit<\/td><td>Preserve branch history<\/td><td>Audit-heavy teams<\/td><\/tr><tr><td>Squash merge<\/td><td>One PR becomes one commit<\/td><td>Clean main history<\/td><\/tr><tr><td>Rebase merge<\/td><td>Linear history<\/td><td>Teams with strong Git discipline<\/td><\/tr><tr><td>Fast-forward<\/td><td>Move pointer forward only<\/td><td>Trunk\/mainline workflows<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended default<\/h2>\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\"><span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">squash<\/span> <span class=\"hljs-title\">merge<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">normal<\/span> <span class=\"hljs-title\">feature<\/span> <span class=\"hljs-title\">branches<\/span>.\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">merge<\/span> <span class=\"hljs-title\">commits<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">release<\/span>\/<span class=\"hljs-title\">hotfix<\/span> <span class=\"hljs-title\">branches<\/span> <span class=\"hljs-title\">when<\/span> <span class=\"hljs-title\">audit<\/span> <span class=\"hljs-title\">trail<\/span> <span class=\"hljs-title\">matters<\/span>.\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">rebase<\/span> <span class=\"hljs-title\">locally<\/span> <span class=\"hljs-title\">to<\/span> <span class=\"hljs-title\">clean<\/span> <span class=\"hljs-title\">up<\/span> <span class=\"hljs-title\">your<\/span> <span class=\"hljs-title\">own<\/span> <span class=\"hljs-title\">branch<\/span>.\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<p class=\"wp-block-paragraph\">Git\u2019s documentation describes <code>git merge<\/code> as the command used to merge one or more branches into the branch currently checked out.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">31. Branch lifecycle<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Every branch should have a birth, purpose, and death.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" 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 branch]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Work]<\/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]<\/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;Open PR\/MR]<\/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;Review + CI]<\/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]<\/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;Delete branch]<\/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\">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\">Healthy branch lifecycle<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Stage<\/th><th>Good behavior<\/th><\/tr><\/thead><tbody><tr><td>Create<\/td><td>From latest correct base<\/td><\/tr><tr><td>Work<\/td><td>Small commits<\/td><\/tr><tr><td>Update<\/td><td>Rebase\/merge from base regularly<\/td><\/tr><tr><td>Review<\/td><td>Small PR\/MR<\/td><\/tr><tr><td>Merge<\/td><td>After approval and CI<\/td><\/tr><tr><td>Delete<\/td><td>Immediately after merge<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Unhealthy branch lifecycle<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">create branch \u2192 work for 3 months \u2192 massive conflict \u2192 panic merge \u2192 production bug\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\">32. Branch age policy<\/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>Feature branch<\/td><td>Hours\u20133 days<\/td><td>1 week<\/td><\/tr><tr><td>Bugfix branch<\/td><td>Hours\u20132 days<\/td><td>1 week<\/td><\/tr><tr><td>Hotfix branch<\/td><td>Minutes\u2013hours<\/td><td>1 day<\/td><\/tr><tr><td>Release branch<\/td><td>Days\u2013weeks<\/td><td>Release-dependent<\/td><\/tr><tr><td>Support branch<\/td><td>Months\u2013years<\/td><td>Product-dependent<\/td><\/tr><tr><td>Experiment branch<\/td><td>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\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">33. Release branch model in detail<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A release branch is created when a release needs stabilization.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" 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-29\"><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\">fix\ndocs\nversion bump\nrelease notes\nconfiguration correction\nsafe test update\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-30\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">new<\/span> feature\nlarge refactor\nexperimental dependency\nunrelated cleanup\ndatabase-breaking change without plan\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<h2 class=\"wp-block-heading\">Release branch naming<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">release\/2.5.0\nrelease\/2026.07\nrelease\/mobile-4.1.0\nrelease\/api-v3\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\">34. Hotfix branch model in detail<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Hotfix branches fix production.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" 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;Merge\/backport to active branches]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><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<ul class=\"wp-block-list\">\n<li>Start from production branch\/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 changes.<\/li>\n\n\n\n<li>Keep review short but real.<\/li>\n\n\n\n<li>Deploy quickly.<\/li>\n\n\n\n<li>Back-merge or cherry-pick to main\/develop\/release as needed.<\/li>\n\n\n\n<li>Write follow-up cleanup ticket.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Hotfix naming<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">hotfix\/2.5.1-payment-crash\nhotfix\/prod-login-timeout\nhotfix\/CVE-2026-1234\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\">35. Support branch model in detail<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Support branches exist when older versions are maintained.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"v1 base\"<\/span>\n    branch support\/<span class=\"hljs-number\">1.<\/span>x\n    checkout support\/<span class=\"hljs-number\">1.<\/span>x\n    commit id: <span class=\"hljs-string\">\"1.x fix\"<\/span>\n    checkout main\n    commit id: <span class=\"hljs-string\">\"v2 work\"<\/span>\n    branch support\/<span class=\"hljs-number\">2.<\/span>x\n    checkout support\/<span class=\"hljs-number\">2.<\/span>x\n    commit id: <span class=\"hljs-string\">\"2.x fix\"<\/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\">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\">Backport policy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When a bug is fixed in <code>main<\/code>, decide whether it should be backported.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Question<\/th><th>Backport?<\/th><\/tr><\/thead><tbody><tr><td>Security vulnerability?<\/td><td>Yes<\/td><\/tr><tr><td>Data corruption?<\/td><td>Yes<\/td><\/tr><tr><td>Production crash?<\/td><td>Usually 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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">36. Environment branch model in detail<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Environment branches can look simple:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dev \u2192 staging \u2192 production\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">But the danger is branch drift.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" 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-33\"><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 environment branch 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 higher environments.<\/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 and production should not become independent products.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Better GitOps style<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nclusters\/dev\nclusters\/staging\nclusters\/prod\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Same branch, separate environment folders.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">37. GitOps source branching design<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For Kubernetes and platform teams, this is often the cleanest model.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" 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;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;Image tag: sha-abc123]<\/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;GitOps repo PR]<\/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;Update dev folder]<\/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;Promote same image to staging]<\/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;Promote same image to production]<\/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;Argo CD \/ Flux sync]<\/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\">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\">Repository layout<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">gitops-repo\/\n  apps\/\n    auth\/\n    payment\/\n    notification\/\n  environments\/\n    dev\/\n    staging\/\n    production\/\n  clusters\/\n    dev-apne1\/\n    prod-apne1\/\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Golden 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<p class=\"wp-block-paragraph\">Do not rebuild different images for dev, staging, and production.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">38. Branching and Semantic Versioning<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Branching and versioning are connected.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Semantic Versioning defines <code>MAJOR.MINOR.PATCH<\/code>, where major is for incompatible API changes, minor is for backward-compatible functionality, and patch is for backward-compatible bug fixes.<\/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\">v1<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.1<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.1<\/span><span class=\"hljs-selector-class\">.1<\/span>\n<span class=\"hljs-selector-tag\">v2<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/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\">Branch to version mapping<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Branch<\/th><th>Version behavior<\/th><\/tr><\/thead><tbody><tr><td><code>main<\/code><\/td><td>Next version \/ production-ready<\/td><\/tr><tr><td><code>release\/1.4.0<\/code><\/td><td>Stabilizing v1.4.0<\/td><\/tr><tr><td><code>hotfix\/1.4.1<\/code><\/td><td>Patch release<\/td><\/tr><tr><td><code>support\/1.x<\/code><\/td><td>Older major version<\/td><\/tr><tr><td><code>feature\/*<\/code><\/td><td>No version until merged<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Example<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">release\/2.3.0 \u2192 tag v2.3.0\nhotfix\/2.3.1-payment \u2192 tag v2.3.1\nsupport\/1.9-lts \u2192 tag v1.9.12\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\">39. Branching and CI\/CD<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Branching models only work when CI\/CD understands branch meaning.<\/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;Run tests + lint + build]\n    B -- main --&gt; D&#91;Run full CI + deploy staging]\n    B -- release\/* --&gt; E&#91;Run release validation]\n    B -- hotfix\/* --&gt; F&#91;Run critical tests]\n    B -- production --&gt; G&#91;Deploy production]\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Recommended branch pipeline behavior<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Branch<\/th><th>CI behavior<\/th><\/tr><\/thead><tbody><tr><td><code>feature\/*<\/code><\/td><td>Lint, unit test, build<\/td><\/tr><tr><td><code>bugfix\/*<\/code><\/td><td>Lint, unit test, build<\/td><\/tr><tr><td><code>main<\/code><\/td><td>Full CI, integration tests, deploy to dev\/staging<\/td><\/tr><tr><td><code>release\/*<\/code><\/td><td>Full release validation<\/td><\/tr><tr><td><code>hotfix\/*<\/code><\/td><td>Critical tests, security checks<\/td><\/tr><tr><td><code>production<\/code><\/td><td>Production deployment only<\/td><\/tr><tr><td><code>support\/*<\/code><\/td><td>Version-specific tests<\/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\">40. Branching and code review<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Every branching model needs review rules.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Review rules by branch type<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Branch target<\/th><th>Review rule<\/th><\/tr><\/thead><tbody><tr><td><code>main<\/code><\/td><td>At least 1 approval<\/td><\/tr><tr><td><code>release\/*<\/code><\/td><td>Release owner approval<\/td><\/tr><tr><td><code>hotfix\/*<\/code><\/td><td>Emergency reviewer approval<\/td><\/tr><tr><td><code>production<\/code><\/td><td>Production owner approval<\/td><\/tr><tr><td><code>support\/*<\/code><\/td><td>Maintainer approval<\/td><\/tr><tr><td>Infrastructure paths<\/td><td>Platform\/DevOps owner<\/td><\/tr><tr><td>Security paths<\/td><td>Security owner<\/td><\/tr><tr><td>Database migrations<\/td><td>Backend + platform\/DB owner<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">CODEOWNERS example<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\/infra\/ @platform-team\n\/.github\/workflows\/ @devops-team\n\/services\/payment\/ @payment-team\n\/services\/auth\/ @identity-team\n\/security\/ @security-team\n\/database\/migrations\/ @backend-leads\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\">41. Branching and database migrations<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Database changes often determine whether a branch model succeeds.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bad branching behavior<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">feature branch changes schema for 3 weeks\nmain changes app logic meanwhile\nrelease branch needs old schema\nproduction hotfix now conflicts\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Safe model<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use expand-migrate-contract.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" 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-36\"><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\">Branching rule<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Database migrations should be:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>small<\/li>\n\n\n\n<li>backward compatible<\/li>\n\n\n\n<li>reviewed carefully<\/li>\n\n\n\n<li>deployed in phases<\/li>\n\n\n\n<li>not hidden in huge feature 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\">42. Branching and feature flags<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Feature flags reduce branch complexity.<\/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\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 flag\n<\/code><\/span><\/pre>\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\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Create small branch]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Add hidden feature code]<\/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;Gradually enable]<\/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 flag after rollout]<\/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<h2 class=\"wp-block-heading\">Best practice<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A feature flag lets the team use short-lived branches even for large features.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">43. Branching and rollback<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Each branching model must define rollback.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Production problem] --&gt; B{Feature flag?}\n    B -- Yes --&gt; C&#91;Disable flag]\n    B -- No --&gt; D{Bad deployment?}\n    D -- Yes --&gt; E&#91;Redeploy previous artifact]\n    D -- No --&gt; F{Bad commit?}\n    F -- Yes --&gt; G&#91;Revert commit]\n    F -- No --&gt; H&#91;Hotfix branch]\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Rollback methods<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Problem<\/th><th>Best action<\/th><\/tr><\/thead><tbody><tr><td>Bad feature<\/td><td>Disable flag<\/td><\/tr><tr><td>Bad commit<\/td><td>Revert<\/td><\/tr><tr><td>Bad deployment<\/td><td>Redeploy previous artifact<\/td><\/tr><tr><td>Bad release branch fix<\/td><td>Patch release<\/td><\/tr><tr><td>Bad database migration<\/td><td>Fix forward or planned rollback<\/td><\/tr><tr><td>Security issue<\/td><td>Hotfix + rotate credentials<\/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\">44. Branching model for Infrastructure as Code<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Infrastructure repositories need a stricter model than app repos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended IaC 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<p class=\"wp-block-paragraph\">Usually avoid long-lived environment branches unless you have a very clear reason.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">IaC workflow<\/h2>\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\">TD<\/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;Edit Terraform]<\/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;terraform fmt]<\/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;terraform validate]<\/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;Open 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;Terraform plan]<\/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;Security scan]<\/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;Cost\/blast-radius review]<\/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;Approval]<\/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;Merge]<\/span>\n    <span class=\"hljs-selector-tag\">J<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">K<\/span><span class=\"hljs-selector-attr\">&#91;Apply via pipeline]<\/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\">IaC branch rules<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Rule<\/th><th>Why<\/th><\/tr><\/thead><tbody><tr><td>No direct push to main<\/td><td>Prevent accidental infra change<\/td><\/tr><tr><td>Plan required on PR<\/td><td>Review actual resource impact<\/td><\/tr><tr><td>Separate prod approval<\/td><td>Reduce production risk<\/td><\/tr><tr><td>No huge infra PRs<\/td><td>Easier blast-radius review<\/td><\/tr><tr><td>No secrets in repo<\/td><td>State\/security risk<\/td><\/tr><tr><td>Protect pipeline files<\/td><td>CI\/CD controls infrastructure<\/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\">45. Branching model for application repositories<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended app model<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\nbugfix\/*\nhotfix\/*\nrelease\/* when needed\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">App branch flow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" 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\/*]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;PR]<\/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;CI]<\/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]<\/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;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;Build artifact]<\/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 dev\/staging]<\/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 production]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><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\">App-specific rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use feature flags.<\/li>\n\n\n\n<li>Keep branches short-lived.<\/li>\n\n\n\n<li>Merge only with green CI.<\/li>\n\n\n\n<li>Use release tags.<\/li>\n\n\n\n<li>Make rollback easy.<\/li>\n\n\n\n<li>Avoid mixing refactor and behavior changes.<\/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\">46. Branching model for microservices<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Microservices often work best with lightweight branching.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Option A: Repository per service<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">service-auth\/\nservice-payment\/\nservice-notification\/\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Each service can use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\nhotfix\/*\nrelease\/*\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Option B: Monorepo<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">services\/\n  auth\/\n  payment\/\n  notification\/\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Prefer trunk-based with path-based CI.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Microservice rule<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Do not use branches to coordinate service compatibility.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>API contracts<\/li>\n\n\n\n<li>backward compatibility<\/li>\n\n\n\n<li>versioned APIs<\/li>\n\n\n\n<li>feature flags<\/li>\n\n\n\n<li>consumer-driven contract tests<\/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\">47. Branching model 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 support branches for old major versions if needed.<\/li>\n\n\n\n<li>Breaking changes require major version.<\/li>\n\n\n\n<li>Patch fixes can be backported.<\/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 v3 development\nsupport\/2.x          \u2192 v2 patches\nsupport\/1.x-lts      \u2192 v1 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\">48. Branching model for mobile apps<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Mobile apps often need release branches because app store approval and staged rollout take time.<\/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-4.8.0\nrelease\/android-4.8.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-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;main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;release\/mobile-4.8.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;Production 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 v4.8.0]<\/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\">Rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Release branch only receives stabilization fixes.<\/li>\n\n\n\n<li>Main continues future work.<\/li>\n\n\n\n<li>Hotfixes may require patch release branch.<\/li>\n\n\n\n<li>Tags must match shipped builds.<\/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\">49. Branching model for regulated systems<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Regulated environments require evidence.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Branch structure<\/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>required CI<\/li>\n\n\n\n<li>signed commits, if required<\/li>\n\n\n\n<li>release approval<\/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<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Evidence chain<\/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;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-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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">50. Branching anti-patterns<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 1: Permanent feature branches<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" 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\">6<\/span> months\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><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>impossible merge<\/li>\n\n\n\n<li>hidden bugs<\/li>\n\n\n\n<li>no continuous integration<\/li>\n\n\n\n<li>team fear<\/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<\/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: Develop branch as 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>develop is always broken<\/li>\n\n\n\n<li>release branch starts from unstable base<\/li>\n\n\n\n<li>no one 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>or remove <code>develop<\/code> if unnecessary<\/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\">fix directly in production branch\nforget to merge back\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>branches drift<\/li>\n\n\n\n<li>fixes disappear<\/li>\n\n\n\n<li>staging no longer represents production<\/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>hotfix branch from production<\/li>\n\n\n\n<li>merge\/cherry-pick back<\/li>\n\n\n\n<li>automate branch diff checks<\/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: Branching instead of feature flags<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Big feature not ready, branch stays open forever\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Merge incomplete code behind disabled flag\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: Release branch gets new features<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">release\/2.0 becomes develop-2\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Release branch accepts only stabilization changes\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 6: No branch deletion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">300 stale branches\nNobody knows what is active\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 old branches monthly<\/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\">51. Branch by abstraction<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Branch by abstraction is a technique for avoiding long-running branches during large changes.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" 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 layer]<\/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 behavior 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-43\"><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-44\" 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-44\"><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-45\" 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-45\"><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\">52. Stacked branches<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Stacked branches are dependent branches used to split large work.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" 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>-base\n    checkout pr<span class=\"hljs-number\">-1<\/span>-base\n    commit id: <span class=\"hljs-string\">\"base 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\">\"new 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-46\"><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 independently.<\/li>\n\n\n\n<li>You want smaller PRs.<\/li>\n\n\n\n<li>You cannot merge everything at once.<\/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 need careful rebasing and clear reviewer communication.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">53. Branching commands cheat sheet<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Create 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-47\" 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-47\"><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 old 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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">54. Branching model policy template<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this as a company-ready standard.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Source Control Branching 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 use 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> 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> Every production release must be tagged.\n<span class=\"hljs-number\">12.<\/span> Stale branches must be deleted.\n<span class=\"hljs-number\">13.<\/span> Secrets must never be committed.\n<span class=\"hljs-number\">14.<\/span> Database and infrastructure changes <span class=\"hljs-built_in\">require<\/span> explicit review.\n<span class=\"hljs-number\">15.<\/span> Rollback strategy must be known before production deployment.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><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\">55. Branching model examples<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">55.1 Simple SaaS team<\/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\">Model:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">GitHub Flow or trunk-based <span class=\"hljs-keyword\">with<\/span> PRs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><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\">Use when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>frequent deploys<\/li>\n\n\n\n<li>good CI<\/li>\n\n\n\n<li>feature flags available<\/li>\n\n\n\n<li>main always deployable<\/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\">55.2 Enterprise app with staging and production<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\nrelease\/*\nhotfix\/*\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Model:<\/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\">GitLab Flow style <span class=\"hljs-keyword\">with<\/span> release\/environment promotion\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\">Use when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>staging validation required<\/li>\n\n\n\n<li>production approval required<\/li>\n\n\n\n<li>releases are controlled<\/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\">55.3 Mobile app<\/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<p class=\"wp-block-paragraph\">Model:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Release branch \/ Gitflow-inspired\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>app store approval exists<\/li>\n\n\n\n<li>release candidates matter<\/li>\n\n\n\n<li>shipped versions need tags<\/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\">55.4 Terraform repository<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\nhotfix\/*\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Model:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Feature branch + <span class=\"hljs-keyword\">protected<\/span> main + plan checks\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><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\">Use when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>every infra change requires plan review<\/li>\n\n\n\n<li>production apply is controlled<\/li>\n\n\n\n<li>environments are folders or workspaces, not random branches<\/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\">55.5 Kubernetes GitOps<\/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:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">clusters\/dev\nclusters\/staging\nclusters\/prod\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Model:<\/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\">GitOps <span class=\"hljs-keyword\">with<\/span> environment folders\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<p class=\"wp-block-paragraph\">Use when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Argo CD or Flux syncs from Git<\/li>\n\n\n\n<li>desired state is versioned<\/li>\n\n\n\n<li>promotion is PR-based<\/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\">56. Branching model governance<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A serious branching model must be enforceable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Governance controls<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Control<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Branch protection<\/td><td>Prevent unsafe merges<\/td><\/tr><tr><td>Required CI<\/td><td>Block broken code<\/td><\/tr><tr><td>Required reviews<\/td><td>Human approval<\/td><\/tr><tr><td>CODEOWNERS<\/td><td>Expert ownership<\/td><\/tr><tr><td>Signed commits<\/td><td>Provenance<\/td><\/tr><tr><td>Release tags<\/td><td>Traceability<\/td><\/tr><tr><td>Auto-delete branches<\/td><td>Hygiene<\/td><\/tr><tr><td>Secret scanning<\/td><td>Security<\/td><\/tr><tr><td>Audit logs<\/td><td>Compliance<\/td><\/tr><tr><td>Deployment gates<\/td><td>Production safety<\/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\">57. Branching model metrics<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Measure the health of your branching model.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Metric<\/th><th>What it reveals<\/th><\/tr><\/thead><tbody><tr><td>Average branch age<\/td><td>Integration delay<\/td><\/tr><tr><td>Number of stale branches<\/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>CI failure rate<\/td><td>Code quality<\/td><\/tr><tr><td>Merge conflict frequency<\/td><td>Branch drift<\/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><tr><td>Change failure rate<\/td><td>Production safety<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Healthy targets<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Metric<\/th><th>Healthy signal<\/th><\/tr><\/thead><tbody><tr><td>Feature branch age<\/td><td>1\u20133 days<\/td><\/tr><tr><td>PR size<\/td><td>small and focused<\/td><\/tr><tr><td>Main branch status<\/td><td>green most of the time<\/td><\/tr><tr><td>Stale branches<\/td><td>low<\/td><\/tr><tr><td>Hotfix rate<\/td><td>decreasing<\/td><\/tr><tr><td>Revert process<\/td><td>fast and safe<\/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\">58. The branching model decision matrix<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Situation<\/th><th>Recommended model<\/th><\/tr><\/thead><tbody><tr><td>\u201cWe deploy several times per day.\u201d<\/td><td>Trunk-based<\/td><\/tr><tr><td>\u201cWe deploy weekly with PR review.\u201d<\/td><td>GitHub Flow<\/td><\/tr><tr><td>\u201cWe need staging before production.\u201d<\/td><td>GitLab Flow<\/td><\/tr><tr><td>\u201cWe ship mobile apps.\u201d<\/td><td>Release branches or Gitflow<\/td><\/tr><tr><td>\u201cWe support older versions.\u201d<\/td><td>Support\/LTS branches<\/td><\/tr><tr><td>\u201cWe are open source.\u201d<\/td><td>Fork-based<\/td><\/tr><tr><td>\u201cWe use Kubernetes GitOps.\u201d<\/td><td>Main + environment folders<\/td><\/tr><tr><td>\u201cWe have a monorepo.\u201d<\/td><td>Trunk-based + CODEOWNERS<\/td><\/tr><tr><td>\u201cWe have weak CI.\u201d<\/td><td>Feature branches first, improve CI<\/td><\/tr><tr><td>\u201cWe are regulated.\u201d<\/td><td>Release branches + strict approvals<\/td><\/tr><tr><td>\u201cWe use Terraform.\u201d<\/td><td>Protected main + plan PRs<\/td><\/tr><tr><td>\u201cWe have giant binary files.\u201d<\/td><td>Consider Perforce\/locking model<\/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\">59. The ultimate branching blueprint<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For most serious engineering teams, this is the ideal starting architecture:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">flowchart TD\n    A&#91;Work item] --&gt; B&#91;Create short-lived branch]\n    B --&gt; C&#91;Small commits]\n    C --&gt; D&#91;Push branch]\n    D --&gt; E&#91;Open PR\/MR]\n    E --&gt; F&#91;CI checks]\n    E --&gt; G&#91;Code review]\n    F --&gt; H{Pass?}\n    G --&gt; I{Approved?}\n    H -- No --&gt; C\n    I -- No --&gt; C\n    H -- Yes --&gt; J&#91;Merge to <span class=\"hljs-keyword\">protected<\/span> main]\n    I -- Yes --&gt; J\n    J --&gt; K&#91;Build immutable artifact]\n    K --&gt; L&#91;Deploy to lower environment]\n    L --&gt; M{Release needed?}\n    M -- Continuous deploy --&gt; N&#91;Deploy production]\n    M -- Stabilization needed --&gt; O&#91;Create release branch]\n    O --&gt; P&#91;QA + fixes only]\n    P --&gt; Q&#91;Tag release]\n    Q --&gt; N\n    N --&gt; R&#91;Monitor]\n    R --&gt; S{Issue?}\n    S -- Yes --&gt; T&#91;Hotfix\/revert\/rollback]\n    S -- No --&gt; U&#91;Complete]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><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<h2 class=\"wp-block-heading\">Branch set<\/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\">Main policy<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">main is <span class=\"hljs-keyword\">protected<\/span>, tested, reviewed, <span class=\"hljs-keyword\">and<\/span> always releasable.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><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<h2 class=\"wp-block-heading\">Feature policy<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Feature branches are short-lived and merged through PR\/MR.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Release policy<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Release branches exist only for stabilization and version control.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Hotfix policy<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Hotfix branches exist only for urgent production repair.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Support policy<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Support branches exist only for maintained older versions.\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\">60. Final wisdom<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A weak branching model creates confusion.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A good branching model creates flow.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A great branching model makes the safe path the easy path.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The best model is not the most complex one. It is the one that matches:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>team size<\/li>\n\n\n\n<li>release cadence<\/li>\n\n\n\n<li>product risk<\/li>\n\n\n\n<li>deployment style<\/li>\n\n\n\n<li>CI maturity<\/li>\n\n\n\n<li>review culture<\/li>\n\n\n\n<li>compliance needs<\/li>\n\n\n\n<li>rollback ability<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">For most modern teams, start with:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" 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\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\nAutomatic branch cleanup\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><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 as your team improves CI, testing, feature flags, deployment automation, and rollback confidence.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The 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 useful only when it gives the team one of these benefits:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>safer collaboration<\/li>\n\n\n\n<li>cleaner review<\/li>\n\n\n\n<li>controlled release<\/li>\n\n\n\n<li>emergency repair<\/li>\n\n\n\n<li>support for older versions<\/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 it does not do one of those things, delete it, simplify it, or replace it with automation.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>From Beginner to Advanced: A Complete One-Stop Guide for Designing Branching Strategies 1. What is a source control branching model? A source control branching model is the&#8230; <\/p>\n","protected":false},"author":1,"featured_media":77509,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-77508","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\/77508","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=77508"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77508\/revisions"}],"predecessor-version":[{"id":77510,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77508\/revisions\/77510"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/77509"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=77508"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=77508"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=77508"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}