{"id":77503,"date":"2026-07-07T01:34:12","date_gmt":"2026-07-07T01:34:12","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=77503"},"modified":"2026-07-07T01:34:14","modified_gmt":"2026-07-07T01:34:14","slug":"git-workflow-master-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/git-workflow-master-tutorial\/","title":{"rendered":"Git Workflow Master Tutorial"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">From First Commit to Enterprise-Grade Delivery<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Best title:<\/strong><br><strong>Git Workflow Master Guide: Branching Strategies, Pull Requests, Releases, CI\/CD, and Team Governance<\/strong><\/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\">1. What is a Git workflow?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>Git workflow<\/strong> is the agreed way a team uses Git to move code from an idea to production safely.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It answers questions like:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Where do developers create changes?<\/li>\n\n\n\n<li>Which branch is production?<\/li>\n\n\n\n<li>When do we create pull requests or merge requests?<\/li>\n\n\n\n<li>Who reviews code?<\/li>\n\n\n\n<li>How do we release?<\/li>\n\n\n\n<li>How do we hotfix production?<\/li>\n\n\n\n<li>How do we keep history clean?<\/li>\n\n\n\n<li>How do we avoid breaking <code>main<\/code>?<\/li>\n\n\n\n<li>How does CI\/CD fit into Git?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Git itself provides commands such as <code>branch<\/code>, <code>merge<\/code>, <code>rebase<\/code>, <code>tag<\/code>, <code>fetch<\/code>, <code>pull<\/code>, <code>push<\/code>, <code>cherry-pick<\/code>, <code>revert<\/code>, and <code>bisect<\/code>; a workflow is the <strong>human and automation policy<\/strong> built around those commands. Git\u2019s official reference groups these commands under areas like branching, merging, sharing, updating, inspection, patching, and debugging.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. The one-line mental model<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Git workflow is not about branches.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Git workflow is about <strong>controlling risk while increasing delivery speed<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Branches, pull requests, tags, reviews, CI checks, protected branches, release branches, and hotfix branches are only tools.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The real goal is:<\/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\">Deliver correct code faster, with traceability, review, rollback, and confidence.<\/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\">3. Four layers of Git workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Most people confuse Git commands with Git workflow. A serious team separates Git into four layers.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Git Commands]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Branching Strategy]<\/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;Collaboration Workflow]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Release &amp; Deployment Governance]<\/span>\n\n    <span class=\"hljs-selector-tag\">A1<\/span><span class=\"hljs-selector-attr\">&#91;commit, branch, merge, rebase, tag]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">A<\/span>\n    <span class=\"hljs-selector-tag\">B1<\/span><span class=\"hljs-selector-attr\">&#91;Gitflow, GitHub Flow, GitLab Flow, Trunk-Based]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span>\n    <span class=\"hljs-selector-tag\">C1<\/span><span class=\"hljs-selector-attr\">&#91;PR\/MR, reviews, approvals, CI checks]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span>\n    <span class=\"hljs-selector-tag\">D1<\/span><span class=\"hljs-selector-attr\">&#91;environments, releases, hotfixes, rollback, audit]<\/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-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Layer<\/th><th>What it means<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td><strong>Git commands<\/strong><\/td><td>Technical operations<\/td><td><code>git commit<\/code>, <code>git merge<\/code>, <code>git rebase<\/code><\/td><\/tr><tr><td><strong>Branching strategy<\/strong><\/td><td>Branch structure<\/td><td>Gitflow, trunk-based development<\/td><\/tr><tr><td><strong>Collaboration workflow<\/strong><\/td><td>How humans review and integrate work<\/td><td>Pull requests, code owners, approvals<\/td><\/tr><tr><td><strong>Release governance<\/strong><\/td><td>How code reaches users<\/td><td>Tags, releases, CI\/CD, rollback<\/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\">4. Core Git concepts every workflow depends on<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">4.1 Repository<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>repository<\/strong> is the complete project history.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It contains:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Files<\/li>\n\n\n\n<li>Commits<\/li>\n\n\n\n<li>Branches<\/li>\n\n\n\n<li>Tags<\/li>\n\n\n\n<li>Remote references<\/li>\n\n\n\n<li>Configuration<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">git init\ngit clone <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">repo-url<\/span>&gt;<\/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\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4.2 Commit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>commit<\/strong> is a snapshot of the repository at a point in time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A commit has:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A unique hash<\/li>\n\n\n\n<li>Author<\/li>\n\n\n\n<li>Timestamp<\/li>\n\n\n\n<li>Message<\/li>\n\n\n\n<li>Parent commit or commits<\/li>\n\n\n\n<li>File changes<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git add .\ngit commit -m <span class=\"hljs-string\">\"feat: add user login\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4.3 Branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>branch<\/strong> is a movable pointer to a commit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is the most important sentence in Git.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A branch is not a folder.<br>A branch is not a copy of the full project.<br>A branch is a lightweight pointer.<\/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\">gitGraph\n    commit id: <span class=\"hljs-string\">\"A\"<\/span>\n    commit id: <span class=\"hljs-string\">\"B\"<\/span>\n    branch feature\/login\n    checkout feature\/login\n    commit id: <span class=\"hljs-string\">\"C\"<\/span>\n    commit id: <span class=\"hljs-string\">\"D\"<\/span>\n    checkout main\n    commit id: <span class=\"hljs-string\">\"E\"<\/span>\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\">4.4 Main branch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The primary branch is usually called:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>main<\/code><\/li>\n\n\n\n<li><code>master<\/code><\/li>\n\n\n\n<li><code>trunk<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Modern repositories usually prefer <code>main<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In trunk-based development, developers collaborate around a single branch often called trunk, main, or mainline, and avoid long-lived shared 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\">4.5 Remote<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>remote<\/strong> is another copy of the repository, usually hosted in GitHub, GitLab, Bitbucket, Azure DevOps, or an internal Git server.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git remote -v\ngit fetch origin\ngit push origin main\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\">4.6 HEAD<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>HEAD<\/code> means:<br><strong>Where your working directory currently points.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Usually, <code>HEAD<\/code> points to the latest commit of your current branch.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git status\ngit log --oneline --decorate --graph\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\">4.7 Tag<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>tag<\/strong> marks an important commit, usually a release.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.2<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">push<\/span> <span class=\"hljs-selector-tag\">origin<\/span> <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.2<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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<p class=\"wp-block-paragraph\">Tags are often used with release automation, changelog generation, deployment records, and rollback.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Git workflow vocabulary<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Term<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><strong>Branching strategy<\/strong><\/td><td>Rules for how branches are created and merged<\/td><\/tr><tr><td><strong>Git workflow<\/strong><\/td><td>Full process from coding to production<\/td><\/tr><tr><td><strong>Feature branch<\/strong><\/td><td>Temporary branch for a feature or task<\/td><\/tr><tr><td><strong>Pull request \/ merge request<\/strong><\/td><td>Review request before merging code<\/td><\/tr><tr><td><strong>Protected branch<\/strong><\/td><td>Branch with rules preventing unsafe changes<\/td><\/tr><tr><td><strong>Release branch<\/strong><\/td><td>Branch prepared for a versioned release<\/td><\/tr><tr><td><strong>Hotfix branch<\/strong><\/td><td>Emergency branch to fix production<\/td><\/tr><tr><td><strong>Trunk<\/strong><\/td><td>Main integration branch<\/td><\/tr><tr><td><strong>CI<\/strong><\/td><td>Continuous integration: automated checks on code<\/td><\/tr><tr><td><strong>CD<\/strong><\/td><td>Continuous delivery\/deployment: automated release pipeline<\/td><\/tr><tr><td><strong>Rebase<\/strong><\/td><td>Move commits onto a new base<\/td><\/tr><tr><td><strong>Merge<\/strong><\/td><td>Combine histories<\/td><\/tr><tr><td><strong>Squash<\/strong><\/td><td>Combine multiple commits into one<\/td><\/tr><tr><td><strong>Cherry-pick<\/strong><\/td><td>Copy one commit to another branch<\/td><\/tr><tr><td><strong>Revert<\/strong><\/td><td>Create a new commit that undoes another commit<\/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\">6. The Git workflow maturity ladder<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" 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: Solo Git usage]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L2<\/span><span class=\"hljs-selector-attr\">&#91;Level 2: Feature branches]<\/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: Pull requests]<\/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: Protected main branch]<\/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: CI required before merge]<\/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: Automated releases]<\/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: Trunk-based delivery with feature flags]<\/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: Progressive delivery, rollback, audit, compliance]<\/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\">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>Team behavior<\/th><th>Risk<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Everyone commits anywhere<\/td><td>Very high<\/td><\/tr><tr><td>2<\/td><td>Feature branches exist<\/td><td>Medium-high<\/td><\/tr><tr><td>3<\/td><td>PR review required<\/td><td>Medium<\/td><\/tr><tr><td>4<\/td><td>Main branch protected<\/td><td>Lower<\/td><\/tr><tr><td>5<\/td><td>Tests required before merge<\/td><td>Lower<\/td><\/tr><tr><td>6<\/td><td>Releases automated<\/td><td>Low<\/td><\/tr><tr><td>7<\/td><td>Small frequent merges<\/td><td>Very low when done well<\/td><\/tr><tr><td>8<\/td><td>Full delivery governance<\/td><td>Enterprise-grade<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub branch protection rules can require pull request reviews, passing status checks, and other constraints before code can merge into important branches.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. The daily developer Git workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is the workflow every developer should master before learning advanced branching models.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7.1 Start clean<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git status\ngit checkout main\ngit pull --ff-only origin main\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Why <code>--ff-only<\/code>?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because it avoids unexpected merge commits during pull.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7.2 Create a branch<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout -b feature\/login-api\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Recommended branch naming:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">feature\/login-api\nbugfix\/payment-timeout\nhotfix\/fix-prod-crash\nchore\/update-dependencies\ndocs\/git-workflow-guide\nrefactor\/auth-service-cleanup\nexperiment\/<span class=\"hljs-keyword\">new<\/span>-cache-strategy\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7.3 Make small commits<\/h2>\n\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\">git add src\/auth\/login.go\ngit commit -m <span class=\"hljs-string\">\"feat(auth): add login API\"<\/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<p class=\"wp-block-paragraph\">Good commits are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Small<\/li>\n\n\n\n<li>Focused<\/li>\n\n\n\n<li>Reversible<\/li>\n\n\n\n<li>Reviewable<\/li>\n\n\n\n<li>Understandable<\/li>\n\n\n\n<li>Linked to purpose<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Bad commit:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">changes\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good commit:<\/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\">fix(payment): handle timeout <span class=\"hljs-keyword\">from<\/span> gateway\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<p class=\"wp-block-paragraph\">Conventional Commits defines a lightweight structure such as <code>&lt;type&gt;[optional scope]: &lt;description&gt;<\/code>, with optional body and footers, to make commit history easier for humans and automation to understand.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7.4 Keep your branch updated<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Option A: merge from main.<\/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\">Option B: rebase onto main.<\/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<p class=\"wp-block-paragraph\">Git rebase rewrites a series of commits onto a new base, and Git\u2019s own documentation describes commands such as <code>git rebase --continue<\/code>, <code>git rebase --abort<\/code>, and <code>git rebase --skip<\/code> for conflict handling during rebase.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7.5 Push your branch<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git push -u origin feature\/login-api\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\">7.6 Open a pull request<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A pull request should answer:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What changed?<\/li>\n\n\n\n<li>Why changed?<\/li>\n\n\n\n<li>How tested?<\/li>\n\n\n\n<li>What risk exists?<\/li>\n\n\n\n<li>How to rollback?<\/li>\n\n\n\n<li>Screenshots\/logs if applicable<\/li>\n\n\n\n<li>Related ticket\/issue<\/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\">7.7 Pass CI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before merge, CI should run:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Build<\/li>\n\n\n\n<li>Unit tests<\/li>\n\n\n\n<li>Integration tests<\/li>\n\n\n\n<li>Linting<\/li>\n\n\n\n<li>Formatting<\/li>\n\n\n\n<li>Security scan<\/li>\n\n\n\n<li>Secret scan<\/li>\n\n\n\n<li>Dependency scan<\/li>\n\n\n\n<li>Container image scan<\/li>\n\n\n\n<li>Terraform plan, if infra<\/li>\n\n\n\n<li>Kubernetes manifest validation, if platform<\/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\">7.8 Merge safely<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Common merge options:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Merge type<\/th><th>Command \/ platform behavior<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td><strong>Merge commit<\/strong><\/td><td>Preserves branch history<\/td><td>Complex features, audit-heavy teams<\/td><\/tr><tr><td><strong>Squash merge<\/strong><\/td><td>Combines PR into one commit<\/td><td>Clean main history<\/td><\/tr><tr><td><strong>Rebase merge<\/strong><\/td><td>Replays commits linearly<\/td><td>Linear history with meaningful commits<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub branch protection can also enforce a linear commit history and block force pushes or deletion on protected branches.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7.9 Delete branch<\/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\">git branch -d feature\/login-api\ngit push origin --<span class=\"hljs-keyword\">delete<\/span> feature\/login-api\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<p class=\"wp-block-paragraph\">Short-lived branches should disappear after merge. This keeps the repository clean.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Golden rules of Git workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Rule 1: <code>main<\/code> must always be healthy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>main<\/code> should be:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Buildable<\/li>\n\n\n\n<li>Testable<\/li>\n\n\n\n<li>Deployable<\/li>\n\n\n\n<li>Protected<\/li>\n\n\n\n<li>Recoverable<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A broken <code>main<\/code> means the whole team slows down.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Rule 2: Branches should be short-lived<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The longer a branch lives, the higher the merge risk.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">xychart-beta\n    title <span class=\"hljs-string\">\"Branch Age vs Merge Risk\"<\/span>\n    x-axis &#91;<span class=\"hljs-string\">\"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\">\"Merge Risk\"<\/span> <span class=\"hljs-number\">0<\/span> --&gt; <span class=\"hljs-number\">100<\/span>\n    bar &#91;<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-11\"><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 conceptual, not a measured universal law. The practical lesson is true in most teams: long-running branches drift away from the integration branch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">AWS DevOps guidance recommends trunk-based development paired with a pull-request workflow and short-lived feature branches as an effective branching strategy for DevOps, with the core benefit being better continuous integration.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Rule 3: Pull requests should be small<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A pull request should ideally be reviewable in 10\u201330 minutes.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>PR size<\/th><th>Review quality<\/th><\/tr><\/thead><tbody><tr><td>50 lines<\/td><td>Excellent<\/td><\/tr><tr><td>300 lines<\/td><td>Good<\/td><\/tr><tr><td>800 lines<\/td><td>Risky<\/td><\/tr><tr><td>2,000 lines<\/td><td>Rubber-stamp danger<\/td><\/tr><tr><td>10,000 lines<\/td><td>Archaeology, not review<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Rule 4: Commit messages are part of engineering quality<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Commit messages are not decoration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They help:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Debug production<\/li>\n\n\n\n<li>Generate changelogs<\/li>\n\n\n\n<li>Review history<\/li>\n\n\n\n<li>Understand intent<\/li>\n\n\n\n<li>Automate releases<\/li>\n\n\n\n<li>Track breaking changes<\/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\">Rule 5: Never rewrite shared history casually<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Safe:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git rebase -i HEAD~3\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">on your local branch before pushing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dangerous:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git push --force origin main\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git push --force-<span class=\"hljs-keyword\">with<\/span>-lease\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><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\">only when rewriting your own branch and you understand the risk.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Rule 6: Prefer revert over history deletion for production<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad production fix:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">git reset --hard <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">old-commit<\/span>&gt;<\/span>\ngit push --force\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><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<p class=\"wp-block-paragraph\">Better production fix:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">git revert <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">bad-commit<\/span>&gt;<\/span>\ngit push origin main\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><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<p class=\"wp-block-paragraph\"><code>git revert<\/code> creates a new commit that undoes a previous commit, preserving traceability.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. The five major Git workflows<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">There are many variants, but most real-world teams use one of these:<\/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\">mindmap\n  root((Git Workflows))\n    Centralized Workflow\n      Simple\n      Small teams\n      Main only\n    Feature Branch Workflow\n      Branch per task\n      Pull requests\n    GitHub Flow\n      Main + short branches\n      Deploy <span class=\"hljs-keyword\">from<\/span> main\n    GitLab Flow\n      Main + environment\/release branches\n      Issue\/MR centric\n    Gitflow\n      Main + develop + release + hotfix\n      Versioned releases\n    Trunk-Based Development\n      Single trunk\n      Very short branches\n      Feature flags\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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Workflow 1: Centralized workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Everyone commits to one main branch.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"A\"<\/span>\n    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-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">When it works<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Solo developer<\/li>\n\n\n\n<li>Tiny prototype<\/li>\n\n\n\n<li>Throwaway project<\/li>\n\n\n\n<li>Learning Git<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">When it fails<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Multiple developers<\/li>\n\n\n\n<li>Production product<\/li>\n\n\n\n<li>Review required<\/li>\n\n\n\n<li>CI\/CD required<\/li>\n\n\n\n<li>Compliance required<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Verdict<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Good for learning.<br>Bad for professional delivery.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Workflow 2: Feature branch workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each task gets its own branch.<\/p>\n\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\">\"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 feature\/payment\n    checkout feature\/payment\n    commit id: <span class=\"hljs-string\">\"payment-1\"<\/span>\n    checkout main\n    merge feature\/login\n    merge feature\/payment\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\">Process<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git checkout main\ngit pull --ff-only\ngit checkout -b feature\/user-profile\n\n<span class=\"hljs-comment\"># work<\/span>\ngit add .\ngit commit -m <span class=\"hljs-string\">\"feat(profile): add user profile page\"<\/span>\n\ngit push -u origin feature\/user-profile\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><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:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open PR\/MR<\/li>\n\n\n\n<li>Review<\/li>\n\n\n\n<li>CI runs<\/li>\n\n\n\n<li>Merge<\/li>\n\n\n\n<li>Delete branch<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Most modern teams<\/li>\n\n\n\n<li>Product teams<\/li>\n\n\n\n<li>Web apps<\/li>\n\n\n\n<li>Backend services<\/li>\n\n\n\n<li>DevOps\/IaC repos<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Main risk<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Feature branches become long-lived.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best practice<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Keep feature branches under a few days. For larger work, split into smaller PRs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. Workflow 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 where work branches from <code>main<\/code>, changes are proposed through pull requests, reviewed, tested, and merged back to <code>main<\/code>. GitHub\u2019s own documentation describes it as a lightweight branch-based workflow.<\/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;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;Make commits]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Open pull request]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;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;Run 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-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\">Branch structure<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\nbugfix\/*\nchore\/*\ndocs\/*\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Example<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git checkout main\ngit pull --ff-only origin main\n\ngit checkout -b feature\/add-search\ngit commit -am <span class=\"hljs-string\">\"feat(search): add basic search endpoint\"<\/span>\ngit push -u origin feature\/add-search\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><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\">When to use GitHub Flow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use it when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>main<\/code> can be deployed frequently<\/li>\n\n\n\n<li>CI is reliable<\/li>\n\n\n\n<li>You do not need complex release branches<\/li>\n\n\n\n<li>The team can review quickly<\/li>\n\n\n\n<li>You operate web services, SaaS, APIs, internal platforms<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">When not to use it<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid pure GitHub Flow when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You support many old versions<\/li>\n\n\n\n<li>You release desktop\/mobile apps with long approval cycles<\/li>\n\n\n\n<li>You need parallel release trains<\/li>\n\n\n\n<li>Production cannot receive every merged change<\/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\">13. Workflow 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 additional guidance for production, environment branches, or release branches. GitLab\u2019s documentation positions GitLab Flow as adding structure around deployments, environments, releases, and issue tracking beyond simple GitHub Flow.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Feature Branch]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">MR<\/span><span class=\"hljs-selector-attr\">&#91;Merge Request]<\/span>\n    <span class=\"hljs-selector-tag\">MR<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">MAIN<\/span><span class=\"hljs-selector-attr\">&#91;main]<\/span>\n    <span class=\"hljs-selector-tag\">MAIN<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">STAGING<\/span><span class=\"hljs-selector-attr\">&#91;staging]<\/span>\n    <span class=\"hljs-selector-tag\">STAGING<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">PROD<\/span><span class=\"hljs-selector-attr\">&#91;production]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Common GitLab Flow models<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Model A: Production branch<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nproduction\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><code>main<\/code> is where developers integrate.<br><code>production<\/code> is what is deployed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Model B: Environment branches<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nstaging\nproduction\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" 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 staging\n    checkout staging\n    commit id: <span class=\"hljs-string\">\"Deploy staging\"<\/span>\n    branch production\n    checkout production\n    commit id: <span class=\"hljs-string\">\"Deploy prod\"<\/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\">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<h3 class=\"wp-block-heading\">Model C: Release branches<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nrelease\/1.0\nrelease\/1.1\nrelease\/2.0\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">GitLab describes options such as production branches, environment branches, and release branches as part of GitLab Flow-style branching strategies.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">When to use GitLab Flow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use it when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You need environment branches<\/li>\n\n\n\n<li>You deploy through staging before production<\/li>\n\n\n\n<li>You want issue\/MR-driven process<\/li>\n\n\n\n<li>You need more release control than GitHub Flow<\/li>\n\n\n\n<li>You want less complexity than Gitflow<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Practical example<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git checkout main\ngit checkout -b feature\/payment-retry\ngit commit -m <span class=\"hljs-string\">\"feat(payment): retry failed gateway calls\"<\/span>\ngit push -u origin feature\/payment-retry\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">After MR approval:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout main\ngit pull --ff-only\ngit checkout staging\ngit merge main\ngit push origin staging\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">After validation:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout production\ngit merge staging\ngit push origin 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\">14. Workflow 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, commonly including <code>main<\/code>, <code>develop<\/code>, <code>feature\/*<\/code>, <code>release\/*<\/code>, and <code>hotfix\/*<\/code>. Atlassian describes Gitflow as an alternative branching model using feature branches and multiple primary branches, originally popularized by Vincent Driessen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" 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\"<\/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\">\"stabilize\"<\/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\">\"prod-fix\"<\/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-24\"><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 long-term support branch<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The original Gitflow model was presented by Vincent Driessen as a branching strategy for developing and releasing version-based software.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Gitflow process<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Start feature<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git checkout develop\ngit pull --ff-only origin develop\ngit checkout -b feature\/invoice-<span class=\"hljs-keyword\">export<\/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\">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<h3 class=\"wp-block-heading\">Finish feature<\/h3>\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\">git checkout develop\ngit merge --no-ff feature\/invoice-<span class=\"hljs-keyword\">export<\/span>\ngit branch -d feature\/invoice-<span class=\"hljs-keyword\">export<\/span>\ngit push origin develop\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<h3 class=\"wp-block-heading\">Start release<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout develop\ngit checkout -b release\/1.4.0\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Finish release<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout main\ngit merge --no-ff release\/1.4.0\ngit tag v1.4.0\n\ngit checkout develop\ngit merge --no-ff release\/1.4.0\n\ngit branch -d release\/1.4.0\ngit push origin main develop --tags\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Hotfix<\/h3>\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\">git checkout main\ngit checkout -b hotfix\/<span class=\"hljs-number\">1.4<\/span><span class=\"hljs-number\">.1<\/span>\n\n<span class=\"hljs-comment\"># fix production issue<\/span>\ngit commit -am <span class=\"hljs-string\">\"fix: prevent crash on empty invoice\"<\/span>\n\ngit checkout main\ngit merge --no-ff hotfix\/<span class=\"hljs-number\">1.4<\/span><span class=\"hljs-number\">.1<\/span>\ngit tag v1<span class=\"hljs-number\">.4<\/span><span class=\"hljs-number\">.1<\/span>\n\ngit checkout develop\ngit merge --no-ff hotfix\/<span class=\"hljs-number\">1.4<\/span><span class=\"hljs-number\">.1<\/span>\n\ngit branch -d hotfix\/<span class=\"hljs-number\">1.4<\/span><span class=\"hljs-number\">.1<\/span>\ngit push origin main develop --tags\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<h2 class=\"wp-block-heading\">When Gitflow is good<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use Gitflow when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You release versioned software<\/li>\n\n\n\n<li>You support multiple release versions<\/li>\n\n\n\n<li>You have scheduled release windows<\/li>\n\n\n\n<li>You need stabilization branches<\/li>\n\n\n\n<li>You ship mobile apps, desktop apps, firmware, SDKs, or on-prem products<\/li>\n\n\n\n<li>Production releases are not continuous<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">When Gitflow hurts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Gitflow can slow teams when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You deploy multiple times per day<\/li>\n\n\n\n<li>CI\/CD is mature<\/li>\n\n\n\n<li>Features can be hidden with flags<\/li>\n\n\n\n<li>Releases are small and frequent<\/li>\n\n\n\n<li>Long-lived branches cause merge pain<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Atlassian notes that compared with trunk-based development, Gitflow has more long-lived branches and larger commits.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Workflow 6: Trunk-based development<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development means developers integrate small changes into a single shared branch frequently. The trunk-based development reference site defines it as a model where developers collaborate on code in a single branch called trunk and resist creating long-lived development branches by using supporting techniques.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" 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 small-change<span class=\"hljs-number\">-1<\/span>\n    checkout small-change<span class=\"hljs-number\">-1<\/span>\n    commit id: <span class=\"hljs-string\">\"C\"<\/span>\n    checkout main\n    merge small-change<span class=\"hljs-number\">-1<\/span>\n    branch small-change<span class=\"hljs-number\">-2<\/span>\n    checkout small-change<span class=\"hljs-number\">-2<\/span>\n    commit id: <span class=\"hljs-string\">\"D\"<\/span>\n    checkout main\n    merge small-change<span class=\"hljs-number\">-2<\/span>\n    commit id: <span class=\"hljs-string\">\"E\"<\/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\">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\">Core idea<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Big feature branch for 3 weeks\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Tiny branch \u2192 PR \u2192 tests \u2192 merge \u2192 hidden behind feature flag\nTiny branch \u2192 PR \u2192 tests \u2192 merge \u2192 hidden behind feature flag\nTiny branch \u2192 PR \u2192 tests \u2192 merge \u2192 hidden behind feature flag\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Trunk-based rules<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Rule<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>One main integration branch<\/td><td>Usually <code>main<\/code> or <code>trunk<\/code><\/td><\/tr><tr><td>Very short-lived branches<\/td><td>Hours or days, not weeks<\/td><\/tr><tr><td>Small PRs<\/td><td>Easy to review<\/td><\/tr><tr><td>Strong CI<\/td><td>Main must stay green<\/td><\/tr><tr><td>Feature flags<\/td><td>Incomplete features hidden<\/td><\/tr><tr><td>Fast rollback<\/td><td>Revert or disable flag<\/td><\/tr><tr><td>Continuous integration<\/td><td>Merge frequently<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The trunk-based development reference explicitly discusses short-lived feature branches that are deleted after merge\/integration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">When trunk-based development is excellent<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use it when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You have strong automated tests<\/li>\n\n\n\n<li>CI is fast and trusted<\/li>\n\n\n\n<li>Developers are comfortable with small changes<\/li>\n\n\n\n<li>You use feature flags<\/li>\n\n\n\n<li>You deploy frequently<\/li>\n\n\n\n<li>You want continuous delivery<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">When it is risky<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid jumping directly to trunk-based development when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tests are weak<\/li>\n\n\n\n<li>Reviews are slow<\/li>\n\n\n\n<li>Developers create huge PRs<\/li>\n\n\n\n<li>Main often breaks<\/li>\n\n\n\n<li>No feature flag system exists<\/li>\n\n\n\n<li>Release and deployment are manual<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Trunk-based development with pull requests<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the practical modern version:<\/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\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Small local change]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Short-lived 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;CI + review]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Merge to main]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Deploy or release]<\/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<p class=\"wp-block-paragraph\">This is usually better than allowing everyone to push directly to <code>main<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Gitflow vs trunk-based development<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Area<\/th><th>Gitflow<\/th><th>Trunk-based development<\/th><\/tr><\/thead><tbody><tr><td>Main idea<\/td><td>Controlled release branches<\/td><td>Continuous integration into trunk<\/td><\/tr><tr><td>Primary branches<\/td><td><code>main<\/code>, <code>develop<\/code>, release, hotfix<\/td><td>Mostly <code>main<\/code> \/ <code>trunk<\/code><\/td><\/tr><tr><td>Branch lifetime<\/td><td>Longer<\/td><td>Very short<\/td><\/tr><tr><td>Release style<\/td><td>Scheduled\/versioned<\/td><td>Frequent\/continuous<\/td><\/tr><tr><td>CI requirement<\/td><td>Important<\/td><td>Critical<\/td><\/tr><tr><td>Feature flags<\/td><td>Useful<\/td><td>Almost required<\/td><\/tr><tr><td>Merge pain<\/td><td>Higher if branches live long<\/td><td>Lower if changes are tiny<\/td><\/tr><tr><td>Best for<\/td><td>Versioned products, slower release cadence<\/td><td>Web services, SaaS, fast teams<\/td><\/tr><tr><td>Team maturity needed<\/td><td>Medium<\/td><td>High<\/td><\/tr><tr><td>Operational speed<\/td><td>Medium<\/td><td>High<\/td><\/tr><tr><td>Governance clarity<\/td><td>High<\/td><td>Depends on automation<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Simple decision<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">flowchart TD\n    A&#91;Choose Git Workflow] --&gt; B{Can main be deployed frequently?}\n    B -- Yes --&gt; C{Strong CI and tests?}\n    C -- Yes --&gt; D&#91;Trunk-Based Development]\n    C -- No --&gt; E&#91;GitHub Flow \/ Feature Branch Workflow]\n    B -- No --&gt; F{Need release stabilization?}\n    F -- Yes --&gt; G&#91;Gitflow or GitLab Flow <span class=\"hljs-keyword\">with<\/span> release branches]\n    F -- No --&gt; H&#91;GitLab Flow <span class=\"hljs-keyword\">with<\/span> environment branches]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. GitHub Flow vs GitLab Flow vs Gitflow vs Trunk-Based<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Workflow<\/th><th>Best summary<\/th><th>Best team type<\/th><\/tr><\/thead><tbody><tr><td><strong>GitHub Flow<\/strong><\/td><td>Simple PR-based flow from <code>main<\/code><\/td><td>Web\/service teams<\/td><\/tr><tr><td><strong>GitLab Flow<\/strong><\/td><td>GitHub Flow plus environment\/release structure<\/td><td>Teams with staging\/prod promotion<\/td><\/tr><tr><td><strong>Gitflow<\/strong><\/td><td>Heavy release management model<\/td><td>Versioned products<\/td><\/tr><tr><td><strong>Trunk-based<\/strong><\/td><td>Small frequent integration into trunk<\/td><td>High-performing CI\/CD teams<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">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\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Recommended workflow 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 workflow<\/th><\/tr><\/thead><tbody><tr><td>Solo learning project<\/td><td>Centralized or simple feature branch<\/td><\/tr><tr><td>Startup web app<\/td><td>GitHub Flow<\/td><\/tr><tr><td>SaaS backend<\/td><td>Trunk-based with PRs<\/td><\/tr><tr><td>Kubernetes manifests<\/td><td>GitOps-style trunk or environment branches<\/td><\/tr><tr><td>Terraform IaC<\/td><td>Feature branch + PR + plan checks<\/td><\/tr><tr><td>Mobile app<\/td><td>Gitflow or GitLab Flow with release branches<\/td><\/tr><tr><td>Desktop app<\/td><td>Gitflow<\/td><\/tr><tr><td>SDK\/library<\/td><td>Gitflow or release-branch model<\/td><\/tr><tr><td>Firmware<\/td><td>Gitflow with support branches<\/td><\/tr><tr><td>Enterprise platform<\/td><td>GitLab Flow or trunk-based with strong governance<\/td><\/tr><tr><td>Monorepo<\/td><td>Trunk-based with CODEOWNERS and selective CI<\/td><\/tr><tr><td>Open source<\/td><td>Feature branch\/fork PR workflow<\/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\">19. The best modern default workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For most modern engineering 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<p class=\"wp-block-paragraph\">With rules:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>main<\/code> is always deployable.<\/li>\n\n\n\n<li>No direct push to <code>main<\/code>.<\/li>\n\n\n\n<li>Every change goes through PR\/MR.<\/li>\n\n\n\n<li>CI must pass before merge.<\/li>\n\n\n\n<li>At least one approval required.<\/li>\n\n\n\n<li>Use squash merge or rebase merge for clean history.<\/li>\n\n\n\n<li>Use tags for releases.<\/li>\n\n\n\n<li>Use feature flags for incomplete features.<\/li>\n\n\n\n<li>Hotfixes branch from production commit.<\/li>\n\n\n\n<li>Delete branches after merge.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Issue \/ Task] --&gt; B&#91;Create short-lived branch]\n    B --&gt; C&#91;Small commits]\n    C --&gt; D&#91;Open PR]\n    D --&gt; E&#91;CI checks]\n    D --&gt; F&#91;Code review]\n    E --&gt; G{Pass?}\n    F --&gt; H{Approved?}\n    G -- No --&gt; C\n    H -- No --&gt; C\n    G -- Yes --&gt; I&#91;Merge to main]\n    H -- Yes --&gt; I\n    I --&gt; J&#91;Deploy to staging]\n    J --&gt; K&#91;Promote to production]\n    K --&gt; L&#91;Tag release]\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. 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-31\" 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-31\"><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<p class=\"wp-block-paragraph\">Examples:<\/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\">feature\/EVP<span class=\"hljs-number\">-123<\/span>-add-device-search\nbugfix\/EVP<span class=\"hljs-number\">-221<\/span>-fix-login-timeout\nhotfix\/EVP<span class=\"hljs-number\">-911<\/span>-fix-prod-crash\nchore\/EVP<span class=\"hljs-number\">-301<\/span>-upgrade-node\ndocs\/EVP<span class=\"hljs-number\">-404<\/span>-update-runbook\nrefactor\/EVP<span class=\"hljs-number\">-510<\/span>-clean-auth-<span class=\"hljs-built_in\">module<\/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\">Branch type guide<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Prefix<\/th><th>Use for<\/th><\/tr><\/thead><tbody><tr><td><code>feature\/<\/code><\/td><td>New user-visible or system capability<\/td><\/tr><tr><td><code>bugfix\/<\/code><\/td><td>Non-production bug fix<\/td><\/tr><tr><td><code>hotfix\/<\/code><\/td><td>Emergency production fix<\/td><\/tr><tr><td><code>chore\/<\/code><\/td><td>Maintenance<\/td><\/tr><tr><td><code>docs\/<\/code><\/td><td>Documentation<\/td><\/tr><tr><td><code>test\/<\/code><\/td><td>Test-only change<\/td><\/tr><tr><td><code>refactor\/<\/code><\/td><td>Internal code restructure<\/td><\/tr><tr><td><code>perf\/<\/code><\/td><td>Performance improvement<\/td><\/tr><tr><td><code>security\/<\/code><\/td><td>Security fix<\/td><\/tr><tr><td><code>experiment\/<\/code><\/td><td>Temporary exploration<\/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\">21. Commit message 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-33\" 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>(optional-scope): <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">short<\/span> <span class=\"hljs-attr\">summary<\/span>&gt;<\/span>\n\nOptional body explaining why.\n\nOptional footer:\nBREAKING CHANGE: description\nRefs: TICKET-123\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><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<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">feat(auth)<\/span>: add Okta login callback\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">fix(kafka)<\/span>: retry transient producer failures\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">chore(terraform)<\/span>: upgrade AWS provider to v6\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">docs(runbook)<\/span>: add EKS incident rollback steps\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Conventional Commits aligns well with SemVer because commit types such as features, fixes, and breaking changes can drive automated changelog and version decisions.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Commit types<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Type<\/th><th>Meaning<\/th><th>Version impact<\/th><\/tr><\/thead><tbody><tr><td><code>feat<\/code><\/td><td>New feature<\/td><td>Minor<\/td><\/tr><tr><td><code>fix<\/code><\/td><td>Bug fix<\/td><td>Patch<\/td><\/tr><tr><td><code>perf<\/code><\/td><td>Performance improvement<\/td><td>Patch or minor<\/td><\/tr><tr><td><code>refactor<\/code><\/td><td>Code change without behavior change<\/td><td>Usually none<\/td><\/tr><tr><td><code>docs<\/code><\/td><td>Documentation<\/td><td>None<\/td><\/tr><tr><td><code>test<\/code><\/td><td>Tests only<\/td><td>None<\/td><\/tr><tr><td><code>build<\/code><\/td><td>Build system or dependencies<\/td><td>Depends<\/td><\/tr><tr><td><code>ci<\/code><\/td><td>CI\/CD pipeline<\/td><td>None<\/td><\/tr><tr><td><code>chore<\/code><\/td><td>Maintenance<\/td><td>None<\/td><\/tr><tr><td><code>revert<\/code><\/td><td>Revert previous commit<\/td><td>Depends<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Semantic Versioning uses <code>MAJOR.MINOR.PATCH<\/code>, where major versions indicate incompatible API changes, minor versions add backward-compatible functionality, and patch versions add backward-compatible bug fixes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. Pull request template<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this as a high-quality PR template.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Summary<\/span>\n\nExplain what changed in <span class=\"hljs-number\">2<\/span>\u2013<span class=\"hljs-number\">5<\/span> lines.\n\n<span class=\"hljs-comment\">## Why<\/span>\n\nExplain the reason, ticket, incident, <span class=\"hljs-keyword\">or<\/span> user problem.\n\n<span class=\"hljs-comment\">## Changes<\/span>\n\n- Added:\n- Changed:\n- Removed:\n- Fixed:\n\n<span class=\"hljs-comment\">## Testing<\/span>\n\n- &#91; ] Unit tests\n- &#91; ] Integration tests\n- &#91; ] Manual test\n- &#91; ] Local run\n- &#91; ] Staging validation\n\n<span class=\"hljs-comment\">## Risk<\/span>\n\nLow \/ Medium \/ High\n\nExplain risk.\n\n<span class=\"hljs-comment\">## Rollback Plan<\/span>\n\nHow can this be reverted <span class=\"hljs-keyword\">or<\/span> disabled?\n\n<span class=\"hljs-comment\">## Screenshots \/ Logs<\/span>\n\nAdd screenshots, logs, traces, <span class=\"hljs-keyword\">or<\/span> curl output <span class=\"hljs-keyword\">if<\/span> useful.\n\n<span class=\"hljs-comment\">## Checklist<\/span>\n\n- &#91; ] Small enough to review\n- &#91; ] CI passed\n- &#91; ] No secrets committed\n- &#91; ] Docs updated\n- &#91; ] Monitoring\/alerts considered\n- &#91; ] Backward compatibility considered\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Pull request size policy<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>PR size<\/th><th>Policy<\/th><\/tr><\/thead><tbody><tr><td>1\u2013200 lines<\/td><td>Ideal<\/td><\/tr><tr><td>200\u2013500 lines<\/td><td>Acceptable<\/td><\/tr><tr><td>500\u20131,000 lines<\/td><td>Needs explanation<\/td><\/tr><tr><td>1,000+ lines<\/td><td>Split unless generated code<\/td><\/tr><tr><td>5,000+ lines<\/td><td>Should almost never be reviewed manually<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Generated files should be clearly marked.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\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\">Note<\/span>: 3,200 <span class=\"hljs-selector-tag\">lines<\/span> <span class=\"hljs-selector-tag\">are<\/span> <span class=\"hljs-selector-tag\">generated<\/span> <span class=\"hljs-selector-tag\">OpenAPI<\/span> <span class=\"hljs-selector-tag\">client<\/span> <span class=\"hljs-selector-tag\">files<\/span>.\n<span class=\"hljs-selector-tag\">Human<\/span> <span class=\"hljs-selector-tag\">review<\/span> <span class=\"hljs-selector-tag\">should<\/span> <span class=\"hljs-selector-tag\">focus<\/span> <span class=\"hljs-selector-tag\">on<\/span>:\n<span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">api<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">client<\/span> <span class=\"hljs-selector-tag\">config<\/span>\n<span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">usage<\/span> <span class=\"hljs-selector-tag\">changes<\/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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. Code review rules<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Reviewer should check<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Correctness<\/li>\n\n\n\n<li>Simplicity<\/li>\n\n\n\n<li>Security<\/li>\n\n\n\n<li>Tests<\/li>\n\n\n\n<li>Observability<\/li>\n\n\n\n<li>Backward compatibility<\/li>\n\n\n\n<li>Failure handling<\/li>\n\n\n\n<li>Performance impact<\/li>\n\n\n\n<li>Migration safety<\/li>\n\n\n\n<li>Rollback path<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Reviewer should not focus only on<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Personal style<\/li>\n\n\n\n<li>Tiny naming preferences<\/li>\n\n\n\n<li>Formatting already handled by tools<\/li>\n\n\n\n<li>\u201cI would have written it differently\u201d<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Review comment levels<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Level<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><code>blocking<\/code><\/td><td>Must fix before merge<\/td><\/tr><tr><td><code>suggestion<\/code><\/td><td>Better but not required<\/td><\/tr><tr><td><code>question<\/code><\/td><td>Clarification needed<\/td><\/tr><tr><td><code>nit<\/code><\/td><td>Tiny non-blocking comment<\/td><\/tr><tr><td><code>praise<\/code><\/td><td>Good pattern worth reinforcing<\/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. Protected branch rules<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For <code>main<\/code>, enable:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Rule<\/th><th>Recommendation<\/th><\/tr><\/thead><tbody><tr><td>Direct push<\/td><td>Disabled<\/td><\/tr><tr><td>PR\/MR required<\/td><td>Yes<\/td><\/tr><tr><td>Required approvals<\/td><td>1\u20132<\/td><\/tr><tr><td>CODEOWNERS<\/td><td>Yes for critical areas<\/td><\/tr><tr><td>Status checks<\/td><td>Required<\/td><\/tr><tr><td>Conversation resolution<\/td><td>Required<\/td><\/tr><tr><td>Force push<\/td><td>Disabled<\/td><\/tr><tr><td>Branch deletion<\/td><td>Disabled<\/td><\/tr><tr><td>Signed commits<\/td><td>Optional\/required for regulated teams<\/td><\/tr><tr><td>Linear history<\/td><td>Optional<\/td><\/tr><tr><td>Admin bypass<\/td><td>Avoid or audit<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub protected branch rules can require approving reviews and passing status checks before merge, and can restrict force pushes or branch deletion.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. Merge strategies explained<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">27.1 Merge commit<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git merge --no-ff feature\/login\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" 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 feature\n    checkout feature\n    commit id: <span class=\"hljs-string\">\"B\"<\/span>\n    commit id: <span class=\"hljs-string\">\"C\"<\/span>\n    checkout main\n    commit id: <span class=\"hljs-string\">\"D\"<\/span>\n    merge feature id: <span class=\"hljs-string\">\"Merge\"<\/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\">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<h3 class=\"wp-block-heading\">Pros<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Preserves full branch context<\/li>\n\n\n\n<li>Good audit trail<\/li>\n\n\n\n<li>Easy to see feature grouping<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Noisy history<\/li>\n\n\n\n<li>Many merge commits<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Use when<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You need traceability<\/li>\n\n\n\n<li>Feature branch history matters<\/li>\n\n\n\n<li>Enterprise audit is important<\/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\">27.2 Squash merge<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git merge --squash feature\/login\ngit commit -m <span class=\"hljs-string\">\"feat(auth): add login flow\"<\/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\">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<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\">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\">\"Squashed feature\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">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<h3 class=\"wp-block-heading\">Pros<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Very clean <code>main<\/code><\/li>\n\n\n\n<li>One PR equals one commit<\/li>\n\n\n\n<li>Easy revert<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Loses individual commit details from branch<\/li>\n\n\n\n<li>Harder to preserve granular history<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Use when<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Team writes messy local commits<\/li>\n\n\n\n<li>You want readable main history<\/li>\n\n\n\n<li>PR is the unit of change<\/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\">27.3 Rebase merge<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout feature\/login\ngit rebase main\ngit checkout main\ngit merge --ff-only feature\/login\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">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-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Pros<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Linear history<\/li>\n\n\n\n<li>Clean bisecting<\/li>\n\n\n\n<li>No merge commits<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rewrites commit history<\/li>\n\n\n\n<li>Dangerous if used carelessly on shared branches<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub describes rebase as a command that can change a series of commits, including reordering, editing, or squashing them.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. Which merge strategy should your team choose?<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Team style<\/th><th>Recommended merge<\/th><\/tr><\/thead><tbody><tr><td>Small web team<\/td><td>Squash merge<\/td><\/tr><tr><td>DevOps\/IaC team<\/td><td>Squash or merge commit<\/td><\/tr><tr><td>Regulated enterprise<\/td><td>Merge commit<\/td><\/tr><tr><td>Open-source library<\/td><td>Rebase or merge commit<\/td><\/tr><tr><td>Monorepo<\/td><td>Squash merge<\/td><\/tr><tr><td>High-quality commit culture<\/td><td>Rebase merge<\/td><\/tr><tr><td>New team<\/td><td>Squash merge<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">My practical recommendation:<\/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\">Use squash merge by <span class=\"hljs-keyword\">default<\/span>.\nUse merge commits <span class=\"hljs-keyword\">for<\/span> release branches or complex multi-commit features.\nUse rebase locally to clean your branch before PR.\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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">29. Rebase vs merge<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Question<\/th><th>Merge<\/th><th>Rebase<\/th><\/tr><\/thead><tbody><tr><td>Preserves original history?<\/td><td>Yes<\/td><td>No, rewrites branch commits<\/td><\/tr><tr><td>Creates merge commit?<\/td><td>Usually yes<\/td><td>No<\/td><\/tr><tr><td>Good for shared branches?<\/td><td>Yes<\/td><td>Risky<\/td><\/tr><tr><td>Good for local cleanup?<\/td><td>Less useful<\/td><td>Excellent<\/td><\/tr><tr><td>Easier for beginners?<\/td><td>Yes<\/td><td>No<\/td><\/tr><tr><td>Cleaner history?<\/td><td>Sometimes noisy<\/td><td>Yes<\/td><\/tr><tr><td>Conflict resolution repeated?<\/td><td>Usually once<\/td><td>Can be multiple times<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Safe rebase rule<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Rebase your own local branch.\n<span class=\"hljs-keyword\">Do<\/span> not rebase shared branches unless the team explicitly agrees.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">30. Conflict resolution<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What is a conflict?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A conflict happens when Git cannot automatically combine changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD\ntimeout = 30\n=======\ntimeout = 60\n&gt;&gt;&gt;&gt;&gt;&gt;&gt; feature\/increase-timeout\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You must decide final content:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">timeout = 60\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then:<\/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\">git add config.yml\ngit rebase --<span class=\"hljs-keyword\">continue<\/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<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">add<\/span> <span class=\"hljs-selector-tag\">config<\/span><span class=\"hljs-selector-class\">.yml<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">commit<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">depending on whether you are rebasing or merging.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conflict survival workflow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">flowchart TD\n    A&#91;Conflict appears] --&gt; B&#91;Read both sides]\n    B --&gt; C&#91;Understand intent]\n    C --&gt; D&#91;Edit <span class=\"hljs-keyword\">final<\/span> version]\n    D --&gt; E&#91;Run tests]\n    E --&gt; F&#91;git add file]\n    F --&gt; G{Merge <span class=\"hljs-keyword\">or<\/span> rebase?}\n    G -- Merge --&gt; H&#91;git commit]\n    G -- Rebase --&gt; I&#91;git rebase --<span class=\"hljs-keyword\">continue<\/span>]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">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\">Never resolve conflicts blindly<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Accept current change\nAccept incoming change\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Understand both changes, then produce correct <span class=\"hljs-keyword\">final<\/span> code.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">31. Stash workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use stash when you need to temporarily save unfinished work.<\/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\">git stash push -m <span class=\"hljs-string\">\"WIP login refactor\"<\/span>\ngit checkout main\ngit pull --ff-only\ngit checkout feature\/login\ngit stash pop\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\">List stashes:<\/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\">git stash <span class=\"hljs-keyword\">list<\/span>\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\">Apply without deleting stash:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">stash<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">stash<\/span>@{0}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><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<p class=\"wp-block-paragraph\">Drop stash:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">stash<\/span> <span class=\"hljs-selector-tag\">drop<\/span> <span class=\"hljs-selector-tag\">stash<\/span>@{0}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">32. Cherry-pick workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use cherry-pick when one specific commit must move to another branch.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout release\/1.2\ngit cherry-pick abc1234\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good use cases:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Move a hotfix to release branch<\/li>\n\n\n\n<li>Backport a bug fix<\/li>\n\n\n\n<li>Apply one safe commit without merging a whole branch<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Bad use cases:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Replacing proper release process<\/li>\n\n\n\n<li>Randomly copying many commits<\/li>\n\n\n\n<li>Avoiding integration discipline<\/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\">33. Revert workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use revert to undo safely.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git revert abc1234\ngit push origin main\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For merge commits:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">git revert -m 1 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">merge-commit-sha<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><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<p class=\"wp-block-paragraph\">Use revert when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bad commit reached shared branch<\/li>\n\n\n\n<li>Production rollback needs traceability<\/li>\n\n\n\n<li>You want an audit-safe undo<\/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\">34. Reset workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><code>reset<\/code> moves branch pointers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Soft reset:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git reset --soft HEAD~1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Keeps changes staged.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mixed reset:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git reset HEAD~1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Keeps changes unstaged.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hard reset:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git reset --hard HEAD~1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Deletes local changes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Warning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Never use <code>reset --hard<\/code> casually.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Never force-push reset history to shared branches unless you fully understand the impact.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">35. Tagging and release workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Lightweight tag<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.2<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><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\">Annotated tag<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">-a<\/span> <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.2<\/span><span class=\"hljs-selector-class\">.0<\/span> <span class=\"hljs-selector-tag\">-m<\/span> \"<span class=\"hljs-selector-tag\">Release<\/span> <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.2<\/span><span class=\"hljs-selector-class\">.0<\/span>\"\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><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\">Push tags<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">push<\/span> <span class=\"hljs-selector-tag\">origin<\/span> <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.2<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Recommended release tag format<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">vMAJOR<\/span><span class=\"hljs-selector-class\">.MINOR<\/span><span class=\"hljs-selector-class\">.PATCH<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><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<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" 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-59\"><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<p class=\"wp-block-paragraph\">Semantic Versioning defines version numbers in a way that communicates meaning about the underlying code and compatibility.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">36. Release models<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Model A: Deploy every merge to main<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-60\" 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;Merge to main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;CI]<\/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 staging]<\/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 production]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-60\"><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<p class=\"wp-block-paragraph\">Best for:<\/p>\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>Internal tools<\/li>\n\n\n\n<li>Mature CI\/CD teams<\/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\">Model B: Manual promotion<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-61\" 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;Merge to main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Deploy dev]<\/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 staging]<\/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;Manual 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;Deploy production]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-61\"><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<p class=\"wp-block-paragraph\">Best for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enterprise services<\/li>\n\n\n\n<li>Moderate risk systems<\/li>\n\n\n\n<li>Teams needing approval gates<\/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\">Model C: Release branch<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-62\" 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\/develop]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;release\/1.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;Bug fixes only]<\/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;Tag v1.5.0]<\/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-62\"><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<p class=\"wp-block-paragraph\">Best for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Mobile apps<\/li>\n\n\n\n<li>Versioned software<\/li>\n\n\n\n<li>Slow release cycles<\/li>\n\n\n\n<li>Compliance-heavy products<\/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\">Model D: GitOps environment branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nenv\/dev\nenv\/staging\nenv\/prod\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-63\" 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;Application 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;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;env\/dev]<\/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;env\/staging]<\/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;env\/prod]<\/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;Argo CD \/ Flux deploys]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-63\"><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<p class=\"wp-block-paragraph\">Best for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kubernetes<\/li>\n\n\n\n<li>Argo CD<\/li>\n\n\n\n<li>Flux<\/li>\n\n\n\n<li>Platform teams<\/li>\n\n\n\n<li>Environment-specific promotion<\/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\">37. CI\/CD integration<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A Git workflow is incomplete without CI\/CD.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Minimum CI checks<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-64\" 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;Pull Request]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Checkout 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;Install dependencies]<\/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;Lint]<\/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;Unit tests]<\/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]<\/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;Integration tests]<\/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;Result: pass\/fail]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-64\"><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\">For application repos<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Check<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Format<\/td><td>Consistent style<\/td><\/tr><tr><td>Lint<\/td><td>Static mistakes<\/td><\/tr><tr><td>Unit test<\/td><td>Code correctness<\/td><\/tr><tr><td>Integration test<\/td><td>Component behavior<\/td><\/tr><tr><td>Build<\/td><td>Package validity<\/td><\/tr><tr><td>Secret scan<\/td><td>Prevent leaked keys<\/td><\/tr><tr><td>SAST<\/td><td>Static security<\/td><\/tr><tr><td>Dependency scan<\/td><td>Vulnerable libraries<\/td><\/tr><tr><td>Container scan<\/td><td>Image vulnerabilities<\/td><\/tr><tr><td>License scan<\/td><td>Compliance<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">For Terraform\/IaC repos<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Check<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td><code>terraform fmt<\/code><\/td><td>Formatting<\/td><\/tr><tr><td><code>terraform validate<\/code><\/td><td>Syntax\/provider validation<\/td><\/tr><tr><td><code>terraform plan<\/code><\/td><td>Review infra change<\/td><\/tr><tr><td>TFLint<\/td><td>Best practices<\/td><\/tr><tr><td>Checkov\/tfsec<\/td><td>Security<\/td><\/tr><tr><td>Infracost<\/td><td>Cost visibility<\/td><\/tr><tr><td>OPA\/Conftest<\/td><td>Policy checks<\/td><\/tr><tr><td>Manual approval<\/td><td>Production safety<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">For Kubernetes repos<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Check<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>YAML lint<\/td><td>Syntax<\/td><\/tr><tr><td>kubeconform\/kubeval<\/td><td>Schema validation<\/td><\/tr><tr><td>Helm lint<\/td><td>Chart validity<\/td><\/tr><tr><td>Kustomize build<\/td><td>Render validation<\/td><\/tr><tr><td>Conftest\/OPA<\/td><td>Policy<\/td><\/tr><tr><td>Polaris\/Kyverno<\/td><td>Best practices<\/td><\/tr><tr><td>Image scan<\/td><td>Supply chain security<\/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\">38. Git workflow for infrastructure teams<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Infrastructure Git workflow must be stricter than application workflow because mistakes can delete production resources.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended IaC workflow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-65\" 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;CI 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\/cost checks]<\/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;Review plan output]<\/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;Approve]<\/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-65\"><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 policy<\/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>Source of truth<\/td><\/tr><tr><td><code>feature\/*<\/code><\/td><td>Infra change<\/td><\/tr><tr><td><code>hotfix\/*<\/code><\/td><td>Emergency infra fix<\/td><\/tr><tr><td><code>env\/*<\/code><\/td><td>Optional environment branch model<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">IaC PR must include<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Terraform plan<\/li>\n\n\n\n<li>Risk summary<\/li>\n\n\n\n<li>Blast radius<\/li>\n\n\n\n<li>Rollback plan<\/li>\n\n\n\n<li>State impact<\/li>\n\n\n\n<li>Resource replacement warning<\/li>\n\n\n\n<li>Cost impact<\/li>\n\n\n\n<li>Security impact<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Dangerous Terraform PR signs<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-66\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">-\/+ resource replacement\ndestroy\nforces replacement\n<span class=\"hljs-keyword\">public<\/span> access\n<span class=\"hljs-number\">0.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span>\/<span class=\"hljs-number\">0<\/span>\ndelete database\nrecreate cluster\nchange encryption key\nremove backup\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-66\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">39. Git workflow for Kubernetes teams<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes workflow should separate:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Application source<\/li>\n\n\n\n<li>Container image<\/li>\n\n\n\n<li>Deployment manifests<\/li>\n\n\n\n<li>GitOps promotion<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-67\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;App repo]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Build image]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Push image tag]<\/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;Merge env\/dev]<\/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 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 prod]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-67\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Recommended image tag strategy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use immutable tags:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-68\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">app<\/span><span class=\"hljs-selector-pseudo\">:v1.4.2<\/span>\n<span class=\"hljs-selector-tag\">app<\/span><span class=\"hljs-selector-pseudo\">:git-sha-abc1234<\/span>\n<span class=\"hljs-selector-tag\">app<\/span><span class=\"hljs-selector-pseudo\">:2026-07-07-abc1234<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-68\"><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<p class=\"wp-block-paragraph\">Avoid relying only on:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">latest\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Kubernetes GitOps branch models<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Option A: Folder per environment<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">clusters\/\n  dev\/\n  staging\/\n  prod\/\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\/prod\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<p class=\"wp-block-paragraph\">For most teams, <strong>folder per environment<\/strong> is simpler than branch per environment.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">40. Monorepo Git workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A monorepo has many services in one repository.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">repo\/\n  services\/\n    auth\/\n    payment\/\n    telematics\/\n  libs\/\n    common\/\n  infra\/\n  docs\/\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Monorepo workflow rules<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Problem<\/th><th>Solution<\/th><\/tr><\/thead><tbody><tr><td>Too many CI jobs<\/td><td>Path-based CI<\/td><\/tr><tr><td>Too many reviewers<\/td><td>CODEOWNERS<\/td><\/tr><tr><td>Slow builds<\/td><td>Build affected projects only<\/td><\/tr><tr><td>Risky shared libraries<\/td><td>Strong tests<\/td><\/tr><tr><td>Large PRs<\/td><td>Smaller changes<\/td><\/tr><tr><td>Ownership confusion<\/td><td>Directory ownership<\/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\">\/services\/auth\/ @auth-team\n\/services\/payment\/ @payment-team\n\/infra\/ @platform-team\n\/.github\/workflows\/ @devops-team\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Monorepo PR checklist<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Which service changed?<\/li>\n\n\n\n<li>Which shared libraries changed?<\/li>\n\n\n\n<li>Which downstream services may break?<\/li>\n\n\n\n<li>Which CI jobs are required?<\/li>\n\n\n\n<li>Which owners must review?<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">41. Branch by abstraction<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Branch by abstraction is an advanced trunk-based technique.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of creating a long branch for a big rewrite, create an abstraction layer and migrate gradually.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-69\" 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;Introduce interface\/abstraction]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Route old 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-69\"><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<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-70\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">PaymentGateway <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span>\n \u251c\u2500\u2500 <span class=\"hljs-title\">OldStripeGateway<\/span>\n \u2514\u2500\u2500 <span class=\"hljs-title\">NewAdyenGateway<\/span>\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-70\"><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\">Feature flag:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">payment.provider = stripe | adyen\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This allows incomplete work to merge safely into <code>main<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The trunk-based development reference lists branch by abstraction as one of the techniques used to avoid long-lived development branches.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">42. Feature flags and Git workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Feature flags separate <strong>merge<\/strong> from <strong>release<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without feature flags:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-71\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Merge = users <span class=\"hljs-keyword\">get<\/span> feature\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-71\"><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\">With feature flags:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Merge = code integrated\nRelease = flag enabled\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-72\" 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 for internal users]<\/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 for 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 for 100%]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-72\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Feature flag types<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Type<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Release flag<\/td><td>Hide incomplete feature<\/td><\/tr><tr><td>Experiment flag<\/td><td>A\/B testing<\/td><\/tr><tr><td>Ops flag<\/td><td>Kill switch<\/td><\/tr><tr><td>Permission flag<\/td><td>Customer\/role access<\/td><\/tr><tr><td>Migration flag<\/td><td>Gradual backend switch<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Feature flag rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Every flag must have an owner.<\/li>\n\n\n\n<li>Every flag must have an expiry date.<\/li>\n\n\n\n<li>Old flags must be removed.<\/li>\n\n\n\n<li>Flags must be observable.<\/li>\n\n\n\n<li>Critical flags need audit logs.<\/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\">43. Hotfix workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Hotfix in simple main-based workflow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-73\" 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;Create hotfix branch from main or prod 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;Fix]<\/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;Emergency 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;CI critical tests]<\/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;Deploy]<\/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;Tag patch release]<\/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;Postmortem]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-73\"><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<p class=\"wp-block-paragraph\">Commands:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-74\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git checkout main\ngit pull --ff-only origin main\ngit checkout -b hotfix\/fix-payment-crash\n\n<span class=\"hljs-comment\"># fix<\/span>\ngit commit -am <span class=\"hljs-string\">\"fix(payment): prevent crash on missing token\"<\/span>\n\ngit push -u origin hotfix\/fix-payment-crash\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-74\"><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\">After PR merge:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-75\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">checkout<\/span> <span class=\"hljs-selector-tag\">main<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">pull<\/span> <span class=\"hljs-selector-tag\">--ff-only<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">-a<\/span> <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.4<\/span><span class=\"hljs-selector-class\">.1<\/span> <span class=\"hljs-selector-tag\">-m<\/span> \"<span class=\"hljs-selector-tag\">Hotfix<\/span> <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.4<\/span><span class=\"hljs-selector-class\">.1<\/span>\"\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">push<\/span> <span class=\"hljs-selector-tag\">origin<\/span> <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.4<\/span><span class=\"hljs-selector-class\">.1<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-75\"><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 in Gitflow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hotfix branches start from <code>main<\/code>, then merge back to both <code>main<\/code> and <code>develop<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-76\" 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 production]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;hotfix\/1.4.1]<\/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;Fix + test]<\/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;Merge to 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 v1.4.1]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Merge to develop]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-76\"><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\">44. Release branch workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use release branches when production needs stabilization before release.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-77\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"dev-1\"<\/span>\n    commit id: <span class=\"hljs-string\">\"dev-2\"<\/span>\n    branch release\/<span class=\"hljs-number\">2.0<\/span><span class=\"hljs-number\">.0<\/span>\n    checkout release\/<span class=\"hljs-number\">2.0<\/span><span class=\"hljs-number\">.0<\/span>\n    commit id: <span class=\"hljs-string\">\"fix-rc1\"<\/span>\n    commit id: <span class=\"hljs-string\">\"fix-rc2\"<\/span>\n    checkout main\n    merge release\/<span class=\"hljs-number\">2.0<\/span><span class=\"hljs-number\">.0<\/span> tag: <span class=\"hljs-string\">\"v2.0.0\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-77\"><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 rules<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Allowed:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bug fixes<\/li>\n\n\n\n<li>Version bumps<\/li>\n\n\n\n<li>Release notes<\/li>\n\n\n\n<li>Stabilization<\/li>\n\n\n\n<li>Documentation updates<\/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>Big refactors<\/li>\n\n\n\n<li>Risky dependency upgrades<\/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\">45. Backport workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Backport means applying a fix from newer code to an older supported release.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-78\" 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\/1.5]<\/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 release\/1.4]<\/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 v1.5.3]<\/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 v1.4.9]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-78\"><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<p class=\"wp-block-paragraph\">Commands:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-79\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">git checkout release\/1.5\ngit cherry-pick <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">fix-commit-sha<\/span>&gt;<\/span>\ngit push origin release\/1.5\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-79\"><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<p class=\"wp-block-paragraph\">Backport PR title:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-80\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;Backport release\/1.5]<\/span> <span class=\"hljs-selector-tag\">fix<\/span>(<span class=\"hljs-selector-tag\">auth<\/span>): <span class=\"hljs-selector-tag\">handle<\/span> <span class=\"hljs-selector-tag\">expired<\/span> <span class=\"hljs-selector-tag\">token<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-80\"><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\">46. Rollback strategy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">There are four common rollback methods.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Rollback type<\/th><th>How<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>Git revert<\/td><td><code>git revert<\/code><\/td><td>Bad code commit<\/td><\/tr><tr><td>Redeploy previous artifact<\/td><td>Deploy old image\/package<\/td><td>Bad deployment<\/td><\/tr><tr><td>Disable feature flag<\/td><td>Turn flag off<\/td><td>Bad feature<\/td><\/tr><tr><td>Database rollback\/fix-forward<\/td><td>Migration strategy<\/td><td>Data issues<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Best production rollback model<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Incident detected] --&gt; B{Feature flag?}\n    B -- Yes --&gt; C&#91;Disable flag]\n    B -- No --&gt; D{Bad deploy artifact?}\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;Fix forward]\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">47. Database migration workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Database changes are where Git workflow often becomes dangerous.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Safe migration pattern<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Expand \u2192 Migrate \u2192 Contract\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-81\" 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 app compatible with old and new]<\/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;Remove old schema]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-81\"><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\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ALTER TABLE users DROP COLUMN name;\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add new column.<\/li>\n\n\n\n<li>Deploy code that writes both old and new.<\/li>\n\n\n\n<li>Backfill.<\/li>\n\n\n\n<li>Switch reads to new column.<\/li>\n\n\n\n<li>Wait.<\/li>\n\n\n\n<li>Drop old column later.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Database PR must include<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Migration direction<\/li>\n\n\n\n<li>Rollback safety<\/li>\n\n\n\n<li>Backfill plan<\/li>\n\n\n\n<li>Locking risk<\/li>\n\n\n\n<li>Data volume estimate<\/li>\n\n\n\n<li>Production execution plan<\/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\">48. Security workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Git workflow must prevent secrets and unsafe code from reaching the repository.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Security checks before merge<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Check<\/th><th>Why<\/th><\/tr><\/thead><tbody><tr><td>Secret scanning<\/td><td>Prevent leaked credentials<\/td><\/tr><tr><td>Dependency scanning<\/td><td>Detect vulnerable libraries<\/td><\/tr><tr><td>SAST<\/td><td>Detect code-level security issues<\/td><\/tr><tr><td>IaC scanning<\/td><td>Detect cloud misconfigurations<\/td><\/tr><tr><td>Container scanning<\/td><td>Detect vulnerable images<\/td><\/tr><tr><td>License scanning<\/td><td>Avoid legal risk<\/td><\/tr><tr><td>CODEOWNERS<\/td><td>Require expert review<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Never commit<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-82\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">.env\n<span class=\"hljs-keyword\">private<\/span> keys\nAWS credentials\nGCP service account keys\nSSH <span class=\"hljs-keyword\">private<\/span> keys\ndatabase dumps\ncustomer data\nproduction kubeconfig\nTerraform state files\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-82\"><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\">Add protection<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git-secrets\npre-commit\ndetect-secrets\ngitleaks\ntrufflehog\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\">49. Pre-commit hooks<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Pre-commit hooks catch issues before code leaves the laptop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example <code>.pre-commit-config.yaml<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-83\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">repos:\n  - repo: https:<span class=\"hljs-comment\">\/\/github.com\/pre-commit\/pre-commit-hooks<\/span>\n    rev: v5<span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span>\n    hooks:\n      - id: trailing-whitespace\n      - id: end-of-file-fixer\n      - id: check-yaml\n      - id: check-json\n      - id: detect-<span class=\"hljs-keyword\">private<\/span>-key\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-83\"><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\">Install:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pip install pre-commit\npre-commit install\npre-commit run --all-files\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\">50. Git workflow for open source<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Open-source projects often use fork-based workflow.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-84\" 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 repo]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;User 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;Feature branch in fork]<\/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 to upstream]<\/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]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-84\"><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<p class=\"wp-block-paragraph\">Contributor commands:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-85\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">git clone <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">your-fork-url<\/span>&gt;<\/span>\ncd project\ngit remote add upstream <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">original-project-url<\/span>&gt;<\/span>\ngit fetch upstream\ngit checkout -b fix\/readme-typo upstream\/main\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-85\"><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<p class=\"wp-block-paragraph\">Sync fork:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git fetch upstream\ngit checkout main\ngit merge upstream\/main\ngit push origin main\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">51. Git workflow for emergency production incidents<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">During an incident, optimize for:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Safety<\/li>\n\n\n\n<li>Speed<\/li>\n\n\n\n<li>Traceability<\/li>\n\n\n\n<li>Rollback<\/li>\n\n\n\n<li>Communication<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Incident hotfix flow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-86\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">sequenceDiagram\n    participant Dev <span class=\"hljs-keyword\">as<\/span> Developer\n    participant Git <span class=\"hljs-keyword\">as<\/span> Git Repo\n    participant CI <span class=\"hljs-keyword\">as<\/span> CI Pipeline\n    participant Prod <span class=\"hljs-keyword\">as<\/span> Production\n\n    Dev-&gt;&gt;Git: Create hotfix branch\n    Dev-&gt;&gt;Git: Commit minimal fix\n    Dev-&gt;&gt;Git: Open emergency PR\n    CI-&gt;&gt;Git: Run critical checks\n    Git-&gt;&gt;Prod: Deploy after approval\n    Prod-&gt;&gt;Dev: Validate metrics\/logs\n    Dev-&gt;&gt;Git: Tag release\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-86\"><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\">Emergency PR template<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-87\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Incident<\/span>\n\nProduction issue:\n\n<span class=\"hljs-comment\">## Root cause<\/span>\n\nKnown \/ suspected:\n\n<span class=\"hljs-comment\">## Fix<\/span>\n\nMinimal change:\n\n<span class=\"hljs-comment\">## Validation<\/span>\n\n- &#91; ] Critical tests passed\n- &#91; ] Staging validated\n- &#91; ] Production smoke test ready\n\n<span class=\"hljs-comment\">## Rollback<\/span>\n\nExact rollback command <span class=\"hljs-keyword\">or<\/span> plan:\n\n<span class=\"hljs-comment\">## Follow-up<\/span>\n\nPost-incident cleanup ticket:\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-87\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">52. Git workflow anti-patterns<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 1: Long-lived feature branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">feature\/big-rewrite lives for 2 months\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Result:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Huge merge conflicts<\/li>\n\n\n\n<li>Delayed feedback<\/li>\n\n\n\n<li>Broken assumptions<\/li>\n\n\n\n<li>Big-bang release risk<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Split work<\/li>\n\n\n\n<li>Use feature flags<\/li>\n\n\n\n<li>Use branch by abstraction<\/li>\n\n\n\n<li>Merge smaller PRs<\/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: Shared develop branch without discipline<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>develop<\/code> can become a dumping ground.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Symptoms:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Always unstable<\/li>\n\n\n\n<li>Nobody owns it<\/li>\n\n\n\n<li>Hard to release<\/li>\n\n\n\n<li>Test failures ignored<\/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 PRs<\/li>\n\n\n\n<li>Require CI<\/li>\n\n\n\n<li>Consider removing it if not needed<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 3: \u201cFix directly on server\u201d<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Never hotfix production manually without Git.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">SSH to server\nvim file\nrestart service\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">hotfix branch \u2192 PR \u2192 CI \u2192 deploy \u2192 tag\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 4: Giant PR<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Symptoms:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Reviewers approve without understanding<\/li>\n\n\n\n<li>Bugs hidden in noise<\/li>\n\n\n\n<li>Rollback is hard<\/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 by behavior<\/li>\n\n\n\n<li>Split by layer<\/li>\n\n\n\n<li>Split by risk<\/li>\n\n\n\n<li>Use stacked PRs<\/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 5: Merge without green CI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This destroys trust.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rule:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-88\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Red CI means stop.\nGreen CI means <span class=\"hljs-keyword\">continue<\/span>.\nFlaky CI means fix CI.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-88\"><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\">Anti-pattern 6: Feature branches used as environments<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">branch dev\nbranch qa\nbranch staging\nbranch prod\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This can work in some GitLab Flow or GitOps models, but it becomes dangerous when teams randomly merge between branches without clear promotion rules.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use environment folders<\/li>\n\n\n\n<li>Use deployment pipeline promotions<\/li>\n\n\n\n<li>Use tags\/artifacts<\/li>\n\n\n\n<li>Keep source branch strategy simple<\/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\">53. Advanced PR splitting<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Large feature?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do not create one huge PR.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use this sequence:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-89\" 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;PR 1: Add database column, unused]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;PR 2: Add backend support behind flag]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;PR 3: Add API response field]<\/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 4: Add frontend hidden UI]<\/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;PR 5: Enable for internal users]<\/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;PR 6: Enable for all users]<\/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;PR 7: Remove old path]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-89\"><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\">Splitting strategies<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Strategy<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>By layer<\/td><td>DB \u2192 backend \u2192 frontend<\/td><\/tr><tr><td>By risk<\/td><td>Safe refactor \u2192 behavior change<\/td><\/tr><tr><td>By flag<\/td><td>Hidden code \u2192 enabled code<\/td><\/tr><tr><td>By endpoint<\/td><td>One endpoint per PR<\/td><\/tr><tr><td>By module<\/td><td>One service\/package per PR<\/td><\/tr><tr><td>By migration phase<\/td><td>Expand \u2192 migrate \u2192 contract<\/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\">54. Stacked PR workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Stacked PRs are useful when changes depend on each other.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-90\" 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-refactor\n    checkout pr<span class=\"hljs-number\">-1<\/span>-base-refactor\n    commit id: <span class=\"hljs-string\">\"refactor\"<\/span>\n    branch pr<span class=\"hljs-number\">-2<\/span>-<span class=\"hljs-keyword\">new<\/span>-api\n    checkout pr<span class=\"hljs-number\">-2<\/span>-<span class=\"hljs-keyword\">new<\/span>-api\n    commit id: <span class=\"hljs-string\">\"api\"<\/span>\n    branch pr<span class=\"hljs-number\">-3<\/span>-ui\n    checkout pr<span class=\"hljs-number\">-3<\/span>-ui\n    commit id: <span class=\"hljs-string\">\"ui\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-90\"><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 PRs when<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A feature needs multiple dependent steps<\/li>\n\n\n\n<li>Each step can be reviewed separately<\/li>\n\n\n\n<li>You do not want one huge PR<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Be careful<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Stacked PRs require discipline. Rebase carefully and keep reviewers informed.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">55. Repository hygiene<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Delete merged branches<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-91\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git branch --merged\ngit branch -d feature\/old-branch\ngit push origin --<span class=\"hljs-keyword\">delete<\/span> feature\/old-branch\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-91\"><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\">Prune deleted remote branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git fetch --prune\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Find stale branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git branch -r --sort=committerdate\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Clean local untracked files<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Preview:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git clean -nd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Delete:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git clean -fd\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\">56. Useful Git aliases<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-92\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git config --<span class=\"hljs-keyword\">global<\/span> alias.st status\ngit config --<span class=\"hljs-keyword\">global<\/span> alias.co checkout\ngit config --<span class=\"hljs-keyword\">global<\/span> alias.br branch\ngit config --<span class=\"hljs-keyword\">global<\/span> alias.cm commit\ngit config --<span class=\"hljs-keyword\">global<\/span> alias.lg <span class=\"hljs-string\">\"log --oneline --decorate --graph --all\"<\/span>\ngit config --<span class=\"hljs-keyword\">global<\/span> alias.last <span class=\"hljs-string\">\"log -1 HEAD --stat\"<\/span>\ngit config --<span class=\"hljs-keyword\">global<\/span> alias.unstage <span class=\"hljs-string\">\"restore --staged\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-92\"><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\">Now:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git lg\ngit st\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\">57. Debugging with Git<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Find who changed a line<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git blame path\/to\/file\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Search history<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-93\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git log --grep=<span class=\"hljs-string\">\"timeout\"<\/span>\ngit log -S <span class=\"hljs-string\">\"functionName\"<\/span>\ngit log -- path\/to\/file\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-93\"><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\">Find bad commit with bisect<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-94\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">bisect<\/span> <span class=\"hljs-selector-tag\">start<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">bisect<\/span> <span class=\"hljs-selector-tag\">bad<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">bisect<\/span> <span class=\"hljs-selector-tag\">good<\/span> <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.2<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-94\"><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<p class=\"wp-block-paragraph\">Then Git walks you through commits.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mark each:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git bisect good\ngit bisect bad\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Finish:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git bisect reset\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\">58. Clean history before PR<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Before opening PR:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git fetch origin\ngit rebase origin\/main\ngit log --oneline origin\/main..HEAD\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Interactive rebase:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git rebase -i origin\/main\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You can:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pick\nreword\nedit\nsquash\nfixup\ndrop\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use it to clean local commits.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">59. Example complete workflow: application team<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-95\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">sequenceDiagram\n    participant Dev <span class=\"hljs-keyword\">as<\/span> Developer\n    participant Git <span class=\"hljs-keyword\">as<\/span> GitHub\/GitLab\n    participant CI <span class=\"hljs-keyword\">as<\/span> CI\n    participant Staging <span class=\"hljs-keyword\">as<\/span> Staging\n    participant Prod <span class=\"hljs-keyword\">as<\/span> Production\n\n    Dev-&gt;&gt;Git: Create feature branch\n    Dev-&gt;&gt;Git: Push commits\n    Dev-&gt;&gt;Git: Open PR\n    CI-&gt;&gt;Git: Run tests and scans\n    Git-&gt;&gt;Dev: Review comments\n    Dev-&gt;&gt;Git: Push fixes\n    CI-&gt;&gt;Git: Pass\n    Git-&gt;&gt;Git: Merge to main\n    CI-&gt;&gt;Staging: Deploy\n    Staging-&gt;&gt;Prod: Promote after approval\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-95\"><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\">Commands<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-96\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git checkout main\ngit pull --ff-only origin main\ngit checkout -b feature\/EVP<span class=\"hljs-number\">-123<\/span>-add-alerts\n\n<span class=\"hljs-comment\"># edit files<\/span>\ngit add .\ngit commit -m <span class=\"hljs-string\">\"feat(alerts): add threshold alert config\"<\/span>\n\ngit push -u origin feature\/EVP<span class=\"hljs-number\">-123<\/span>-add-alerts\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-96\"><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\">After review and merge:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout main\ngit pull --ff-only origin main\ngit branch -d feature\/EVP-123-add-alerts\ngit 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\">60. Example complete workflow: Terraform team<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-97\" 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;Ticket: add NAT Gateway]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Create 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;Edit Terraform]<\/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 fmt]<\/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;terraform validate]<\/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;Open PR]<\/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;CI generates plan]<\/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;Review resource changes]<\/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;Security\/cost review]<\/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;Approval]<\/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;Merge]<\/span>\n    <span class=\"hljs-selector-tag\">K<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L<\/span><span class=\"hljs-selector-attr\">&#91;Apply through controlled pipeline]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-97\"><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\">PR title<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-98\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">feat(network)<\/span>: add NAT gateway per AZ for staging\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-98\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">PR body<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-99\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Summary<\/span>\n\nAdds one NAT Gateway per AZ <span class=\"hljs-keyword\">for<\/span> staging <span class=\"hljs-keyword\">private<\/span> subnets.\n\n<span class=\"hljs-comment\">## Terraform plan summary<\/span>\n\n- Creates:\n  - <span class=\"hljs-number\">2<\/span> NAT Gateways\n  - <span class=\"hljs-number\">2<\/span> Elastic IP associations\n  - Route updates <span class=\"hljs-keyword\">for<\/span> <span class=\"hljs-keyword\">private<\/span> subnets\n\n<span class=\"hljs-comment\">## Risk<\/span>\n\nMedium. Route table changes affect outbound traffic from <span class=\"hljs-keyword\">private<\/span> subnets.\n\n<span class=\"hljs-comment\">## Rollback<\/span>\n\nRevert PR <span class=\"hljs-keyword\">and<\/span> re-apply previous Terraform configuration.\n\n<span class=\"hljs-comment\">## Validation<\/span>\n\n- terraform fmt\n- terraform validate\n- terraform plan\n- connectivity test from <span class=\"hljs-keyword\">private<\/span> subnet\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-99\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">61. Example complete workflow: Kubernetes GitOps team<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-100\" 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 PR merged]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Build image sha-abc123]<\/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 GitOps PR]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Update dev manifest]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Argo CD sync dev]<\/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 prod]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-100\"><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\">Important rule<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Build once, promote the same artifact.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Build separate image for dev, staging, prod\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Build one immutable image and promote it\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\">62. Team policy: recommended default<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this as an internal engineering standard.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Branches<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nfeature\/*\nbugfix\/*\nhotfix\/*\nrelease\/*\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Rules<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Rule<\/th><th>Policy<\/th><\/tr><\/thead><tbody><tr><td>Direct push to <code>main<\/code><\/td><td>Not allowed<\/td><\/tr><tr><td>PR required<\/td><td>Yes<\/td><\/tr><tr><td>CI required<\/td><td>Yes<\/td><\/tr><tr><td>Review required<\/td><td>At least 1<\/td><\/tr><tr><td>CODEOWNERS<\/td><td>Required for critical directories<\/td><\/tr><tr><td>Squash merge<\/td><td>Default<\/td><\/tr><tr><td>Release tags<\/td><td>Required for production<\/td><\/tr><tr><td>Hotfix branch<\/td><td>Required for emergency fixes<\/td><\/tr><tr><td>Branch deletion<\/td><td>Delete after merge<\/td><\/tr><tr><td>Secrets scan<\/td><td>Required<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Main branch definition<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main is always production-ready.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Pull request definition<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">A PR is not a storage place for unfinished work.\nA PR is a reviewable unit of change.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Release definition<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">A release is a tagged, traceable, deployable artifact.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">63. Choosing a workflow: final decision matrix<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Condition<\/th><th>Choose<\/th><\/tr><\/thead><tbody><tr><td>New team, simple app<\/td><td>GitHub Flow<\/td><\/tr><tr><td>Strong CI\/CD, frequent deploys<\/td><td>Trunk-based<\/td><\/tr><tr><td>Need staging \u2192 prod promotion<\/td><td>GitLab Flow<\/td><\/tr><tr><td>Versioned software with release windows<\/td><td>Gitflow<\/td><\/tr><tr><td>Mobile app approval cycle<\/td><td>Gitflow or release branches<\/td><\/tr><tr><td>Kubernetes GitOps<\/td><td>Main + environment folders<\/td><\/tr><tr><td>Terraform infrastructure<\/td><td>Feature branch + protected main<\/td><\/tr><tr><td>Highly regulated system<\/td><td>Gitflow or GitLab Flow with strict controls<\/td><\/tr><tr><td>Monorepo<\/td><td>Trunk-based with CODEOWNERS<\/td><\/tr><tr><td>Open source<\/td><td>Fork + PR workflow<\/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\">64. The \u201cworld-class\u201d Git workflow blueprint<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is the final architecture I recommend for serious teams.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-101\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">flowchart TD\n    A&#91;Work item created] --&gt; B&#91;Create short-lived branch]\n    B --&gt; C&#91;Local commits <span class=\"hljs-keyword\">with<\/span> Conventional Commit style]\n    C --&gt; D&#91;Pre-commit checks]\n    D --&gt; E&#91;Push branch]\n    E --&gt; F&#91;Open PR\/MR]\n    F --&gt; G&#91;Automated CI]\n    F --&gt; H&#91;Code review]\n    G --&gt; I{Checks pass?}\n    H --&gt; J{Approved?}\n    I -- No --&gt; C\n    J -- No --&gt; C\n    I -- Yes --&gt; K&#91;Merge to protected main]\n    J -- Yes --&gt; K\n    K --&gt; L&#91;Build immutable artifact]\n    L --&gt; M&#91;Deploy to dev\/staging]\n    M --&gt; N{Production approval or auto-deploy?}\n    N -- Approval --&gt; O&#91;Deploy production]\n    N -- Auto --&gt; O\n    O --&gt; P&#91;Tag release]\n    P --&gt; Q&#91;Monitor]\n    Q --&gt; R{Issue?}\n    R -- Yes --&gt; S&#91;Rollback\/revert\/hotfix]\n    R -- No --&gt; T&#91;Done]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-101\"><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\">Blueprint policies<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Branching<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-102\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">main\nfeature\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ticket<\/span>&gt;<\/span>-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">description<\/span>&gt;<\/span>\nbugfix\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ticket<\/span>&gt;<\/span>-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">description<\/span>&gt;<\/span>\nhotfix\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ticket<\/span>&gt;<\/span>-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">description<\/span>&gt;<\/span>\nrelease\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-102\"><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<h3 class=\"wp-block-heading\">Commit format<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-103\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">feat(scope)<\/span>: summary\n<span class=\"hljs-attribute\">fix(scope)<\/span>: summary\n<span class=\"hljs-attribute\">chore(scope)<\/span>: summary\n<span class=\"hljs-attribute\">docs(scope)<\/span>: summary\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-103\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Merge strategy<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-104\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Default<\/span>: squash merge\nExceptions: release branches <span class=\"hljs-keyword\">and<\/span> complex audited features may <span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">merge<\/span> <span class=\"hljs-title\">commits<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-104\"><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<h3 class=\"wp-block-heading\">Release strategy<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Every production deployment maps to:\n- Git commit SHA\n- Build artifact\n- Container image digest\n- Git tag or release record\n- CI\/CD run\n- Approver, if manual approval exists\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">CI\/CD gates<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">No green CI, no merge.\nNo review, no merge.\nNo rollback plan, no production release.\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\">65. Git command cheat sheet<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Daily commands<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-105\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git status\ngit fetch origin\ngit pull --ff-only\ngit checkout -b feature\/name\ngit add .\ngit commit -m <span class=\"hljs-string\">\"feat: message\"<\/span>\ngit push -u origin feature\/name\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-105\"><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\">History<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-106\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">git log --oneline --decorate --graph --all\ngit show <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">sha<\/span>&gt;<\/span>\ngit diff\ngit diff main...HEAD\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-106\"><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\">Branches<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-107\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git branch\ngit branch -a\ngit checkout main\ngit <span class=\"hljs-keyword\">switch<\/span> main\ngit checkout -b feature\/name\ngit branch -d feature\/name\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-107\"><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\">Merge\/rebase<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-108\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git merge main\ngit rebase main\ngit rebase --<span class=\"hljs-keyword\">continue<\/span>\ngit rebase --abort\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-108\"><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\">Undo<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-109\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">restore<\/span> <span class=\"hljs-selector-tag\">file<\/span><span class=\"hljs-selector-class\">.txt<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">restore<\/span> <span class=\"hljs-selector-tag\">--staged<\/span> <span class=\"hljs-selector-tag\">file<\/span><span class=\"hljs-selector-class\">.txt<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">reset<\/span> <span class=\"hljs-selector-tag\">--soft<\/span> <span class=\"hljs-selector-tag\">HEAD<\/span>~1\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">revert<\/span> &lt;<span class=\"hljs-selector-tag\">sha<\/span>&gt;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-109\"><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\">Tags<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-110\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">tag<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">-a<\/span> <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span> <span class=\"hljs-selector-tag\">-m<\/span> \"<span class=\"hljs-selector-tag\">Release<\/span> <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\">git<\/span> <span class=\"hljs-selector-tag\">push<\/span> <span class=\"hljs-selector-tag\">origin<\/span> <span class=\"hljs-selector-tag\">v1<\/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-110\"><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\">Cleanup<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git fetch --prune\ngit branch --merged\ngit clean -nd\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\">66. The final advice<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A beginner thinks:<\/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\">Git workflow means which branch name to use.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">A senior engineer thinks:<\/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\">Git workflow means how we protect production while helping developers move fast.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">An architect thinks:<\/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\">Git workflow is a delivery control system: source control, review, testing, release, rollback, audit, and learning.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">The best workflow is not the most complex one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The best workflow is the one where:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Developers understand it.<\/li>\n\n\n\n<li>CI enforces it.<\/li>\n\n\n\n<li>Releases are traceable.<\/li>\n\n\n\n<li>Rollbacks are simple.<\/li>\n\n\n\n<li>Branches are short-lived.<\/li>\n\n\n\n<li>Production is protected.<\/li>\n\n\n\n<li>Teams can move fast without fear.<\/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-111\" 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\nRequired CI\nSquash merge\nTags <span class=\"hljs-keyword\">for<\/span> releases\nFeature flags <span class=\"hljs-keyword\">for<\/span> incomplete work\nHotfix branches <span class=\"hljs-keyword\">for<\/span> emergencies\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-111\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then evolve toward trunk-based development when your tests, CI, reviews, and release automation are strong enough.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>From First Commit to Enterprise-Grade Delivery Best title:Git Workflow Master Guide: Branching Strategies, Pull Requests, Releases, CI\/CD, and Team Governance 1. What is a Git workflow? A&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-77503","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77503","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=77503"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77503\/revisions"}],"predecessor-version":[{"id":77504,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77503\/revisions\/77504"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=77503"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=77503"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=77503"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}