{"id":77505,"date":"2026-07-07T01:42:18","date_gmt":"2026-07-07T01:42:18","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=77505"},"modified":"2026-07-07T01:53:46","modified_gmt":"2026-07-07T01:53:46","slug":"version-control-workflow-master-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/version-control-workflow-master-tutorial\/","title":{"rendered":"Version Control Workflow Master Tutorial"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">A Complete One-Stop Guide from Beginner to Enterprise Architecture<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. What is a version control workflow?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>version control workflow<\/strong> is the complete process a team follows to manage changes to files, source code, infrastructure, configuration, documentation, releases, and production systems.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It answers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Who can change what?<\/li>\n\n\n\n<li>Where should changes be made?<\/li>\n\n\n\n<li>How are changes reviewed?<\/li>\n\n\n\n<li>How are conflicts resolved?<\/li>\n\n\n\n<li>How does code move from laptop to production?<\/li>\n\n\n\n<li>How are releases tagged?<\/li>\n\n\n\n<li>How are mistakes rolled back?<\/li>\n\n\n\n<li>How do teams protect production?<\/li>\n\n\n\n<li>How do audits, security, and compliance fit in?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Version control systems provide commands and storage models; the workflow is the <strong>human, technical, and automation process<\/strong> built around them. Git\u2019s official reference, for example, organizes commands around creating repositories, snapshots, 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 simplest definition<\/h1>\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>Version control workflow is the operating system of software collaboration.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">It is not only Git.<br>It is not only branches.<br>It is not only pull requests.<br>It is not only releases.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is the full path from:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Idea \u2192 Change \u2192 Review \u2192 Integration \u2192 Test \u2192 Release \u2192 Deploy \u2192 Monitor \u2192 Rollback if needed\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\">3. Why version control workflow matters<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Without a workflow, teams face:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>overwritten changes<\/li>\n\n\n\n<li>broken builds<\/li>\n\n\n\n<li>unclear ownership<\/li>\n\n\n\n<li>impossible rollbacks<\/li>\n\n\n\n<li>unreviewed production changes<\/li>\n\n\n\n<li>risky releases<\/li>\n\n\n\n<li>painful merge conflicts<\/li>\n\n\n\n<li>hidden security mistakes<\/li>\n\n\n\n<li>poor audit trails<\/li>\n\n\n\n<li>\u201cit worked on my machine\u201d chaos<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">With a strong workflow, teams get:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>safe collaboration<\/li>\n\n\n\n<li>faster delivery<\/li>\n\n\n\n<li>traceable changes<\/li>\n\n\n\n<li>clean reviews<\/li>\n\n\n\n<li>predictable releases<\/li>\n\n\n\n<li>safer production<\/li>\n\n\n\n<li>easier rollback<\/li>\n\n\n\n<li>better onboarding<\/li>\n\n\n\n<li>better compliance<\/li>\n\n\n\n<li>better engineering culture<\/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\">4. Version control workflow in one diagram<\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Work item \/ requirement \/ bug \/ incident] --&gt; B&#91;Create change]\n    B --&gt; C&#91;Local version control]\n    C --&gt; D&#91;Branch or workspace]\n    D --&gt; E&#91;Commit changes]\n    E --&gt; F&#91;Push or submit]\n    F --&gt; G&#91;Review: PR \/ MR \/ changelist]\n    G --&gt; H&#91;Automated checks]\n    H --&gt; I{Approved and checks passed?}\n    I -- No --&gt; B\n    I -- Yes --&gt; J&#91;Merge \/ integrate]\n    J --&gt; K&#91;Build artifact]\n    K --&gt; L&#91;Test environment]\n    L --&gt; M&#91;Release candidate]\n    M --&gt; N&#91;Production deployment]\n    N --&gt; O&#91;Tag \/ release record]\n    O --&gt; P&#91;Monitor]\n    P --&gt; Q{Problem?}\n    Q -- Yes --&gt; R&#91;Rollback \/ revert \/ hotfix]\n    Q -- No --&gt; S&#91;Done]\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Version control is not only for code<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A mature organization versions many things.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Asset<\/th><th>Should it be versioned?<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>Application code<\/td><td>Yes<\/td><td>Backend, frontend, mobile<\/td><\/tr><tr><td>Infrastructure<\/td><td>Yes<\/td><td>Terraform, Pulumi, CloudFormation<\/td><\/tr><tr><td>Kubernetes manifests<\/td><td>Yes<\/td><td>Helm, Kustomize, YAML<\/td><\/tr><tr><td>Database migrations<\/td><td>Yes<\/td><td>Flyway, Liquibase, Rails migrations<\/td><\/tr><tr><td>Documentation<\/td><td>Yes<\/td><td>Markdown, runbooks, architecture docs<\/td><\/tr><tr><td>API contracts<\/td><td>Yes<\/td><td>OpenAPI, protobuf, GraphQL schema<\/td><\/tr><tr><td>CI\/CD pipelines<\/td><td>Yes<\/td><td>GitHub Actions, GitLab CI, Jenkinsfile<\/td><\/tr><tr><td>Security policies<\/td><td>Yes<\/td><td>OPA, Kyverno, IAM policies<\/td><\/tr><tr><td>Release notes<\/td><td>Yes<\/td><td>Changelog, release metadata<\/td><\/tr><tr><td>Configuration<\/td><td>Usually yes<\/td><td>Environment templates, feature flags<\/td><\/tr><tr><td>Secrets<\/td><td>No, not raw secrets<\/td><td>Use secret managers instead<\/td><\/tr><tr><td>Build artifacts<\/td><td>Usually no<\/td><td>Store in artifact\/container registry<\/td><\/tr><tr><td>Large binary assets<\/td><td>Sometimes<\/td><td>Use LFS, artifact storage, or Perforce<\/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 four layers of version control workflow<\/h1>\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;Version Control System]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Branching \/ Codeline 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 and Review 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 and Deployment Governance]<\/span>\n\n    <span class=\"hljs-selector-tag\">A1<\/span><span class=\"hljs-selector-attr\">&#91;Git, SVN, Mercurial, Perforce]<\/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;Mainline, release branches, streams, trunks]<\/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, changelist, code owners, approvals]<\/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;Tags, builds, environments, 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>Meaning<\/th><th>Examples<\/th><\/tr><\/thead><tbody><tr><td><strong>VCS tool layer<\/strong><\/td><td>The actual version control system<\/td><td>Git, Subversion, Mercurial, Perforce<\/td><\/tr><tr><td><strong>Branching layer<\/strong><\/td><td>How parallel work is organized<\/td><td>Trunk-based, Gitflow, release branches<\/td><\/tr><tr><td><strong>Collaboration layer<\/strong><\/td><td>How humans and automation approve changes<\/td><td>PRs, code review, CI checks<\/td><\/tr><tr><td><strong>Release governance layer<\/strong><\/td><td>How approved changes become production<\/td><td>tags, releases, deployment gates<\/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\">7. Types of version control systems<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">7.1 Local version control<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Old and simple.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">project-v1<\/span><span class=\"hljs-selector-class\">.zip<\/span>\n<span class=\"hljs-selector-tag\">project-v2<\/span><span class=\"hljs-selector-class\">.zip<\/span>\n<span class=\"hljs-selector-tag\">project-final<\/span><span class=\"hljs-selector-class\">.zip<\/span>\n<span class=\"hljs-selector-tag\">project-final-real<\/span><span class=\"hljs-selector-class\">.zip<\/span>\n<span class=\"hljs-selector-tag\">project-final-real-latest<\/span><span class=\"hljs-selector-class\">.zip<\/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\">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 not professional version control. It has no proper history, collaboration, branching, or rollback discipline.<\/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 Centralized version control<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In centralized version control, there is one central server. Developers check out files, make changes, and commit back to the central repository.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CVS<\/li>\n\n\n\n<li>Subversion\/SVN<\/li>\n\n\n\n<li>Perforce Helix Core in centralized style<\/li>\n\n\n\n<li>Team Foundation Version Control<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Subversion\u2019s documentation explains core concepts such as the repository, working copy, revisions, and two collaboration models: lock-modify-unlock and copy-modify-merge.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Central Repository]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Developer A Working Copy]<\/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;Developer B Working Copy]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Developer C Working Copy]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">A<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">A<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">A<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Pros<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Simple mental model<\/li>\n\n\n\n<li>Central control<\/li>\n\n\n\n<li>Works well for locking large files<\/li>\n\n\n\n<li>Useful in enterprise and game development contexts<\/li>\n\n\n\n<li>Easier to enforce centralized access control<\/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>Offline work is limited<\/li>\n\n\n\n<li>Branching can feel heavier<\/li>\n\n\n\n<li>Central server dependency<\/li>\n\n\n\n<li>Less flexible local history<\/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.3 Distributed version control<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In distributed version control, every developer has a full repository copy with history.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Git<\/li>\n\n\n\n<li>Mercurial<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Mercurial describes itself as a free distributed source control management tool designed to handle projects of any size. Git is also distributed and provides commands for local snapshots, branching, merging, fetching, pushing, rebasing, tagging, and debugging.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">flowchart TD\n    A&#91;Remote Repository] <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">--<\/span>&gt;<\/span> B&#91;Developer A Full Repository]\n    A <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">--<\/span>&gt;<\/span> C&#91;Developer B Full Repository]\n    A <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">--<\/span>&gt;<\/span> D&#91;Developer C Full Repository]\n    B <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">--<\/span>&gt;<\/span> C\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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\">Pros<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Fast local operations<\/li>\n\n\n\n<li>Strong branching<\/li>\n\n\n\n<li>Offline commits<\/li>\n\n\n\n<li>Flexible workflows<\/li>\n\n\n\n<li>Excellent for open-source collaboration<\/li>\n\n\n\n<li>Works naturally with pull requests<\/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>More concepts to learn<\/li>\n\n\n\n<li>History rewriting can be dangerous<\/li>\n\n\n\n<li>Teams need clear rules<\/li>\n\n\n\n<li>Access control is often repository-level, not file-level<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Copy-modify-merge vs lock-modify-unlock<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">These are the two classic collaboration models.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8.1 Copy-modify-merge<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Developers copy the project, modify files, then merge changes.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">sequenceDiagram\n    participant Repo <span class=\"hljs-keyword\">as<\/span> Repository\n    participant A <span class=\"hljs-keyword\">as<\/span> Developer A\n    participant B <span class=\"hljs-keyword\">as<\/span> Developer B\n\n    Repo-&gt;&gt;A: Checkout \/ <span class=\"hljs-keyword\">clone<\/span>\n    Repo-&gt;&gt;B: Checkout \/ <span class=\"hljs-keyword\">clone<\/span>\n    A-&gt;&gt;A: Modify file\n    B-&gt;&gt;B: Modify same file\n    A-&gt;&gt;Repo: Commit \/ push\n    B-&gt;&gt;Repo: Merge conflict <span class=\"hljs-keyword\">or<\/span> automatic merge\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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\">Best for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Source code<\/li>\n\n\n\n<li>Text files<\/li>\n\n\n\n<li>Config files<\/li>\n\n\n\n<li>Documentation<\/li>\n\n\n\n<li>Infrastructure code<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8.2 Lock-modify-unlock<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A developer locks a file before editing, preventing others from modifying it at the same time.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">sequenceDiagram\n    participant Repo <span class=\"hljs-keyword\">as<\/span> Repository\n    participant A <span class=\"hljs-keyword\">as<\/span> Developer A\n    participant B <span class=\"hljs-keyword\">as<\/span> Developer B\n\n    A-&gt;&gt;Repo: Lock file\n    B-&gt;&gt;Repo: <span class=\"hljs-keyword\">Try<\/span> to edit file\n    Repo--&gt;&gt;B: File locked\n    A-&gt;&gt;Repo: Commit changes\n    A-&gt;&gt;Repo: Unlock file\n    B-&gt;&gt;Repo: Edit allowed\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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\">Best for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Binary assets<\/li>\n\n\n\n<li>Game files<\/li>\n\n\n\n<li>Design files<\/li>\n\n\n\n<li>Large media files<\/li>\n\n\n\n<li>Files that cannot be merged automatically<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Subversion\u2019s versioning model documentation explicitly discusses lock-modify-unlock and copy-modify-merge as approaches to shared editing.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Core 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>Repository<\/td><td>Storage for project history<\/td><\/tr><tr><td>Working copy<\/td><td>Local editable files<\/td><\/tr><tr><td>Commit<\/td><td>Saved snapshot\/change<\/td><\/tr><tr><td>Revision<\/td><td>Version identifier, common in centralized systems<\/td><\/tr><tr><td>Changeset<\/td><td>Set of file changes<\/td><\/tr><tr><td>Branch<\/td><td>Separate line of development<\/td><\/tr><tr><td>Trunk \/ mainline<\/td><td>Primary integration line<\/td><\/tr><tr><td>Tag<\/td><td>Named pointer to a release or important revision<\/td><\/tr><tr><td>Merge<\/td><td>Combine changes from different lines<\/td><\/tr><tr><td>Rebase<\/td><td>Replay commits onto another base<\/td><\/tr><tr><td>Changelist<\/td><td>Reviewable set of changes, common in Perforce-style systems<\/td><\/tr><tr><td>Pull request<\/td><td>Request to review and merge changes<\/td><\/tr><tr><td>Merge request<\/td><td>GitLab\u2019s term for pull request<\/td><\/tr><tr><td>Code owner<\/td><td>Required reviewer for specific files<\/td><\/tr><tr><td>Conflict<\/td><td>Change that cannot be automatically merged<\/td><\/tr><tr><td>Release branch<\/td><td>Branch used to stabilize a version<\/td><\/tr><tr><td>Hotfix<\/td><td>Urgent fix for production<\/td><\/tr><tr><td>Backport<\/td><td>Apply a fix to an older supported version<\/td><\/tr><tr><td>Rollback<\/td><td>Return production to a safe state<\/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\">10. The version control lifecycle<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Create]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Change]<\/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;Review]<\/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;Integrate]<\/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;Build]<\/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;Test]<\/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;Release]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Deploy]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Operate]<\/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;Learn]<\/span>\n    <span class=\"hljs-selector-tag\">J<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">A<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Every workflow is some version of this loop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Weak teams only think about \u201ccommit and push.\u201d<br>Strong teams think about the full lifecycle.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Beginner workflow: one developer<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this for learning or personal projects.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" 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;Edit files]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Check status]<\/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;Stage changes]<\/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;Commit]<\/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;Push backup]<\/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\">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 using Git:<\/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\">git status\ngit add .\ngit commit -m <span class=\"hljs-string\">\"docs: add project introduction\"<\/span>\ngit push origin main\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\">Good beginner rules:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Commit small changes.<\/li>\n\n\n\n<li>Write meaningful messages.<\/li>\n\n\n\n<li>Push frequently.<\/li>\n\n\n\n<li>Do not store secrets.<\/li>\n\n\n\n<li>Tag important versions.<\/li>\n\n\n\n<li>Keep a clean README.<\/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\">12. Basic team workflow<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">flowchart TD\n    A&#91;Start <span class=\"hljs-keyword\">from<\/span> main] --&gt; B&#91;Create branch]\n    B --&gt; C&#91;Make commits]\n    C --&gt; D&#91;Push branch]\n    D --&gt; E&#91;Open PR \/ MR]\n    E --&gt; F&#91;Review]\n    E --&gt; G&#91;CI checks]\n    F --&gt; H{Approved?}\n    G --&gt; I{Passed?}\n    H -- No --&gt; C\n    I -- No --&gt; C\n    H -- Yes --&gt; J&#91;Merge]\n    I -- Yes --&gt; J\n    J --&gt; K&#91;Delete branch]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is the default professional workflow for many teams.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Version control workflow maturity model<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">L1<\/span><span class=\"hljs-selector-attr\">&#91;Level 1: Manual file copies]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L2<\/span><span class=\"hljs-selector-attr\">&#91;Level 2: Basic commits]<\/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: Shared repository]<\/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: Branches]<\/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: Pull requests \/ reviews]<\/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: Protected mainline]<\/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: Required CI checks]<\/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: Automated releases]<\/span>\n    <span class=\"hljs-selector-tag\">L8<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L9<\/span><span class=\"hljs-selector-attr\">&#91;Level 9: Feature flags and progressive delivery]<\/span>\n    <span class=\"hljs-selector-tag\">L9<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L10<\/span><span class=\"hljs-selector-attr\">&#91;Level 10: Audited, compliant, self-service delivery]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Level<\/th><th>Behavior<\/th><th>Risk<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Files copied manually<\/td><td>Extreme<\/td><\/tr><tr><td>2<\/td><td>Local commits only<\/td><td>Very high<\/td><\/tr><tr><td>3<\/td><td>Shared repository<\/td><td>High<\/td><\/tr><tr><td>4<\/td><td>Branches used<\/td><td>Medium-high<\/td><\/tr><tr><td>5<\/td><td>Reviews required<\/td><td>Medium<\/td><\/tr><tr><td>6<\/td><td>Mainline protected<\/td><td>Lower<\/td><\/tr><tr><td>7<\/td><td>CI required<\/td><td>Low<\/td><\/tr><tr><td>8<\/td><td>Releases automated<\/td><td>Low<\/td><\/tr><tr><td>9<\/td><td>Progressive delivery<\/td><td>Very low<\/td><\/tr><tr><td>10<\/td><td>Full governance<\/td><td>Enterprise-grade<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. What is a codeline?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>codeline<\/strong> is a line of development.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In Git, a codeline is usually a branch.<br>In SVN, it may be a directory path like <code>\/trunk<\/code>, <code>\/branches\/release-1.0<\/code>, or <code>\/tags\/v1.0<\/code>.<br>In Perforce, it may be represented through streams.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Subversion\u2019s branching and merging documentation treats branching and merging as fundamental version-control concepts and discusses release branches, feature branches, vendor branches, tags, and repository layout. Perforce Streams are designed to simplify branching and merging and provide a graphical representation of parent-child stream relationships.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. The three most important codelines<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Most teams need three conceptual lines.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Development Line]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Integration Line]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Release Line]<\/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;Production Line]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Codeline<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Development line<\/td><td>Where individual work happens<\/td><\/tr><tr><td>Integration line<\/td><td>Where reviewed changes combine<\/td><\/tr><tr><td>Release line<\/td><td>Where a version is stabilized<\/td><\/tr><tr><td>Production line<\/td><td>What is actually running or shipped<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In simple teams, <code>main<\/code> may be both integration and production. In complex teams, these are separated.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Branching strategies<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>branching strategy<\/strong> defines how parallel work is organized.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common strategies:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Mainline workflow<\/li>\n\n\n\n<li>Feature branch workflow<\/li>\n\n\n\n<li>GitHub Flow<\/li>\n\n\n\n<li>GitLab Flow<\/li>\n\n\n\n<li>Gitflow<\/li>\n\n\n\n<li>Trunk-based development<\/li>\n\n\n\n<li>Release branch workflow<\/li>\n\n\n\n<li>Environment branch workflow<\/li>\n\n\n\n<li>Stream-based workflow<\/li>\n\n\n\n<li>Fork-based workflow<\/li>\n\n\n\n<li>GitOps workflow<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">GitLab\u2019s documentation says branching and code-management strategies depend on product needs and lists major categories such as web services, long-lived release branches, and branch-per-environment approaches.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. Strategy 1: Mainline workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Concept<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Everyone integrates into one primary line.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"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-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Solo projects<\/li>\n\n\n\n<li>Very small teams<\/li>\n\n\n\n<li>Simple services<\/li>\n\n\n\n<li>Internal tools<\/li>\n\n\n\n<li>Repositories with strong CI and small changes<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Risk<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Without review and CI, mainline can break easily.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Strategy 2: Feature branch workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Concept<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each task gets a temporary branch.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" 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\/search\n    checkout feature\/search\n    commit id: <span class=\"hljs-string\">\"search-1\"<\/span>\n    commit id: <span class=\"hljs-string\">\"search-2\"<\/span>\n    checkout main\n    merge feature\/search\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><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\">Rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Branch from latest main.<\/li>\n\n\n\n<li>Keep branch short-lived.<\/li>\n\n\n\n<li>Open PR\/MR.<\/li>\n\n\n\n<li>Run CI.<\/li>\n\n\n\n<li>Review.<\/li>\n\n\n\n<li>Merge.<\/li>\n\n\n\n<li>Delete branch.<\/li>\n<\/ul>\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 engineering<\/li>\n\n\n\n<li>DevOps\/IaC repositories<\/li>\n\n\n\n<li>Backend services<\/li>\n\n\n\n<li>Frontend applications<\/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\">19. Strategy 3: GitHub Flow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Concept<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Flow is a lightweight branch-based workflow where developers create a branch, commit changes, open a pull request, discuss\/review, and merge to the default branch. GitHub describes GitHub Flow as a lightweight branch-based workflow.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Create branch]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Commit changes]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Open pull request]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Review and discuss]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;CI checks]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Merge]<\/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-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SaaS<\/li>\n\n\n\n<li>Web applications<\/li>\n\n\n\n<li>APIs<\/li>\n\n\n\n<li>Teams with frequent deployment<\/li>\n\n\n\n<li>Teams that keep <code>main<\/code> production-ready<\/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\">20. Strategy 4: GitLab Flow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Concept<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitLab Flow adds more release and environment structure around feature branches and merge requests.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Feature branch]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Merge request]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;main]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;staging]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;production]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">GitLab\u2019s branching strategy documentation describes models for web services, long-lived release branches, and branch-per-environment workflows.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Teams with staging and production branches<\/li>\n\n\n\n<li>Teams that need environment promotion<\/li>\n\n\n\n<li>Enterprise applications<\/li>\n\n\n\n<li>Teams that want more structure than GitHub Flow but less than Gitflow<\/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\">21. Strategy 5: Gitflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Concept<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Gitflow uses multiple long-lived and short-lived branches.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typical branches:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\ndevelop\nfeature\/*\nrelease\/*\nhotfix\/*\n<\/code><\/span><\/pre>\n\n<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\">\"prod-1\"<\/span>\n    branch develop\n    checkout develop\n    commit id: <span class=\"hljs-string\">\"dev-1\"<\/span>\n    branch feature\/reporting\n    checkout feature\/reporting\n    commit id: <span class=\"hljs-string\">\"feature\"<\/span>\n    checkout develop\n    merge feature\/reporting\n    branch release\/<span class=\"hljs-number\">1.2<\/span><span class=\"hljs-number\">.0<\/span>\n    checkout release\/<span class=\"hljs-number\">1.2<\/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.2<\/span><span class=\"hljs-number\">.0<\/span> tag: <span class=\"hljs-string\">\"v1.2.0\"<\/span>\n    checkout develop\n    merge release\/<span class=\"hljs-number\">1.2<\/span><span class=\"hljs-number\">.0<\/span>\n    checkout main\n    branch hotfix\/<span class=\"hljs-number\">1.2<\/span><span class=\"hljs-number\">.1<\/span>\n    checkout hotfix\/<span class=\"hljs-number\">1.2<\/span><span class=\"hljs-number\">.1<\/span>\n    commit id: <span class=\"hljs-string\">\"hotfix\"<\/span>\n    checkout main\n    merge hotfix\/<span class=\"hljs-number\">1.2<\/span><span class=\"hljs-number\">.1<\/span> tag: <span class=\"hljs-string\">\"v1.2.1\"<\/span>\n    checkout develop\n    merge hotfix\/<span class=\"hljs-number\">1.2<\/span><span class=\"hljs-number\">.1<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Versioned software<\/li>\n\n\n\n<li>Mobile apps<\/li>\n\n\n\n<li>Desktop apps<\/li>\n\n\n\n<li>Firmware<\/li>\n\n\n\n<li>SDKs<\/li>\n\n\n\n<li>Products with release windows<\/li>\n\n\n\n<li>Products supporting older versions<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Weakness<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Gitflow can be heavy for teams deploying continuously.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Strategy 6: Trunk-based development<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Concept<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Developers integrate small changes into a single trunk frequently.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"A\"<\/span>\n    branch tiny-change<span class=\"hljs-number\">-1<\/span>\n    checkout tiny-change<span class=\"hljs-number\">-1<\/span>\n    commit id: <span class=\"hljs-string\">\"B\"<\/span>\n    checkout main\n    merge tiny-change<span class=\"hljs-number\">-1<\/span>\n    branch tiny-change<span class=\"hljs-number\">-2<\/span>\n    checkout tiny-change<span class=\"hljs-number\">-2<\/span>\n    commit id: <span class=\"hljs-string\">\"C\"<\/span>\n    checkout main\n    merge tiny-change<span class=\"hljs-number\">-2<\/span>\n    commit id: <span class=\"hljs-string\">\"D\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development is commonly described as developers collaborating on a single branch called trunk while avoiding long-lived development branches.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>High-performing engineering teams<\/li>\n\n\n\n<li>Continuous integration<\/li>\n\n\n\n<li>Continuous delivery<\/li>\n\n\n\n<li>SaaS<\/li>\n\n\n\n<li>Platform teams<\/li>\n\n\n\n<li>Monorepos<\/li>\n\n\n\n<li>Teams using feature flags<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Required discipline<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Small changes<\/li>\n\n\n\n<li>Fast CI<\/li>\n\n\n\n<li>Feature flags<\/li>\n\n\n\n<li>Strong tests<\/li>\n\n\n\n<li>Quick reviews<\/li>\n\n\n\n<li>Easy rollback<\/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\">23. Strategy 7: Release branch workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Concept<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A release branch stabilizes a version while main continues development.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"A\"<\/span>\n    commit id: <span class=\"hljs-string\">\"B\"<\/span>\n    branch release\/<span class=\"hljs-number\">2.0<\/span>\n    checkout release\/<span class=\"hljs-number\">2.0<\/span>\n    commit id: <span class=\"hljs-string\">\"rc-fix-1\"<\/span>\n    commit id: <span class=\"hljs-string\">\"rc-fix-2\"<\/span>\n    checkout main\n    commit id: <span class=\"hljs-string\">\"future-work\"<\/span>\n    checkout release\/<span class=\"hljs-number\">2.0<\/span>\n    commit id: <span class=\"hljs-string\">\"release-ready\"<\/span> tag: <span class=\"hljs-string\">\"v2.0.0\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Release candidates<\/li>\n\n\n\n<li>QA cycles<\/li>\n\n\n\n<li>Certification<\/li>\n\n\n\n<li>Mobile app stores<\/li>\n\n\n\n<li>Enterprise software<\/li>\n\n\n\n<li>Long-term support<\/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\">24. Strategy 8: Environment branch workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Concept<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Branches represent deployment environments.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\ndev\nstaging\nproduction\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;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;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;production]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Simple deployment pipelines<\/li>\n\n\n\n<li>Teams using branch-based deployment triggers<\/li>\n\n\n\n<li>Some GitLab Flow setups<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Risk<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Environment branches can drift and become hard to reason about.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Better modern alternative:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main branch + environment folders + promotion pipeline\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. Strategy 9: Fork-based workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Concept<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Contributors fork the repository, push changes to their fork, then open a pull request to the upstream project.<\/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\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Upstream repository]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Contributor fork]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Contributor branch]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Pull request]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Maintainer review]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Merge upstream]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-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\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Open-source projects<\/li>\n\n\n\n<li>External contributors<\/li>\n\n\n\n<li>Repositories where contributors should not have direct write access<\/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\">26. Strategy 10: Stream-based workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Concept<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Stream-based workflows are common in Perforce Helix Core. Streams define parent-child relationships and control how changes flow between codelines.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Mainline Stream]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Development Stream]<\/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;Release Stream]<\/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;Hotfix Stream]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Perforce says streams reduce administration around codeline policy and workspace management, and the Stream Graph shows parent-child stream relationships and whether merging is required.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Game development<\/li>\n\n\n\n<li>Large binary assets<\/li>\n\n\n\n<li>Huge repositories<\/li>\n\n\n\n<li>Enterprise products<\/li>\n\n\n\n<li>Teams that need file locking and stream governance<\/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\">27. Comparing workflow strategies<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Workflow<\/th><th>Complexity<\/th><th>Speed<\/th><th>Governance<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>Mainline<\/td><td>Low<\/td><td>High<\/td><td>Low<\/td><td>Small teams<\/td><\/tr><tr><td>Feature branch<\/td><td>Medium<\/td><td>Medium-high<\/td><td>Medium<\/td><td>Most teams<\/td><\/tr><tr><td>GitHub Flow<\/td><td>Low-medium<\/td><td>High<\/td><td>Medium<\/td><td>Web\/SaaS<\/td><\/tr><tr><td>GitLab Flow<\/td><td>Medium<\/td><td>Medium<\/td><td>High<\/td><td>Staging\/prod promotion<\/td><\/tr><tr><td>Gitflow<\/td><td>High<\/td><td>Medium<\/td><td>High<\/td><td>Versioned releases<\/td><\/tr><tr><td>Trunk-based<\/td><td>Medium-high<\/td><td>Very high<\/td><td>High if automated<\/td><td>Mature CI\/CD teams<\/td><\/tr><tr><td>Release branch<\/td><td>Medium<\/td><td>Medium<\/td><td>High<\/td><td>QA\/release windows<\/td><\/tr><tr><td>Environment branch<\/td><td>Medium<\/td><td>Medium<\/td><td>Medium<\/td><td>Branch-based deploys<\/td><\/tr><tr><td>Fork workflow<\/td><td>Medium<\/td><td>Medium<\/td><td>High<\/td><td>Open source<\/td><\/tr><tr><td>Stream workflow<\/td><td>High<\/td><td>Medium<\/td><td>Very high<\/td><td>Game\/enterprise\/binary-heavy projects<\/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\">28. How to choose the right workflow<\/h1>\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\">flowchart TD\n    A&#91;Choose version control workflow] --&gt; B{Is <span class=\"hljs-keyword\">this<\/span> open source <span class=\"hljs-keyword\">with<\/span> external contributors?}\n    B -- Yes --&gt; C&#91;Fork-based workflow]\n    B -- No --&gt; D{Do you deploy frequently?}\n    D -- Yes --&gt; E{Strong CI, tests, feature flags?}\n    E -- Yes --&gt; F&#91;Trunk-based development]\n    E -- No --&gt; G&#91;Feature branch \/ GitHub Flow]\n    D -- No --&gt; H{Need release stabilization?}\n    H -- Yes --&gt; I&#91;Gitflow or release branch workflow]\n    H -- No --&gt; J{Need staging to production promotion?}\n    J -- Yes --&gt; K&#91;GitLab Flow \/ environment promotion]\n    J -- No --&gt; L&#91;Feature branch workflow]\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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">29. 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>Learning project<\/td><td>Mainline<\/td><\/tr><tr><td>Small internal tool<\/td><td>GitHub Flow<\/td><\/tr><tr><td>SaaS backend<\/td><td>Trunk-based with PRs<\/td><\/tr><tr><td>Enterprise web app<\/td><td>GitLab Flow<\/td><\/tr><tr><td>Mobile app<\/td><td>Gitflow or release branch workflow<\/td><\/tr><tr><td>Desktop software<\/td><td>Gitflow<\/td><\/tr><tr><td>Firmware<\/td><td>Gitflow with support branches<\/td><\/tr><tr><td>Game development<\/td><td>Perforce streams or Git LFS-heavy workflow<\/td><\/tr><tr><td>Terraform IaC<\/td><td>Feature branch + protected main + plan checks<\/td><\/tr><tr><td>Kubernetes GitOps<\/td><td>Main branch + environment folders<\/td><\/tr><tr><td>Open source library<\/td><td>Fork-based PR workflow<\/td><\/tr><tr><td>Monorepo<\/td><td>Trunk-based with CODEOWNERS<\/td><\/tr><tr><td>Highly regulated system<\/td><td>Release branches + audited approvals<\/td><\/tr><tr><td>Data pipeline<\/td><td>Feature branch + environment promotion<\/td><\/tr><tr><td>Machine learning model repo<\/td><td>Versioned artifacts + model registry + Git metadata<\/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\">30. The best default workflow for most teams<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For most modern teams, start here:<\/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\">Rules:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>main<\/code> is always healthy.<\/li>\n\n\n\n<li>No direct push to <code>main<\/code>.<\/li>\n\n\n\n<li>Every change goes through PR\/MR.<\/li>\n\n\n\n<li>CI must pass before merge.<\/li>\n\n\n\n<li>At least one reviewer approves.<\/li>\n\n\n\n<li>Security checks run automatically.<\/li>\n\n\n\n<li>Branches are short-lived.<\/li>\n\n\n\n<li>Releases are tagged.<\/li>\n\n\n\n<li>Production changes are traceable.<\/li>\n\n\n\n<li>Rollback path is known.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub branch protection rules can enforce workflows such as requiring approving reviews and passing status checks before merging to protected branches. GitHub status checks can also be required before merging into protected branches.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">31. Repository structure standards<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">31.1 Simple application repository<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">repo\/\n  src\/\n  tests\/\n  docs\/\n  scripts\/\n  .github\/\n  README.md\n  CHANGELOG.md\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">31.2 Infrastructure repository<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">infra\/\n  envs\/\n    dev\/\n    staging\/\n    prod\/\n  modules\/\n    vpc\/\n    eks\/\n    rds\/\n  policies\/\n  docs\/\n  README.md\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">31.3 Kubernetes GitOps repository<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">gitops\/\n  clusters\/\n    dev\/\n    staging\/\n    prod\/\n  apps\/\n    payment\/\n    auth\/\n    analytics\/\n  platform\/\n    ingress\/\n    monitoring\/\n    security\/\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">31.4 Monorepo<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">repo\/\n  apps\/\n    web\/\n    admin\/\n  services\/\n    auth\/\n    payment\/\n    notification\/\n  packages\/\n    common\/\n    ui\/\n  infra\/\n  docs\/\n  tools\/\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">32. Branch naming standard<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended pattern<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" 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-24\"><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\"><span><code class=\"hljs\">feature\/EVP-123-add-alerts\nbugfix\/EVP-224-fix-login-timeout\nhotfix\/EVP-911-fix-prod-crash\nchore\/EVP-301-upgrade-dependencies\ndocs\/EVP-410-update-runbook\nrefactor\/EVP-515-clean-auth-service\nsecurity\/EVP-777-rotate-api-token\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Branch type table<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Prefix<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td><code>feature\/<\/code><\/td><td>New capability<\/td><\/tr><tr><td><code>bugfix\/<\/code><\/td><td>Normal 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 cleanup<\/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><tr><td><code>release\/<\/code><\/td><td>Release stabilization<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">33. Commit message workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Commit messages are not decoration. They are operational metadata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They help with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>review<\/li>\n\n\n\n<li>debugging<\/li>\n\n\n\n<li>changelogs<\/li>\n\n\n\n<li>release notes<\/li>\n\n\n\n<li>audits<\/li>\n\n\n\n<li>rollback<\/li>\n\n\n\n<li>semantic versioning<\/li>\n\n\n\n<li>root-cause analysis<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended format<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">type<\/span>&gt;<\/span>(optional-scope): <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">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-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Conventional Commits defines a lightweight convention for commit messages that adds human-readable and machine-readable meaning, and it aligns with SemVer by describing features, fixes, and breaking changes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Good examples<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" 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-26\"><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-27\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">fix(payment)<\/span>: handle gateway timeout\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><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-28\" 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\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><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-29\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">docs(runbook)<\/span>: add production rollback steps\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><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\">Bad examples<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">update\nfix\nchanges\n<span class=\"hljs-keyword\">final<\/span>\nmisc\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><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\">34. Commit type guide<\/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\/minor<\/td><\/tr><tr><td><code>refactor<\/code><\/td><td>Internal 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\/dependencies<\/td><td>Depends<\/td><\/tr><tr><td><code>ci<\/code><\/td><td>CI\/CD change<\/td><td>None<\/td><\/tr><tr><td><code>chore<\/code><\/td><td>Maintenance<\/td><td>None<\/td><\/tr><tr><td><code>security<\/code><\/td><td>Security fix<\/td><td>Patch\/major depending impact<\/td><\/tr><tr><td><code>revert<\/code><\/td><td>Reverts previous change<\/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> to communicate compatibility: major for incompatible API changes, minor for backward-compatible functionality, and patch for 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\">35. Pull request \/ merge request workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A PR\/MR is a controlled gate between individual work and shared code.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Developer branch] --&gt; B&#91;Open PR \/ MR]\n    B --&gt; C&#91;Automated checks]\n    B --&gt; D&#91;Human review]\n    C --&gt; E{Pass?}\n    D --&gt; F{Approved?}\n    E -- No --&gt; G&#91;Fix branch]\n    F -- No --&gt; G\n    G --&gt; B\n    E -- Yes --&gt; H&#91;Merge]\n    F -- Yes --&gt; H\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">A good PR answers<\/h2>\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 was it tested?<\/li>\n\n\n\n<li>What is the risk?<\/li>\n\n\n\n<li>What is the rollback plan?<\/li>\n\n\n\n<li>What screenshots\/logs prove behavior?<\/li>\n\n\n\n<li>Which ticket\/issue does it close?<\/li>\n\n\n\n<li>Which teams\/files are affected?<\/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\">36. PR template<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Summary<\/span>\n\nBriefly explain the change.\n\n<span class=\"hljs-comment\">## Why<\/span>\n\nExplain the reason, ticket, incident, customer need, <span class=\"hljs-keyword\">or<\/span> technical 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 testing\n- &#91; ] Staging validation\n- &#91; ] Not applicable\n\n<span class=\"hljs-comment\">## Risk<\/span>\n\nLow \/ Medium \/ High\n\nExplain the risk.\n\n<span class=\"hljs-comment\">## Rollback Plan<\/span>\n\nHow can this change be reverted, disabled, <span class=\"hljs-keyword\">or<\/span> rolled back?\n\n<span class=\"hljs-comment\">## Screenshots \/ Logs<\/span>\n\nAdd screenshots, traces, logs, curl output, <span class=\"hljs-keyword\">or<\/span> terminal 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 considered\n- &#91; ] Backward compatibility considered\n- &#91; ] Migration plan included <span class=\"hljs-keyword\">if<\/span> needed\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">37. Code review workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Reviewer responsibilities<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A reviewer should check:<\/p>\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>maintainability<\/li>\n\n\n\n<li>security<\/li>\n\n\n\n<li>performance<\/li>\n\n\n\n<li>test coverage<\/li>\n\n\n\n<li>failure handling<\/li>\n\n\n\n<li>backward compatibility<\/li>\n\n\n\n<li>observability<\/li>\n\n\n\n<li>rollout safety<\/li>\n\n\n\n<li>rollback path<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Author responsibilities<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The author should:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>keep PR small<\/li>\n\n\n\n<li>explain intent<\/li>\n\n\n\n<li>respond respectfully<\/li>\n\n\n\n<li>add tests<\/li>\n\n\n\n<li>update docs<\/li>\n\n\n\n<li>avoid hiding risky changes<\/li>\n\n\n\n<li>request right reviewers<\/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>Label<\/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>Improvement, not mandatory<\/td><\/tr><tr><td><code>question<\/code><\/td><td>Clarification needed<\/td><\/tr><tr><td><code>nit<\/code><\/td><td>Tiny non-blocking issue<\/td><\/tr><tr><td><code>praise<\/code><\/td><td>Good pattern<\/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. Protected branch workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A protected branch prevents dangerous changes to important branches.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For <code>main<\/code>, require:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Protection<\/th><th>Recommendation<\/th><\/tr><\/thead><tbody><tr><td>Direct push disabled<\/td><td>Yes<\/td><\/tr><tr><td>Pull request required<\/td><td>Yes<\/td><\/tr><tr><td>Required approvals<\/td><td>1\u20132<\/td><\/tr><tr><td>CODEOWNERS<\/td><td>Yes<\/td><\/tr><tr><td>Required status checks<\/td><td>Yes<\/td><\/tr><tr><td>Resolve conversations<\/td><td>Yes<\/td><\/tr><tr><td>Force push disabled<\/td><td>Yes<\/td><\/tr><tr><td>Branch deletion disabled<\/td><td>Yes<\/td><\/tr><tr><td>Signed commits<\/td><td>Optional, required in 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 enforce required reviews and status checks before merging, and can restrict unsafe actions like force pushes depending on configuration.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">39. CODEOWNERS workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">CODEOWNERS maps files to responsible teams.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\/infra\/ @platform-team\n\/services\/payment\/ @payment-team\n\/services\/auth\/ @identity-team\n\/.github\/workflows\/ @devops-team\n\/security\/ @security-team\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use CODEOWNERS for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>infrastructure<\/li>\n\n\n\n<li>CI\/CD pipelines<\/li>\n\n\n\n<li>authentication<\/li>\n\n\n\n<li>payment<\/li>\n\n\n\n<li>security-sensitive code<\/li>\n\n\n\n<li>shared libraries<\/li>\n\n\n\n<li>production configuration<\/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\">40. CI workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">CI means every change is automatically checked.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;PR opened] --&gt; B&#91;Checkout]\n    B --&gt; C&#91;Install dependencies]\n    C --&gt; D&#91;Format check]\n    D --&gt; E&#91;Lint]\n    E --&gt; F&#91;Unit tests]\n    F --&gt; G&#91;Build]\n    G --&gt; H&#91;Security scan]\n    H --&gt; I&#91;Integration tests]\n    I --&gt; J{Pass?}\n    J -- Yes --&gt; K&#91;Merge allowed]\n    J -- No --&gt; L&#91;Merge blocked]\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Minimum CI checks<\/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>Formatting<\/td><td>Consistency<\/td><\/tr><tr><td>Linting<\/td><td>Catch common mistakes<\/td><\/tr><tr><td>Unit tests<\/td><td>Validate logic<\/td><\/tr><tr><td>Build<\/td><td>Ensure package compiles<\/td><\/tr><tr><td>Secret scan<\/td><td>Prevent leaked credentials<\/td><\/tr><tr><td>Dependency scan<\/td><td>Find vulnerable libraries<\/td><\/tr><tr><td>SAST<\/td><td>Find code security issues<\/td><\/tr><tr><td>License scan<\/td><td>Legal\/compliance check<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub documents status checks as a way to show whether commits meet conditions, and required status checks must pass before merging into protected branches.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">41. CD workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">CD means approved changes can be released safely.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart LR\n    A&#91;Merge to main] --&gt; B&#91;Build artifact]\n    B --&gt; C&#91;Deploy dev]\n    C --&gt; D&#91;Deploy staging]\n    D --&gt; E{Approval?}\n    E -- Yes --&gt; F&#91;Deploy production]\n    E -- Auto --&gt; F\n    F --&gt; G&#91;Monitor]\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Continuous delivery vs continuous deployment<\/h2>\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>Continuous delivery<\/td><td>Code is always releasable, production deploy may require approval<\/td><\/tr><tr><td>Continuous deployment<\/td><td>Every passing change can automatically reach production<\/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\">42. Release workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A release is not just a commit. A mature release includes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>source commit SHA<\/li>\n\n\n\n<li>version number<\/li>\n\n\n\n<li>tag<\/li>\n\n\n\n<li>build artifact<\/li>\n\n\n\n<li>container image digest<\/li>\n\n\n\n<li>changelog<\/li>\n\n\n\n<li>release notes<\/li>\n\n\n\n<li>CI\/CD run ID<\/li>\n\n\n\n<li>approver<\/li>\n\n\n\n<li>deployment record<\/li>\n\n\n\n<li>rollback instruction<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Commit SHA]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Build artifact]<\/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;Version number]<\/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;Git tag]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Release notes]<\/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]<\/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;Monitor]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">43. Versioning workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Semantic Versioning<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">MAJOR<\/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-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">1<span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span>\n1<span class=\"hljs-selector-class\">.1<\/span><span class=\"hljs-selector-class\">.0<\/span>\n1<span class=\"hljs-selector-class\">.1<\/span><span class=\"hljs-selector-class\">.1<\/span>\n2<span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">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\">SemVer defines version meaning so users can understand whether a release is breaking, additive, or a bug fix.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Change<\/th><th>Version bump<\/th><\/tr><\/thead><tbody><tr><td>Bug fix<\/td><td>Patch<\/td><\/tr><tr><td>Backward-compatible feature<\/td><td>Minor<\/td><\/tr><tr><td>Breaking change<\/td><td>Major<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Practical release mapping<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Commit type<\/th><th>Example<\/th><th>Version impact<\/th><\/tr><\/thead><tbody><tr><td><code>fix<\/code><\/td><td><code>fix(api): handle null name<\/code><\/td><td>Patch<\/td><\/tr><tr><td><code>feat<\/code><\/td><td><code>feat(api): add search endpoint<\/code><\/td><td>Minor<\/td><\/tr><tr><td><code>BREAKING CHANGE<\/code><\/td><td>remove old API field<\/td><td>Major<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">44. Tagging workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Tags mark important versions.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">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\">.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\">.4<\/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\">.4<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Good tag names<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">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\">frontend-v2<\/span><span class=\"hljs-selector-class\">.3<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<span class=\"hljs-selector-tag\">api-v4<\/span><span class=\"hljs-selector-class\">.8<\/span><span class=\"hljs-selector-class\">.2<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Bad tag names<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">latest\n<span class=\"hljs-keyword\">final<\/span>\n<span class=\"hljs-keyword\">new<\/span>\nrelease\nprod-copy\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><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\">45. Changelog workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A changelog should explain what changed for humans.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended changelog sections<\/h2>\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\"># Changelog<\/span>\n\n<span class=\"hljs-comment\">## &#91;1.4.0] - 2026-07-07<\/span>\n\n<span class=\"hljs-comment\">### Added<\/span>\n- <span class=\"hljs-keyword\">New<\/span> payment retry configuration.\n\n<span class=\"hljs-comment\">### Changed<\/span>\n- Improved login error messages.\n\n<span class=\"hljs-comment\">### Fixed<\/span>\n- Fixed timeout when payment gateway is slow.\n\n<span class=\"hljs-comment\">### Security<\/span>\n- Rotated deprecated API token.\n\n<span class=\"hljs-comment\">### Breaking Changes<\/span>\n- Removed v1 invoice endpoint.\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<p class=\"wp-block-paragraph\">Use commit messages and PR metadata to generate release notes, but humans should review important releases.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">46. Hotfix workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A hotfix is an urgent production fix.<\/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\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Production issue]<\/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 production commit]<\/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;Minimal 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;Critical 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;Approval]<\/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;Post-incident follow-up]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Hotfix rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Make the smallest safe change.<\/li>\n\n\n\n<li>Do not include unrelated cleanup.<\/li>\n\n\n\n<li>Keep review focused.<\/li>\n\n\n\n<li>Run critical tests.<\/li>\n\n\n\n<li>Tag the hotfix release.<\/li>\n\n\n\n<li>Backport if needed.<\/li>\n\n\n\n<li>Write a follow-up ticket.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">47. Rollback workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Rollback is not one technique. It is a decision tree.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Production problem] --&gt; B{Feature flag available?}\n    B -- Yes --&gt; C&#91;Disable feature flag]\n    B -- No --&gt; D{Bad deployment 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    C --&gt; I&#91;Monitor]\n    E --&gt; I\n    G --&gt; I\n    H --&gt; I\n<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Method<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>Disable feature flag<\/td><td>Bad feature behavior<\/td><\/tr><tr><td>Revert commit<\/td><td>Bad code merged<\/td><\/tr><tr><td>Redeploy old artifact<\/td><td>Bad deployment<\/td><\/tr><tr><td>Roll back migration<\/td><td>Carefully designed reversible DB changes<\/td><\/tr><tr><td>Fix forward<\/td><td>When rollback is riskier than repair<\/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\">48. Revert vs reset<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Revert<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Creates a new commit that undoes another commit.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" 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\">commit-sha<\/span>&gt;<\/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\">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\">Best for shared branches and production.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Reset<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Moves branch pointer.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" 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\">commit-sha<\/span>&gt;<\/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\">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\">Dangerous on shared branches.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rule<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">revert<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">shared<\/span> <span class=\"hljs-title\">history<\/span>.\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">reset<\/span> <span class=\"hljs-title\">only<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">local<\/span> <span class=\"hljs-title\">cleanup<\/span> <span class=\"hljs-title\">when<\/span> <span class=\"hljs-title\">you<\/span> <span class=\"hljs-title\">understand<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">impact<\/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\">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\">49. Merge vs rebase<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Atlassian\u2019s Git tutorial summarizes the tradeoff: merging preserves complete history, while rebasing creates a linear history by moving feature branch commits onto the tip of the target branch. Git\u2019s own rebase documentation describes commands such as <code>git rebase --continue<\/code>, <code>--abort<\/code>, and <code>--skip<\/code> for conflict handling.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Area<\/th><th>Merge<\/th><th>Rebase<\/th><\/tr><\/thead><tbody><tr><td>History<\/td><td>Preserves original structure<\/td><td>Rewrites branch commits<\/td><\/tr><tr><td>Merge commits<\/td><td>Usually creates one<\/td><td>Avoids merge commit<\/td><\/tr><tr><td>Safety<\/td><td>Safer for shared branches<\/td><td>Risky if misused<\/td><\/tr><tr><td>Readability<\/td><td>Can be noisy<\/td><td>Linear and clean<\/td><\/tr><tr><td>Best use<\/td><td>Shared integration<\/td><td>Local branch cleanup<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Safe rule<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Rebase your own branch.\n<span class=\"hljs-keyword\">Do<\/span> not rebase shared branches unless your team explicitly allows it.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><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\">50. Conflict resolution workflow<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Conflict detected]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Read both versions]<\/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;Understand intent]<\/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;Edit final correct file]<\/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 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;Mark resolved]<\/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;Continue merge\/rebase]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Conflict markers<\/h2>\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\">Final resolved file:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">timeout = 60\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Bad conflict behavior<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Accept incoming blindly\nAccept current blindly\nDelete conflict markers without understanding\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Good conflict behavior<\/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\">Understand both changes.\nAsk the other author <span class=\"hljs-keyword\">if<\/span> needed.\nRun tests.\nReview <span class=\"hljs-keyword\">final<\/span> diff.\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\">51. Backport workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Backporting means applying a fix to an older release line.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Fix in main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Backport to release\/2.1]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Backport to release\/2.0]<\/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 v2.1.4]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Tag v2.0.9]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>supporting older versions<\/li>\n\n\n\n<li>maintaining LTS releases<\/li>\n\n\n\n<li>fixing security issues across versions<\/li>\n\n\n\n<li>customers cannot upgrade immediately<\/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\">52. Database migration workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Database changes need special workflow because rollback is harder.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Safe 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-47\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">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 compatible app]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Backfill data]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Switch reads\/writes]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Contract old schema]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">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 app that writes old and new.<\/li>\n\n\n\n<li>Backfill data.<\/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 checklist<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Is migration backward compatible?<\/li>\n\n\n\n<li>Can old app version still run?<\/li>\n\n\n\n<li>Is rollback possible?<\/li>\n\n\n\n<li>Is table lock risk understood?<\/li>\n\n\n\n<li>Is data volume known?<\/li>\n\n\n\n<li>Is backfill required?<\/li>\n\n\n\n<li>Is monitoring ready?<\/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. Infrastructure as Code workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Infrastructure changes can create or destroy real resources. The workflow must be stricter.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Create infra branch]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Edit Terraform\/Pulumi]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Format]<\/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;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;Plan]<\/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;Security scan]<\/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;Cost review]<\/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;Peer review]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Merge]<\/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;Apply via pipeline]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">IaC PR must include<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>plan output<\/li>\n\n\n\n<li>resources created<\/li>\n\n\n\n<li>resources changed<\/li>\n\n\n\n<li>resources destroyed<\/li>\n\n\n\n<li>security impact<\/li>\n\n\n\n<li>cost impact<\/li>\n\n\n\n<li>rollback plan<\/li>\n\n\n\n<li>blast radius<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Dangerous plan terms<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">destroy\nreplace\nforces replacement\n<span class=\"hljs-number\">0.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span>\/<span class=\"hljs-number\">0<\/span>\npublic access\n<span class=\"hljs-keyword\">delete<\/span> database\ndisable encryption\nremove backup\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">54. Kubernetes GitOps workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">GitOps means Git is the desired state for infrastructure or Kubernetes deployment.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" 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 container]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Push image]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Update GitOps repo]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Argo CD \/ Flux sync]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Kubernetes cluster]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><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\">Golden rule<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Build once. Promote the same artifact.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Build different images for dev, staging, and 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 through environments.\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\">55. Monorepo workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A monorepo stores many projects in one repository.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">repo\/\n  apps\/\n  services\/\n  packages\/\n  infra\/\n  docs\/\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Monorepo problems and solutions<\/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>Affected-project builds<\/td><\/tr><tr><td>Risky shared libraries<\/td><td>Contract tests<\/td><\/tr><tr><td>Large PRs<\/td><td>Small incremental 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\">Monorepo workflow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Change in service]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Detect affected paths]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Run targeted tests]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Require owners]<\/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 trunk]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Build affected artifacts]<\/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\">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\">56. Large binary file workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Git is excellent for text. Large binary files need careful handling.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Options:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Need<\/th><th>Recommended approach<\/th><\/tr><\/thead><tbody><tr><td>Large design files<\/td><td>Git LFS or artifact storage<\/td><\/tr><tr><td>Game assets<\/td><td>Perforce often fits better<\/td><\/tr><tr><td>Build artifacts<\/td><td>Artifact repository<\/td><\/tr><tr><td>ML models<\/td><td>Model registry or object storage<\/td><\/tr><tr><td>Dataset snapshots<\/td><td>DVC, object storage, data catalog<\/td><\/tr><tr><td>Generated binaries<\/td><td>Usually do not commit<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Perforce Streams and centralized locking models are often used where large binary files and controlled codelines matter.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">57. Security workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Version control is one of the most important security boundaries.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Never commit<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">passwords\nAPI keys\nprivate keys\ndatabase dumps\ncustomer data\n.env <span class=\"hljs-keyword\">with<\/span> real secrets\nproduction kubeconfig\ncloud credentials\nTerraform state files\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Required security gates<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Gate<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Secret scanning<\/td><td>Stop credential leaks<\/td><\/tr><tr><td>Dependency scanning<\/td><td>Detect vulnerable packages<\/td><\/tr><tr><td>SAST<\/td><td>Detect insecure code<\/td><\/tr><tr><td>IaC scanning<\/td><td>Detect cloud misconfiguration<\/td><\/tr><tr><td>Container scanning<\/td><td>Detect image vulnerabilities<\/td><\/tr><tr><td>CODEOWNERS<\/td><td>Require expert review<\/td><\/tr><tr><td>Signed commits<\/td><td>Improve provenance<\/td><\/tr><tr><td>Protected branches<\/td><td>Prevent unsafe direct changes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">58. Pre-commit workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Pre-commit checks catch problems before push.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart LR\n    A&#91;Developer commits] --&gt; B&#91;Pre-commit hook]\n    B --&gt; C{Pass?}\n    C -- Yes --&gt; D&#91;Commit allowed]\n    C -- No --&gt; E&#91;Fix locally]\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example checks:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>formatting<\/li>\n\n\n\n<li>linting<\/li>\n\n\n\n<li>YAML validation<\/li>\n\n\n\n<li>JSON validation<\/li>\n\n\n\n<li>secret detection<\/li>\n\n\n\n<li>private key detection<\/li>\n\n\n\n<li>Terraform formatting<\/li>\n\n\n\n<li>Markdown linting<\/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\">59. Audit and compliance workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For regulated environments, version control must prove:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>who changed what<\/li>\n\n\n\n<li>who reviewed it<\/li>\n\n\n\n<li>what tests passed<\/li>\n\n\n\n<li>who approved release<\/li>\n\n\n\n<li>what was deployed<\/li>\n\n\n\n<li>when it was deployed<\/li>\n\n\n\n<li>how it can be rolled back<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Audit-ready release record<\/h2>\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\">Release<\/span>: <span class=\"hljs-selector-tag\">v2<\/span><span class=\"hljs-selector-class\">.4<\/span><span class=\"hljs-selector-class\">.1<\/span>\n<span class=\"hljs-selector-tag\">Commit<\/span>: <span class=\"hljs-selector-tag\">abc1234<\/span>\n<span class=\"hljs-selector-tag\">Build<\/span>: <span class=\"hljs-selector-tag\">build-8871<\/span>\n<span class=\"hljs-selector-tag\">Image<\/span> <span class=\"hljs-selector-tag\">digest<\/span>: <span class=\"hljs-selector-tag\">sha256<\/span><span class=\"hljs-selector-pseudo\">:...<\/span>\n<span class=\"hljs-selector-tag\">Approved<\/span> <span class=\"hljs-selector-tag\">by<\/span>: <span class=\"hljs-selector-tag\">alice<\/span><span class=\"hljs-keyword\">@example<\/span>.com\nDeployed <span class=\"hljs-attribute\">by:<\/span> pipeline\n<span class=\"hljs-attribute\">Environment:<\/span> production\n<span class=\"hljs-attribute\">Time:<\/span> <span class=\"hljs-number\">2026<\/span>-<span class=\"hljs-number\">07<\/span>-<span class=\"hljs-number\">07<\/span> <span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">30<\/span> JST\n<span class=\"hljs-attribute\">Rollback:<\/span> deploy v2.<span class=\"hljs-number\">4.0<\/span>\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\">60. Documentation workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Documentation should follow the same discipline as code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Docs should be versioned when they describe<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>architecture<\/li>\n\n\n\n<li>APIs<\/li>\n\n\n\n<li>runbooks<\/li>\n\n\n\n<li>incident response<\/li>\n\n\n\n<li>onboarding<\/li>\n\n\n\n<li>release process<\/li>\n\n\n\n<li>infrastructure<\/li>\n\n\n\n<li>security policies<\/li>\n\n\n\n<li>database schema<\/li>\n\n\n\n<li>operational procedures<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Documentation PR checklist<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Is this still accurate?<\/li>\n\n\n\n<li>Does it match current implementation?<\/li>\n\n\n\n<li>Are commands tested?<\/li>\n\n\n\n<li>Are diagrams updated?<\/li>\n\n\n\n<li>Are owners listed?<\/li>\n\n\n\n<li>Is the rollback\/runbook complete?<\/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\">61. API version control workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">APIs require compatibility discipline.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">flowchart TD\n    A&#91;API change proposed] --&gt; B{Breaking change?}\n    B -- No --&gt; C&#91;Add field \/ endpoint]\n    B -- Yes --&gt; D&#91;Create <span class=\"hljs-keyword\">new<\/span> version or migration plan]\n    C --&gt; E&#91;Update contract]\n    D --&gt; E\n    E --&gt; F&#91;Contract tests]\n    F --&gt; G&#91;Release notes]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Safe API changes<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add optional field<\/li>\n\n\n\n<li>Add endpoint<\/li>\n\n\n\n<li>Add enum carefully<\/li>\n\n\n\n<li>Add backward-compatible behavior<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Risky API changes<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Remove field<\/li>\n\n\n\n<li>Rename field<\/li>\n\n\n\n<li>Change type<\/li>\n\n\n\n<li>Change status code semantics<\/li>\n\n\n\n<li>Change authentication behavior<\/li>\n\n\n\n<li>Change default behavior<\/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\">62. Dependency update workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Dependency updates need version-control discipline.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Dependency update] --&gt; B{Security critical?}\n    B -- Yes --&gt; C&#91;Fast-track review]\n    B -- No --&gt; D&#91;Normal PR]\n    C --&gt; E&#91;Run tests]\n    D --&gt; E\n    E --&gt; F&#91;Compatibility check]\n    F --&gt; G&#91;Merge]\n    G --&gt; H&#91;Monitor]\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Small dependency PRs are better than giant upgrade PRs.<\/li>\n\n\n\n<li>Security patches should be prioritized.<\/li>\n\n\n\n<li>Major upgrades need migration notes.<\/li>\n\n\n\n<li>Lockfiles should be committed for applications.<\/li>\n\n\n\n<li>Libraries may need different lockfile policy.<\/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\">63. Feature flag workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Feature flags separate merging from releasing.<\/p>\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\">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]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Flag off]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Deploy safely]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Enable internally]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Enable 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-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\">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>Backend transition<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Every flag has an owner.<\/li>\n\n\n\n<li>Every flag has an expiry date.<\/li>\n\n\n\n<li>Old flags are removed.<\/li>\n\n\n\n<li>Critical flags have audit logs.<\/li>\n\n\n\n<li>Flags are monitored.<\/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\">64. Branch by abstraction workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this for large changes without long-lived branches.<\/p>\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\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Old implementation]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Create abstraction]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Route old implementation through abstraction]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Add new implementation behind flag]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Migrate callers gradually]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Remove old implementation]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-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<p class=\"wp-block-paragraph\">Best for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>large refactors<\/li>\n\n\n\n<li>replacing dependencies<\/li>\n\n\n\n<li>changing payment provider<\/li>\n\n\n\n<li>migrating database access<\/li>\n\n\n\n<li>changing authentication system<\/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\">65. Stacked change workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A stacked workflow breaks large work into dependent PRs.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"main\"<\/span>\n    branch pr<span class=\"hljs-number\">-1<\/span>-abstraction\n    checkout pr<span class=\"hljs-number\">-1<\/span>-abstraction\n    commit id: <span class=\"hljs-string\">\"abstraction\"<\/span>\n    branch pr<span class=\"hljs-number\">-2<\/span>-<span class=\"hljs-keyword\">new<\/span>-impl\n    checkout pr<span class=\"hljs-number\">-2<\/span>-<span class=\"hljs-keyword\">new<\/span>-impl\n    commit id: <span class=\"hljs-string\">\"new impl\"<\/span>\n    branch pr<span class=\"hljs-number\">-3<\/span>-enable-flag\n    checkout pr<span class=\"hljs-number\">-3<\/span>-enable-flag\n    commit id: <span class=\"hljs-string\">\"enable flag\"<\/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\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>one large feature has clear layers<\/li>\n\n\n\n<li>each layer can be reviewed separately<\/li>\n\n\n\n<li>you want fast review<\/li>\n\n\n\n<li>you want to avoid a giant PR<\/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\">66. Workflow for generated code<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Generated code needs special rules.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>protobuf output<\/li>\n\n\n\n<li>OpenAPI clients<\/li>\n\n\n\n<li>ORM generated files<\/li>\n\n\n\n<li>SDK generation<\/li>\n\n\n\n<li>compiled assets<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended PR note<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Generated code note:\n\nHuman review should focus on:\n- openapi.yaml\n- generator config\n- usage changes\n\nGenerated files:\n- clients\/generated\/*\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Do not manually edit generated files.<\/li>\n\n\n\n<li>Commit generator config.<\/li>\n\n\n\n<li>Document generator version.<\/li>\n\n\n\n<li>Separate generated changes from logic changes when possible.<\/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\">67. Workflow for experiments<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Experiments should not pollute production history.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Options:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Experiment type<\/th><th>Workflow<\/th><\/tr><\/thead><tbody><tr><td>Quick local test<\/td><td>Local branch, no remote<\/td><\/tr><tr><td>Team experiment<\/td><td><code>experiment\/*<\/code> branch<\/td><\/tr><tr><td>Production A\/B test<\/td><td>Feature flag<\/td><\/tr><tr><td>Architecture spike<\/td><td>Short branch + documented conclusion<\/td><\/tr><tr><td>Throwaway prototype<\/td><td>Separate repository<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Experiment rule<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">An experiment must either graduate, be deleted, or be documented.\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\">68. Workflow for incidents<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">During production incidents, use a faster but still controlled workflow.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">sequenceDiagram\n    participant Dev <span class=\"hljs-keyword\">as<\/span> Engineer\n    participant Repo <span class=\"hljs-keyword\">as<\/span> Repository\n    participant CI <span class=\"hljs-keyword\">as<\/span> CI\n    participant Prod <span class=\"hljs-keyword\">as<\/span> Production\n\n    Dev-&gt;&gt;Repo: Create hotfix branch\n    Dev-&gt;&gt;Repo: Commit minimal fix\n    Dev-&gt;&gt;Repo: Open emergency PR\n    CI-&gt;&gt;Repo: Run critical checks\n    Repo-&gt;&gt;Prod: Deploy after approval\n    Prod-&gt;&gt;Dev: Validate metrics\n    Dev-&gt;&gt;Repo: Tag hotfix release\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Incident change rules<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Smallest safe change<\/li>\n\n\n\n<li>One purpose only<\/li>\n\n\n\n<li>Emergency reviewer<\/li>\n\n\n\n<li>Critical CI only if full CI is too slow<\/li>\n\n\n\n<li>Immediate production validation<\/li>\n\n\n\n<li>Post-incident cleanup later<\/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\">69. Workflow anti-patterns<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 1: Everyone pushes to main<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This breaks production confidence.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Protect main. <span class=\"hljs-keyword\">Require<\/span> PR <span class=\"hljs-keyword\">and<\/span> CI.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-59\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 2: Branches live for months<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This causes merge disasters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-60\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">small<\/span> <span class=\"hljs-title\">branches<\/span>, <span class=\"hljs-title\">feature<\/span> <span class=\"hljs-title\">flags<\/span>, <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">branch<\/span> <span class=\"hljs-title\">by<\/span> <span class=\"hljs-title\">abstraction<\/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\">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\">Anti-pattern 3: PRs are too large<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Large PRs become rubber-stamped.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-61\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Split by layer, risk, <span class=\"hljs-built_in\">module<\/span>, or flag.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-61\"><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\">Anti-pattern 4: Releases are not tagged<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Without tags, rollback and audit become messy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Tag every production release.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 5: CI is optional<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Optional CI becomes ignored CI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Required checks before merge.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 6: Secrets in repository<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is a security incident.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Secret scanning, pre-commit hooks, secret manager, key rotation.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 7: Hotfix directly on server<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This destroys traceability.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/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<h1 class=\"wp-block-heading\">70. Enterprise version control policy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this as a company-ready baseline.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">70.1 Branch policy<\/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\">70.2 Main branch policy<\/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<\/td><td>Disabled<\/td><\/tr><tr><td>PR\/MR required<\/td><td>Yes<\/td><\/tr><tr><td>Required approvals<\/td><td>1 minimum, 2 for critical areas<\/td><\/tr><tr><td>Required CI<\/td><td>Yes<\/td><\/tr><tr><td>CODEOWNERS<\/td><td>Required for sensitive paths<\/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>Required for critical repos<\/td><\/tr><tr><td>Admin bypass<\/td><td>Audited<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">70.3 Release policy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every production release must have:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>commit SHA<\/li>\n\n\n\n<li>version<\/li>\n\n\n\n<li>tag<\/li>\n\n\n\n<li>artifact\/image digest<\/li>\n\n\n\n<li>CI\/CD run<\/li>\n\n\n\n<li>release notes<\/li>\n\n\n\n<li>rollback plan<\/li>\n\n\n\n<li>approval record<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">70.4 Review policy<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Change type<\/th><th>Required review<\/th><\/tr><\/thead><tbody><tr><td>Normal app change<\/td><td>1 reviewer<\/td><\/tr><tr><td>Security-sensitive change<\/td><td>security owner<\/td><\/tr><tr><td>Infrastructure change<\/td><td>platform owner<\/td><\/tr><tr><td>Database migration<\/td><td>backend + DBA\/platform<\/td><\/tr><tr><td>CI\/CD pipeline change<\/td><td>DevOps owner<\/td><\/tr><tr><td>Production config change<\/td><td>service owner<\/td><\/tr><tr><td>Breaking API change<\/td><td>API owner + consumers notified<\/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\">71. Version control workflow for DevOps and platform teams<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Platform teams should treat repositories as production control planes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Critical repositories<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Terraform repositories<\/li>\n\n\n\n<li>Kubernetes GitOps repositories<\/li>\n\n\n\n<li>CI\/CD pipeline repositories<\/li>\n\n\n\n<li>IAM policy repositories<\/li>\n\n\n\n<li>Monitoring\/alerting repositories<\/li>\n\n\n\n<li>Security policy repositories<\/li>\n\n\n\n<li>DNS\/infrastructure repositories<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Platform workflow<\/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\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Platform change]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Branch]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Static validation]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Plan\/diff]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Security policy check]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Cost\/blast-radius review]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Approval]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Merge]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Controlled apply\/deploy]<\/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;Post-change verification]<\/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<h2 class=\"wp-block-heading\">Platform PR must include<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>blast radius<\/li>\n\n\n\n<li>rollback plan<\/li>\n\n\n\n<li>validation commands<\/li>\n\n\n\n<li>affected environments<\/li>\n\n\n\n<li>expected downtime, if any<\/li>\n\n\n\n<li>security impact<\/li>\n\n\n\n<li>cost impact<\/li>\n\n\n\n<li>monitoring impact<\/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\">72. Version control workflow for regulated teams<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Regulated teams need evidence.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Evidence required<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Evidence<\/th><th>Why<\/th><\/tr><\/thead><tbody><tr><td>Ticket link<\/td><td>Business justification<\/td><\/tr><tr><td>PR approval<\/td><td>Peer review<\/td><\/tr><tr><td>CI result<\/td><td>Test proof<\/td><\/tr><tr><td>Security scan<\/td><td>Risk control<\/td><\/tr><tr><td>Release tag<\/td><td>Traceability<\/td><\/tr><tr><td>Deployment log<\/td><td>Operational evidence<\/td><\/tr><tr><td>Rollback plan<\/td><td>Resilience<\/td><\/tr><tr><td>Audit log<\/td><td>Compliance<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Regulated workflow<\/h2>\n\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;Approved work item]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Branch]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Commit signed change]<\/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 with required reviewers]<\/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 + security 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;Change approval]<\/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;Release candidate]<\/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;Production approval]<\/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;Deploy]<\/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;Archive evidence]<\/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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">73. Metrics for version control workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Measure the workflow itself.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Metric<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>PR cycle time<\/td><td>Time from PR open to merge<\/td><\/tr><tr><td>Branch age<\/td><td>How long branches live<\/td><\/tr><tr><td>Review latency<\/td><td>Time until first review<\/td><\/tr><tr><td>CI duration<\/td><td>How long checks take<\/td><\/tr><tr><td>CI failure rate<\/td><td>Quality feedback<\/td><\/tr><tr><td>Change failure rate<\/td><td>How often changes cause incidents<\/td><\/tr><tr><td>Deployment frequency<\/td><td>Delivery speed<\/td><\/tr><tr><td>Mean time to restore<\/td><td>Recovery speed<\/td><\/tr><tr><td>Revert rate<\/td><td>Risk\/quality indicator<\/td><\/tr><tr><td>PR size<\/td><td>Reviewability<\/td><\/tr><tr><td>Stale branch count<\/td><td>Repository hygiene<\/td><\/tr><\/tbody><\/table><\/figure>\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\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Small PRs]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Faster review]<\/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;Faster merge]<\/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;Lower conflict risk]<\/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;Higher delivery speed]<\/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;Better team flow]<\/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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">74. Team workflow design principles<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Principle 1: Optimize for small changes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Small changes are easier to review, test, deploy, and rollback.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Principle 2: Protect the integration line<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The mainline should stay healthy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Principle 3: Automate what humans forget<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">CI, linting, security checks, and policy checks should be automated.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Principle 4: Make risky changes visible<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Database migrations, IAM changes, public access, and production config changes need explicit review.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Principle 5: Separate merge from release<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Feature flags, release branches, and deployment gates help separate code integration from user exposure.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Principle 6: Make rollback boring<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rollback should be known before deployment.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Principle 7: Delete stale branches<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Old branches are abandoned risk.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">75. Practical command cheat sheet<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Git basics<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-65\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git <span class=\"hljs-keyword\">clone<\/span> &lt;repo&gt;\ngit status\ngit add .\ngit commit -m <span class=\"hljs-string\">\"feat: add login\"<\/span>\ngit push origin main\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-65\"><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\">Branching<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout main\ngit pull --ff-only origin main\ngit checkout -b feature\/add-search\ngit push -u origin feature\/add-search\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">History<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-66\" 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-66\"><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\">Merge and rebase<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-67\" 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-67\"><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-68\" 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\">revert<\/span> &lt;<span class=\"hljs-selector-tag\">sha<\/span>&gt;\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<\/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<h2 class=\"wp-block-heading\">Tags<\/h2>\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\">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-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<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 branch -d feature\/old-branch\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\">76. Master workflow blueprint<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is the final recommended end-to-end workflow for serious teams.<\/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\">flowchart TD\n    A&#91;Requirement \/ bug \/ incident] --&gt; B&#91;Create ticket]\n    B --&gt; C&#91;Create short-lived branch]\n    C --&gt; D&#91;Make small commits]\n    D --&gt; E&#91;Run local checks]\n    E --&gt; F&#91;Push branch]\n    F --&gt; G&#91;Open PR \/ MR]\n    G --&gt; H&#91;CI checks]\n    G --&gt; I&#91;Code review]\n    H --&gt; J{Checks pass?}\n    I --&gt; K{Approved?}\n    J -- No --&gt; D\n    K -- No --&gt; D\n    J -- Yes --&gt; L&#91;Merge to <span class=\"hljs-keyword\">protected<\/span> main]\n    K -- Yes --&gt; L\n    L --&gt; M&#91;Build immutable artifact]\n    M --&gt; N&#91;Deploy to test\/staging]\n    N --&gt; O&#91;Release approval <span class=\"hljs-keyword\">or<\/span> automation]\n    O --&gt; P&#91;Deploy production]\n    P --&gt; Q&#91;Tag release]\n    Q --&gt; R&#91;Monitor]\n    R --&gt; S{Issue?}\n    S -- Yes --&gt; T&#91;Rollback \/ revert \/ hotfix]\n    S -- No --&gt; U&#91;Close work item]\n<\/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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">77. The final one-page standard<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Version control workflow standard<\/h2>\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\"><span class=\"hljs-number\">1.<\/span> All work starts <span class=\"hljs-keyword\">from<\/span> a tracked ticket or clear task.\n<span class=\"hljs-number\">2.<\/span> All work happens <span class=\"hljs-keyword\">in<\/span> a short-lived branch or controlled workspace.\n<span class=\"hljs-number\">3.<\/span> Commits must be small and meaningful.\n<span class=\"hljs-number\">4.<\/span> Commit messages must explain purpose.\n<span class=\"hljs-number\">5.<\/span> Every shared change must be reviewed.\n<span class=\"hljs-number\">6.<\/span> Mainline branches must be protected.\n<span class=\"hljs-number\">7.<\/span> CI checks must pass before merge.\n<span class=\"hljs-number\">8.<\/span> Security-sensitive files <span class=\"hljs-built_in\">require<\/span> owners.\n<span class=\"hljs-number\">9.<\/span> Production releases must be tagged.\n<span class=\"hljs-number\">10.<\/span> Rollback must be known before deployment.\n<span class=\"hljs-number\">11.<\/span> Hotfixes must still go through version control.\n<span class=\"hljs-number\">12.<\/span> Stale branches must be deleted.\n<span class=\"hljs-number\">13.<\/span> Secrets must never be committed.\n<span class=\"hljs-number\">14.<\/span> Build artifacts must be traceable to source commits.\n<span class=\"hljs-number\">15.<\/span> The workflow must be simple enough that engineers actually follow it.\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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">78. The final wisdom<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A junior engineer thinks version control means:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">commit and push\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A mid-level engineer thinks version control means:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">branches and pull requests\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A senior engineer thinks version control means:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">safe collaboration and clean releases\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">An architect thinks version control means:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">a controlled delivery system that connects source code, review, security, CI\/CD, release, rollback, audit, and production confidence\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The best version control workflow is not the most complicated one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The best workflow is the one that makes safe delivery easy and unsafe delivery difficult.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For most modern teams, the best starting point is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-72\" 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 branches\nPull requests \/ merge requests\nRequired CI\nRequired review\nClear commit messages\nRelease tags\nRollback plan\nSecurity checks\nBranch cleanup\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-72\"><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, GitOps, progressive delivery, and enterprise governance as the team becomes mature.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Version control is not just history.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Version control is how engineering teams remember, collaborate, ship, recover, and improve.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A Complete One-Stop Guide from Beginner to Enterprise Architecture 1. What is a version control workflow? A version control workflow is the complete process a team follows&#8230; <\/p>\n","protected":false},"author":1,"featured_media":77507,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-77505","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77505","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=77505"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77505\/revisions"}],"predecessor-version":[{"id":77506,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77505\/revisions\/77506"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/77507"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=77505"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=77505"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=77505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}