<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sourabh Rana</title>
    <description>The latest articles on DEV Community by Sourabh Rana (@ranas7786).</description>
    <link>https://dev.to/ranas7786</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3942897%2F461887bc-b53a-4f9f-89e0-e9f60add6776.jpeg</url>
      <title>DEV Community: Sourabh Rana</title>
      <link>https://dev.to/ranas7786</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ranas7786"/>
    <language>en</language>
    <item>
      <title>Trunk-Based Development with Release Streams: A Real-World Case Study</title>
      <dc:creator>Sourabh Rana</dc:creator>
      <pubDate>Wed, 20 May 2026 20:22:09 +0000</pubDate>
      <link>https://dev.to/ranas7786/trunk-based-development-with-release-streams-a-real-world-case-study-135g</link>
      <guid>https://dev.to/ranas7786/trunk-based-development-with-release-streams-a-real-world-case-study-135g</guid>
      <description>&lt;h2&gt;
  
  
  Escaping Cherry-Pick Hell: How to Manage Parallel Enterprise Releases Without GitFlow
&lt;/h2&gt;

&lt;p&gt;We’ve all been there. A directive comes down from above: &lt;em&gt;"Every project must follow the standard GitFlow playbook. Feature -&amp;gt; Develop -&amp;gt; Release -&amp;gt; Master."&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;It sounds pristine in a slide deck. But what happens when reality hits, and your team is suddenly tasked with developing and delivering &lt;strong&gt;three separate, major parallel release trains simultaneously&lt;/strong&gt; (e.g., individual target shipments for June, July, and August)? &lt;/p&gt;

&lt;p&gt;If you map that exact timeline onto a single GitFlow &lt;code&gt;develop&lt;/code&gt; branch, your velocity grinds to a halt. The single &lt;code&gt;develop&lt;/code&gt; branch becomes a congested traffic jam where future code pollutes present testing, leading to the ultimate DevOps nightmare: &lt;strong&gt;Manual Cherry-Picking Hell.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this post, I want to walk through why traditional GitFlow completely breaks down under concurrent release timelines, and layout the exact strategy my team uses to safely isolate and fingerprint parallel streams using a variant of &lt;strong&gt;Trunk-Based Development with Release-Streams&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Technical Breakdown: Where GitFlow Fails
&lt;/h2&gt;

&lt;p&gt;In standard GitFlow, &lt;code&gt;develop&lt;/code&gt; is a permanent melting pot. If Developers A, B, and C are working on June features, and Developers D, E, and F are building architecture for August, &lt;em&gt;all&lt;/em&gt; of their code unifies into &lt;code&gt;develop&lt;/code&gt; as soon as feature branches close.&lt;/p&gt;

&lt;p&gt;When June arrives and you need to cut your &lt;code&gt;release-1.0.0&lt;/code&gt; branch to push to QA and UAT, you are trapped. You cannot simply branch from &lt;code&gt;develop&lt;/code&gt; because it is already polluted with incomplete July and August code. Your only choice is to manually scan the log, track down the exact commit hashes for June's 100 features, and cherry-pick them onto a clean line. It’s error-prone, ruins Git history validation, and breaks continuous integration.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution: Release-Stream Branching (Trunk-Based Variant)
&lt;/h2&gt;

&lt;p&gt;Instead of forcing a single intermediate branch to manage time-separated scope, our strategy prioritizes &lt;strong&gt;release isolation over feature pooling&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Here is exactly how our cycle runs from Day 1 to Production:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Just-in-Time Release Initialization
&lt;/h3&gt;

&lt;p&gt;We completely bypass a permanent &lt;code&gt;develop&lt;/code&gt; branch. &lt;code&gt;master&lt;/code&gt; acts as our single source of truth (The Trunk). When a release train is ready to begin its concrete feature development cycle, we bifurcate directly from &lt;code&gt;master&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Day 1:&lt;/strong&gt; We cut &lt;code&gt;release-1.0.0&lt;/code&gt; from &lt;code&gt;master&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;  Developers working on the immediate milestone branch out directly from &lt;code&gt;release-1.0.0&lt;/code&gt; (e.g., &lt;code&gt;feature-1&lt;/code&gt; through &lt;code&gt;feature-5&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Parallel Stream Isolation
&lt;/h3&gt;

&lt;p&gt;As development progresses, the next release train can launch completely independently without blocking or being blocked by the active cycle.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Day 5:&lt;/strong&gt; Developers merge completed work (&lt;code&gt;feature-1&lt;/code&gt; to &lt;code&gt;feature-3&lt;/code&gt;) back into &lt;code&gt;release-1.0.0&lt;/code&gt;. We build a fingerprinted build directly from this branch and deploy it straight to QA.&lt;/li&gt;
&lt;li&gt;  Simultaneously, the next stream opens: We cut &lt;code&gt;release-2.0.0&lt;/code&gt; from &lt;code&gt;master&lt;/code&gt; (or the stabilized line). Developers assigned to the July/next train immediately cut &lt;code&gt;feature-6&lt;/code&gt; through &lt;code&gt;feature-9&lt;/code&gt; from &lt;code&gt;release-2.0.0&lt;/code&gt;. They are completely isolated from the June team's testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Progressive Hardening &amp;amp; Build Immutability
&lt;/h3&gt;

&lt;p&gt;We follow a strict "Build Once, Deploy Many" pattern. Our builds are cryptographically fingerprinted right on the active release branch.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Day 7:&lt;/strong&gt; Late-stage features (&lt;code&gt;feature-4&lt;/code&gt; and &lt;code&gt;feature-5&lt;/code&gt;) merge into &lt;code&gt;release-1.0.0&lt;/code&gt;. A final candidate artifact (e.g., &lt;code&gt;artifact-1.0.9&lt;/code&gt;) goes through strict UAT sign-off.&lt;/li&gt;
&lt;li&gt;  Meanwhile, &lt;code&gt;release-2.0.0&lt;/code&gt; receives its own merges (&lt;code&gt;feature-6&lt;/code&gt; to &lt;code&gt;feature-8&lt;/code&gt;) and generates its own isolated QA builds.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. The Upstream Catch-Up (Preventing Regressions)
&lt;/h3&gt;

&lt;p&gt;To ensure that bug fixes or stabilizing modifications applied during the June cycle aren't lost in July, we use &lt;strong&gt;Cascading Upward Merges&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Once &lt;code&gt;release-1.0.0&lt;/code&gt; passes UAT, its finalized changes are merged straight up into &lt;code&gt;release-2.0.0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Production Deployment:&lt;/strong&gt; The exact signed-off artifact goes live. The next day, &lt;code&gt;release-1.0.0&lt;/code&gt; is officially merged into &lt;code&gt;master&lt;/code&gt;. Finally, &lt;code&gt;master&lt;/code&gt; is pulled back down into &lt;code&gt;release-2.0.0&lt;/code&gt; to establish a new pristine baseline.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Visualizing the Workflow Timeline
&lt;/h2&gt;

&lt;p&gt;Here is how this multi-track engine runs chronologically. Notice how there is no central "develop" branch creating a bottleneck, allowing the releases to move forward completely isolated:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhj4aukwtwusa914r8ms.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhj4aukwtwusa914r8ms.png" alt="Release Branching Diagram" width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://mermaid.ink/img/pako:eNqdVm2PmkAQ_iubbaxtogZQT-AbIt5xxZcKXnoXE7InK5KurFmhPWv8712W84Ue9V78sJGdZ56ZeWbYZQfnNMBQh5XKLoqjRAc7MIsBqCZLvMJVHVQf0QZXa_nmnMaLKKweQHwnjJJrhtbLsz2-u1nS312G4vkSb7glYSmuFa0mXa2ixEGPmLwErFAU5-4jFmDGAdKZdY0YIgSTnOLIf7QzmqAEFwMsENngHLEXTPvaqco7xCL0SESq54XlKQiKPmU4ZDSNA5MSmmVU_bQQv2qt3KOL5j9zDwFuGe32lXoCz0_pnRhlQ5EUsxT0D53V6yv9TimyT-PEjf6I3snS-qkqyp3F-32lMosP_cr9cjcQBTqYwS5vNMgWEsV4BnNEvj6KugDDBHN7XW5IDanUovzX0jxZ8rVSAfV6HdhD27MNB7ieNXbBZ2COhuZ0MrGGHuhZd5YzGg-y_xz6nPISz3_SNClLplBOD23rsg5u0xj7eV98M00OdRWgA8xCzIcEo6QuFyt_EU65EK6dhSPb94S7eiVc81J1kg6MNHxXdVIx3nMTXM_o2o79YA-vwe10aPE-eJbr5Y_O_QfU_2743TQi_P-vHHIhM8JfV1-k1_qg-GfRlNeiiUCdUhmsgTW5tobmPRhPRr2p6dmjIbgZeX37R4kE2SlVEmbMaODf0GQRPfF0pIbWeG2kzjRcZTkK5gNbSsiRzaN-Ns5vF-kNdGT79gl8lY5PY6mwE8uxDPc4XV9ExV8_MFZTw_PdKIx1gFiyEDDtvXIUYjzzmmgzRwF-Pi4uC3Pq-__5xBD08JrQLRcGhX7xLSiIYxqeeQOmY-BOJ3f2XabS2JgYjmM5wJsY5jf3glCXmu1u47kOBnzD_2CrC1FeSsWPukPTYQ2GLAqgLu5iyN15IvwR7jK-GRQX7QxmBAFeoJSIs2rP3dYofqB0dfDkd1y4hLq4sGswXQf8cOhFKGRoddxlOOafBSa_DROoq21NkEB9B5-gLneURqulXamSpiryVVtr1eCWozoNWZPbKl9kWZXa6r4G_4iwvDGdltSUVUVTm01NbXEHHEQJZYP8y0h8IO3_AhMovT4?type=png" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;mermaid.ink&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  Why This Approach Wins in the Enterprise
&lt;/h3&gt;

&lt;p&gt;If your organization is pushing back, here are the key architectural advantages this model holds over classic GitFlow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;True Cryptographic Certainty: Because we fingerprint our builds directly on the isolated release branches, the binary running in UAT is identical to the one landing in production. GitFlow mandates dual-merging back into master and develop prior to the release execution, forcing an uncontrolled re-compile that invalidates strict testing guarantees.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Zero Resource Bottlenecks: June, July, and August teams can merge code daily into their respective targets. No one is forced to freeze work or wait for a previous month's deployment to clear.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aligned with DORA Capabilities: This model is a proven variation of Trunk-Based Development with Short-Lived Release Branches—the core technical capability highly tied to high-performing DevOps teams worldwide according to the DevOps Research and Assessment (DORA) standards.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stop forcing 2010 branching architectures onto complex, modern parallel delivery schedules. If you are shipping parallel tracks, treat your releases like distinct streams, secure them with immutable fingerprinting, and keep your trunk clean.&lt;br&gt;
What branching strategy does your organization use for complex, multi-month delivery tracks? Let’s discuss in the comments below!&lt;/p&gt;




&lt;h2&gt;
  
  
  Over to You: How Would You Handle This Use Case?
&lt;/h2&gt;

&lt;p&gt;To help frame the discussion in the comments, here is a concise definition of the exact enterprise use case and constraints my team is managing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;The Pipeline Environment:&lt;/strong&gt; A high-volume enterprise backend (Java-based core services) feeding multiple staging, testing, and production environments (Dev, QA, UAT, Prod).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Timeline Constraint:&lt;/strong&gt; Running &lt;strong&gt;three concurrent release trains&lt;/strong&gt; in parallel at any given time (e.g., shipping major feature blocks bound for specific June, July, and August deployment windows).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Scale:&lt;/strong&gt; Approximately &lt;strong&gt;40 feature branches&lt;/strong&gt; per release stream closing into their respective tracks within a single month cycle.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Security Requirement:&lt;/strong&gt; Strict deployment compliance requiring &lt;strong&gt;immutable, fingerprinted build artifacts&lt;/strong&gt; built directly from the release stream, verified via Git tags, and promoted cleanly through QA/UAT without being re-compiled during the deployment phase.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Question for the Community:
&lt;/h3&gt;

&lt;p&gt;We found that standard GitFlow completely falls apart under this multi-track model due to the single &lt;code&gt;develop&lt;/code&gt; branch bottleneck, and pure Trunk-Based Development requires a heavy reliance on Feature Flags that our team maturity isn't ready for yet and also its more manual overhead . &lt;/p&gt;

&lt;p&gt;Our &lt;strong&gt;Trunk-Based Development with Release-Streams&lt;/strong&gt; pattern has kept us sane, secure, and fast. But I want to hear from you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How does your organization handle 3+ overlapping monthly release tracks without falling into cherry-picking hell?&lt;/li&gt;
&lt;li&gt;If you were forced to migrate this exact scenario to a standard GitFlow setup, how would you structure the branches without blocking the parallel teams?&lt;/li&gt;
&lt;li&gt;What edge cases or regression risks do you see in our cascading-merge strategy?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's discuss in the comments below! I'm eager to hear your thoughts, alternative strategies, or critiques.&lt;/p&gt;

</description>
      <category>gitflow</category>
      <category>branching</category>
      <category>git</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
