<?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: Vinicius de Santana</title>
    <description>The latest articles on DEV Community by Vinicius de Santana (@viniciusvts).</description>
    <link>https://dev.to/viniciusvts</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3938874%2Fe57af1ba-d558-4d19-9591-a3bd0208330b.jpg</url>
      <title>DEV Community: Vinicius de Santana</title>
      <link>https://dev.to/viniciusvts</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/viniciusvts"/>
    <language>en</language>
    <item>
      <title>Git Fluid Flow: A Branching Strategy for Decoupled Task Promotion</title>
      <dc:creator>Vinicius de Santana</dc:creator>
      <pubDate>Thu, 18 Jun 2026 17:31:14 +0000</pubDate>
      <link>https://dev.to/viniciusvts/git-fluid-flow-a-branching-strategy-for-decoupled-task-promotion-2h2l</link>
      <guid>https://dev.to/viniciusvts/git-fluid-flow-a-branching-strategy-for-decoupled-task-promotion-2h2l</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Consider the following scenario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Feature A is ready for production.&lt;/li&gt;
&lt;li&gt;Feature B still contains bugs identified by QA.&lt;/li&gt;
&lt;li&gt;Feature C is waiting for client approval in staging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Despite that, all of them belong to the same promotion cycle between environments. As a result, Feature A, which has already been developed, tested, and approved, ends up waiting for the others before it can be delivered.&lt;/p&gt;

&lt;p&gt;If you work in medium-sized or large teams, you've probably experienced something similar.&lt;/p&gt;

&lt;p&gt;As organizations grow, delivery workflows tend to become increasingly unpredictable. Different teams work on different features, approvals happen at different speeds, and priorities constantly change. While some changes need to reach production quickly, others may remain under validation for weeks or wait for business decisions before moving forward.&lt;/p&gt;

&lt;p&gt;In this context, a simple question emerges:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why should an independent task depend on the lifecycle of other tasks in order to be promoted?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Modern branching strategies have solved many important problems over the years. They helped organize teams, reduce risks, and structure integration and deployment processes. However, in environments with a high volume of changes and continuous deployment, it is still common to find workflows where environments represent mandatory promotion stages, causing independent tasks to share the same journey.&lt;/p&gt;

&lt;p&gt;The result is familiar: blocked deliveries, process exceptions, emergency hotfixes, and an increasing need for parallel mechanisms to bypass limitations imposed by the workflow itself.&lt;/p&gt;

&lt;p&gt;Fluid Flow emerged from observing this scenario.&lt;/p&gt;

&lt;p&gt;Instead of treating environments as mandatory stages in a promotion pipeline, Fluid Flow proposes an approach based on decoupled task promotion, where each task has its own lifecycle and can be promoted independently to whichever product states make sense for that delivery.&lt;/p&gt;

&lt;p&gt;The goal of this strategy is not to replace established models nor to serve as a universal solution for every context. Its purpose is to offer an alternative for teams dealing with multiple simultaneous deliveries, independent approval cycles, and the need to maintain reproducible software states without creating artificial dependencies between unrelated tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations of Git Flow and GitLab Flow in Modern Environments
&lt;/h2&gt;

&lt;p&gt;Before introducing a new branching strategy, it is important to recognize one fact: Git Flow and GitLab Flow solved real problems and remain excellent choices for many contexts.&lt;/p&gt;

&lt;p&gt;Git Flow brought structure to teams working with clearly defined release cycles. The model establishes a clear separation between development, release preparation, and emergency fixes, creating a predictable process for software evolution.&lt;/p&gt;

&lt;p&gt;Later, GitLab Flow simplified many aspects of this approach. Instead of relying on multiple specialized branches for releases and hotfixes, the model aligns more closely with the operational reality of many modern teams, especially those practicing continuous integration and frequent deployments.&lt;/p&gt;

&lt;p&gt;However, both models share an important characteristic: change promotion remains strongly tied to environment progression.&lt;/p&gt;

&lt;p&gt;Consider a simplified structure:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbqy6pp1f8wj08zvgoeir.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbqy6pp1f8wj08zvgoeir.png" alt="Simplified Git structure (screenshot by author)" width="694" height="142"&gt;&lt;/a&gt;&lt;/p&gt;
Simplified Git structure (screenshot by author)



&lt;p&gt;In this scenario, environments represent a natural progression of the software. What is in staging has usually already passed testing. What is in production has usually already passed staging.&lt;/p&gt;

&lt;p&gt;This approach works very well when deliveries move forward together.&lt;/p&gt;

&lt;p&gt;But what happens when they do not?&lt;/p&gt;

&lt;p&gt;Imagine three independent features: Social Login, PDF Export, and ERP Integration.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Social Login is ready for production.&lt;/li&gt;
&lt;li&gt;PDF Export still contains issues identified by QA.&lt;/li&gt;
&lt;li&gt;ERP Integration is waiting for approval from an external department.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although these features have completely different lifecycles, they often end up sharing the same promotion flow. As a consequence, a ready-to-ship task may remain blocked waiting for unrelated work to advance.&lt;/p&gt;

&lt;p&gt;In small teams, this impact is usually limited. However, as the number of developers, stakeholders, and concurrent deliveries increases, this dependency becomes increasingly noticeable.&lt;/p&gt;

&lt;p&gt;Both Git Flow and GitLab Flow were conceived around the assumption that software states evolve in a relatively linear fashion. In many contexts, this assumption remains valid and desirable.&lt;/p&gt;

&lt;p&gt;However, some organizations operate differently. Different features may need to move at different speeds, reach different environments, and be promoted at completely independent moments.&lt;/p&gt;

&lt;p&gt;When that happens, a different need emerges: decoupling task promotion without sacrificing traceability, reproducibility, or control over product states.&lt;/p&gt;

&lt;p&gt;This is precisely where Fluid Flow begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Fluid Flow?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fluid Flow is a branching strategy for decoupled task promotion.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea starts from a simple premise:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Independent tasks should be able to evolve independently.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Although this statement sounds obvious, many branching strategies associate feature promotion with the promotion of the environments through which those features travel. As a result, unrelated tasks end up sharing the same lifecycle even when they have completely different levels of maturity, priorities, and approval processes.&lt;/p&gt;

&lt;p&gt;Fluid Flow reverses this logic.&lt;/p&gt;

&lt;p&gt;Instead of using environments as the primary mechanism for software evolution, the strategy places the task at the center of the promotion process.&lt;/p&gt;

&lt;p&gt;This means that every delivery has its own lifecycle and can move independently from other tasks, as long as it is ready to reach the desired product state.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The unit of promotion is no longer the environment. It becomes the task.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This shift in perspective produces an important consequence.&lt;/p&gt;

&lt;p&gt;In traditional models, environments usually represent stages in a temporal progression:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;testing
 ↓
staging
 ↓
main (production)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Fluid Flow, product states no longer represent a mandatory promotion sequence. Instead, they become reproducible and independent states of the product.&lt;/p&gt;

&lt;p&gt;This enables scenarios where different tasks coexist in different states without blocking each other's evolution.&lt;/p&gt;

&lt;p&gt;For example, one feature may exist only in testing while another is already running in production. Likewise, a critical fix may be promoted directly into production without depending on unrelated tasks still undergoing validation.&lt;/p&gt;

&lt;p&gt;The result is a more flexible workflow for teams handling multiple simultaneous deliveries whose approval cycles do not necessarily follow a single chronological path.&lt;/p&gt;

&lt;p&gt;The name Fluid Flow comes precisely from this characteristic.&lt;/p&gt;

&lt;p&gt;Instead of imposing a rigid trajectory for every delivery, the strategy allows each task to follow its own path toward the product states for which it was intended, respecting both operational and business needs.&lt;/p&gt;

&lt;p&gt;This flexibility, however, does not imply a lack of structure. To ensure that decoupled deliveries remain traceable, reproducible, and understandable over time, Fluid Flow establishes a small set of fundamental concepts that serve as the foundation of the strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fundamental Concepts
&lt;/h2&gt;

&lt;p&gt;Fluid Flow was designed to be simple to understand and flexible enough to adapt to different organizational contexts.&lt;/p&gt;

&lt;p&gt;For this reason, the strategy relies on only a few fundamental concepts.&lt;/p&gt;

&lt;h3&gt;
  
  
  State Branch
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A State Branch represents a durable and reproducible state of the product.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The meaning of that state depends on the organization's needs.&lt;/p&gt;

&lt;p&gt;In some teams, a State Branch may represent an environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;env/testing
env/staging
main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In others, it may represent software versions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v1
v2
v3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or even specific releases:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;release/2026.1
release/2026.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fluid Flow does not impose a specific organizational structure. Its only requirement is that these branches represent stable product states capable of serving as starting points for new work.&lt;/p&gt;

&lt;p&gt;For this reason, every task must originate from a State Branch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task Branch
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A Task Branch represents an independent unit of delivery.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It should have a clear scope, identifiable value, and the ability to be promoted without depending on the simultaneous delivery of unrelated functionality.&lt;/p&gt;

&lt;p&gt;In practice, a Task Branch is very close to the concept of a User Story used by many agile teams:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A task should be independent, valuable, small, testable, and capable of being delivered in isolation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task/social-login
task/pdf-export
task/erp-integration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat/social-login
fix/token-fix
patch/report-error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The strategy does not impose a specific naming convention. What matters is that the branch represents a single delivery with its own lifecycle.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;While a State Branch represents a product state, a Task Branch represents a change to that state.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Independent Promotion
&lt;/h3&gt;

&lt;p&gt;Independent Promotion is the central concept of Fluid Flow.&lt;/p&gt;

&lt;p&gt;In traditional models, promotion typically happens through environment progression. A change advances because the environment advances.&lt;/p&gt;

&lt;p&gt;Fluid Flow works the other way around: A change advances because the task advances.&lt;/p&gt;

&lt;p&gt;This means the same task can be promoted into different State Branches according to its maturity and operational needs.&lt;/p&gt;

&lt;p&gt;For example, consider a task &lt;code&gt;task/login-social&lt;/code&gt; created from a commit on &lt;code&gt;main&lt;/code&gt;:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb4furv37w10s7q9zkf9d.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb4furv37w10s7q9zkf9d.png" alt="Task branch has independent promotion" width="763" height="234"&gt;&lt;/a&gt;&lt;/p&gt;
Task branch has independent promotion (screenshot by autor)



&lt;p&gt;Likewise, different tasks can coexist in different product states:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2wu54g3qz0ba6y8ca9cv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2wu54g3qz0ba6y8ca9cv.png" alt="Different tasks can coexist in different product states (screenshot by author)" width="800" height="308"&gt;&lt;/a&gt;&lt;/p&gt;
Different tasks can coexist in different product states (screenshot by author)



&lt;p&gt;Without any mandatory dependency between them.&lt;/p&gt;

&lt;p&gt;This characteristic allows independent features to follow different validation and approval cycles, reducing artificial bottlenecks between deliveries.&lt;/p&gt;

&lt;p&gt;In summary:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In Fluid Flow, the unit of promotion is the task, not the environment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Fluid Flow Axioms
&lt;/h2&gt;

&lt;p&gt;The concepts introduced so far define the elements of the strategy. The axioms define how those elements are expected to behave.&lt;/p&gt;

&lt;p&gt;Unlike operational rules or team-specific conventions, the axioms represent the fundamental principles that characterize Fluid Flow. They preserve the identity of the strategy regardless of the tooling, organizational structure, or delivery process being used.&lt;/p&gt;

&lt;h3&gt;
  
  
  Axiom 1: The Task Is the Fundamental Unit of Promotion
&lt;/h3&gt;

&lt;p&gt;In Fluid Flow, promotion does not happen because an environment evolves.&lt;/p&gt;

&lt;p&gt;Promotion happens because a task evolves.&lt;/p&gt;

&lt;p&gt;Each task has its own lifecycle and its own journey through the delivery process.&lt;/p&gt;

&lt;p&gt;This is the primary shift in perspective proposed by the strategy.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The unit of promotion is the task, not the environment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Axiom 2: Independent Tasks Must Be Able to Evolve Independently
&lt;/h3&gt;

&lt;p&gt;A task should not depend on the promotion of other tasks in order to advance through its own lifecycle.&lt;/p&gt;

&lt;p&gt;If a feature is ready to reach a particular product state, its promotion should not be artificially blocked by unrelated deliveries.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task/social-login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may be promoted to production.&lt;/p&gt;

&lt;p&gt;While:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task/pdf-export
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;remains in staging.&lt;/p&gt;

&lt;p&gt;And:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task/erp-integration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;continues in testing.&lt;/p&gt;

&lt;p&gt;Each delivery evolves according to its own level of maturity and business requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Axiom 3: State Branches Represent Reproducible Product States
&lt;/h3&gt;

&lt;p&gt;State Branches represent known and reproducible states of the software.&lt;/p&gt;

&lt;p&gt;These states may have different meanings depending on the organization's context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Environments.&lt;/li&gt;
&lt;li&gt;Versions.&lt;/li&gt;
&lt;li&gt;Releases.&lt;/li&gt;
&lt;li&gt;Customer-specific customizations.&lt;/li&gt;
&lt;li&gt;Independent product evolution lines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What matters is not the naming convention, but the ability to represent a consistent and understandable state of the system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Axiom 4: The Workflow Must Remain Decoupled from Organizational Structure
&lt;/h3&gt;

&lt;p&gt;Fluid Flow does not require specific environments, naming conventions, merge strategies, or versioning policies.&lt;/p&gt;

&lt;p&gt;The strategy was designed to adapt to the organization's needs rather than imposing a single operational model.&lt;/p&gt;

&lt;p&gt;As a result, different teams can use the same approach while maintaining completely different environments, validation processes, and delivery cycles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flexibility Without Losing Control
&lt;/h3&gt;

&lt;p&gt;The axioms do not dictate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How merges should be performed.&lt;/li&gt;
&lt;li&gt;When rebasing should be used.&lt;/li&gt;
&lt;li&gt;How conflicts should be resolved.&lt;/li&gt;
&lt;li&gt;How branches should be named.&lt;/li&gt;
&lt;li&gt;How pipelines should be built.&lt;/li&gt;
&lt;li&gt;How environments should be organized.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These decisions remain the responsibility of the team.&lt;/p&gt;

&lt;p&gt;The role of the axioms is to establish the minimum set of principles required to preserve the strategy's defining characteristic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Independent tasks should be able to evolve independently.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Practical Example
&lt;/h2&gt;

&lt;p&gt;So far, we have explored the concepts and axioms that define Fluid Flow. Now let's see the strategy in action through a common scenario faced by teams practicing continuous delivery.&lt;/p&gt;

&lt;p&gt;Consider an application with three product states represented by the following State Branches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;env/testing
env/staging
main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;env/testing&lt;/code&gt; represents the testing environment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;env/staging&lt;/code&gt; represents the staging environment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;main&lt;/code&gt; represents the production environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At a certain point, three new requests arrive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task/social-login
task/pdf-export
task/erp-integration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each task represents an independent delivery with its own scope, acceptance criteria, and validation process.&lt;/p&gt;

&lt;p&gt;The tasks are created and developed normally.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main
 ├─ task/social-login
 ├─ task/pdf-export
 └─ task/erp-integration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After development is completed, all tasks are promoted to the testing environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task/social-login    -&amp;gt; env/testing
task/pdf-export      -&amp;gt; env/testing
task/erp-integration -&amp;gt; env/testing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;During validation, the QA team identifies issues in the PDF Export functionality.&lt;/p&gt;

&lt;p&gt;At the same time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Social Login is approved.&lt;/li&gt;
&lt;li&gt;ERP Integration remains under testing.&lt;/li&gt;
&lt;li&gt;PDF Export returns to development for fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point, Social Login is promoted to staging.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task/social-login -&amp;gt; env/staging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meanwhile:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;task/pdf-export&lt;/code&gt; continues receiving fixes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task/erp-integration&lt;/code&gt; remains under validation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After functional approval in staging, Social Login is promoted to production.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task/social-login -&amp;gt; main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that no other task needed to reach the same stage for this to happen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;task/pdf-export&lt;/code&gt; remains in testing.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;task/erp-integration&lt;/code&gt; continues its normal validation process.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Later, ERP Integration is promoted to staging.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task/erp-integration -&amp;gt; env/staging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the end of this scenario, we have something similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;social-login
 └─ main

erp-integration
 └─ env/staging

pdf-export
 └─ env/testing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each task exists in a different product state.&lt;/p&gt;

&lt;p&gt;Each task has a different level of maturity.&lt;/p&gt;

&lt;p&gt;Each task evolves at its own pace.&lt;/p&gt;

&lt;p&gt;Yet none of them blocks the promotion of the others.&lt;/p&gt;

&lt;p&gt;This is the primary objective of Fluid Flow.&lt;/p&gt;

&lt;p&gt;In traditional models, promotion typically follows environment progression. When a group of changes moves forward, every change contained within that state moves forward as well.&lt;/p&gt;

&lt;p&gt;Fluid Flow works differently.&lt;/p&gt;

&lt;p&gt;Tasks advance individually as they satisfy the requirements necessary to reach each product state.&lt;/p&gt;

&lt;p&gt;The result is a workflow where independent deliveries remain independent throughout their entire lifecycle.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A task should be promoted when it is ready, without waiting for other tasks to become ready.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Benefits
&lt;/h2&gt;

&lt;p&gt;Every branching strategy involves trade-offs.&lt;/p&gt;

&lt;p&gt;The goal of Fluid Flow is not to eliminate the inherent complexity of software development, but rather to reduce some of the most common sources of friction faced by teams managing multiple simultaneous tasks with independent validation and approval cycles.&lt;/p&gt;

&lt;p&gt;When applied in the right context, the model provides several important benefits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decoupled Task Promotion
&lt;/h3&gt;

&lt;p&gt;The primary benefit of Fluid Flow is allowing independent tasks to remain independent throughout their entire lifecycle.&lt;/p&gt;

&lt;p&gt;In many traditional models, different features end up sharing the same promotion path between environments. As a result, a task that is ready to ship may be forced to wait for other tasks that have not yet reached the same level of maturity.&lt;/p&gt;

&lt;p&gt;In Fluid Flow, each task follows its own path.&lt;/p&gt;

&lt;p&gt;This allows features to advance according to their own validation criteria, approval processes, and business priorities.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A task should be promoted when it is ready, without waiting for other tasks to become ready.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Reduced Team-Level Bottlenecks
&lt;/h3&gt;

&lt;p&gt;In larger organizations, multiple teams often work on the same product simultaneously.&lt;/p&gt;

&lt;p&gt;Not every task has the same priority.&lt;/p&gt;

&lt;p&gt;Not every task carries the same level of risk.&lt;/p&gt;

&lt;p&gt;Not every task follows the same approval process.&lt;/p&gt;

&lt;p&gt;By making the task the fundamental unit of promotion, Fluid Flow reduces the need for artificial coordination between unrelated work items.&lt;/p&gt;

&lt;p&gt;The result is fewer bottlenecks caused solely by the structure of the branching workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reproducible Product States
&lt;/h3&gt;

&lt;p&gt;In Fluid Flow, State Branches represent known software states.&lt;/p&gt;

&lt;p&gt;These states may represent environments, versions, releases, or any other product evolution line adopted by the organization.&lt;/p&gt;

&lt;p&gt;This approach makes it easier to understand what composes a particular product state at any given moment and simplifies the creation of new work from known references.&lt;/p&gt;

&lt;p&gt;It also makes it easier to reproduce specific scenarios for testing, maintenance, and bug fixes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flexibility Across Delivery Models
&lt;/h3&gt;

&lt;p&gt;Not every organization operates the same way.&lt;/p&gt;

&lt;p&gt;Some practice continuous deployment.&lt;/p&gt;

&lt;p&gt;Others maintain multiple product versions simultaneously.&lt;/p&gt;

&lt;p&gt;Some support customer-specific customizations.&lt;/p&gt;

&lt;p&gt;Others rely on formal release cycles.&lt;/p&gt;

&lt;p&gt;Fluid Flow does not require a specific organizational structure to work.&lt;/p&gt;

&lt;p&gt;The same strategy can be applied using environments, versions, releases, or other mechanisms for representing product states.&lt;/p&gt;

&lt;p&gt;This flexibility allows teams to adapt the model to different contexts without changing its fundamental principles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simpler Automation and Pipelines
&lt;/h3&gt;

&lt;p&gt;When promotion no longer depends on the collective evolution of environments, pipelines tend to become more predictable.&lt;/p&gt;

&lt;p&gt;Instead of interpreting complex release stages, automation can focus on simpler and more objective events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A task was promoted to a specific State Branch.&lt;/li&gt;
&lt;li&gt;A State Branch received new changes.&lt;/li&gt;
&lt;li&gt;A specific product state needs to be deployed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach simplifies the construction of continuous integration and continuous delivery pipelines, reducing special rules and operational exceptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Less Reliance on Parallel Processes
&lt;/h3&gt;

&lt;p&gt;A common situation in teams practicing frequent deployments is the creation of parallel mechanisms to bypass limitations of the main workflow.&lt;/p&gt;

&lt;p&gt;Emergency hotfixes.&lt;/p&gt;

&lt;p&gt;Temporary branches.&lt;/p&gt;

&lt;p&gt;Manual promotions.&lt;/p&gt;

&lt;p&gt;Special release procedures for specific features.&lt;/p&gt;

&lt;p&gt;Although these mechanisms may still be necessary in some situations, decoupled task promotion reduces how often they are needed simply to prevent one task from being blocked by another.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better Alignment with Operational Reality
&lt;/h3&gt;

&lt;p&gt;Perhaps the greatest benefit of Fluid Flow is how closely it reflects the way many organizations already operate.&lt;/p&gt;

&lt;p&gt;In teams handling multiple simultaneous deliveries, multiple business areas, numerous stakeholders, and constantly shifting priorities, features rarely evolve at the same pace.&lt;/p&gt;

&lt;p&gt;Fluid Flow acknowledges this reality and turns it into a natural part of the strategy.&lt;/p&gt;

&lt;p&gt;Instead of artificially synchronizing all work, the model allows each task to follow its own lifecycle while preserving traceability, control, and predictability throughout the delivery process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operational Recommendations
&lt;/h2&gt;

&lt;p&gt;The recommendations presented in this section are not mandatory requirements for adopting Fluid Flow. They represent practices that tend to maximize the benefits of the strategy while minimizing operational issues commonly encountered during its adoption.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prefer Creating Tasks from Their Target State Branch
&lt;/h3&gt;

&lt;p&gt;Whenever possible, create a task from the State Branch that represents its final destination.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main
 └─ task/social-login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;env/testing
 └─ task/social-login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a task is created from an intermediate State Branch, it may inherit changes that have not yet reached their final intended state.&lt;/p&gt;

&lt;p&gt;This increases the risk of unintended dependencies between features that should remain independent.&lt;/p&gt;

&lt;p&gt;Creating tasks from their target State Branch helps preserve decoupling and simplifies future promotions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep Tasks Small and Independent
&lt;/h3&gt;

&lt;p&gt;Fluid Flow works best when each task represents a clear and self-contained delivery.&lt;/p&gt;

&lt;p&gt;In practice, this means a task should have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A specific objective.&lt;/li&gt;
&lt;li&gt;A limited scope.&lt;/li&gt;
&lt;li&gt;Well-defined acceptance criteria.&lt;/li&gt;
&lt;li&gt;The ability to be delivered independently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The larger the task, the greater the likelihood of dependencies, conflicts, and promotion bottlenecks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Be Careful with Task Dependencies
&lt;/h3&gt;

&lt;p&gt;Independent promotion is most effective when tasks are also independent from both a technical and functional perspective.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task/login
task/permissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the permissions implementation depends directly on the existence of the login functionality, both tasks may belong to the same evolutionary path and should be planned accordingly.&lt;/p&gt;

&lt;p&gt;The lower the coupling between tasks, the greater the flexibility during promotion.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use State Branches with a Clear Purpose
&lt;/h3&gt;

&lt;p&gt;State Branches should have a clear meaning understood by the entire team.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;env/testing
env/staging
main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v1
v2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;release/2026.1
release/2026.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What matters is that every team member can quickly understand the role of that branch within the workflow.&lt;/p&gt;

&lt;p&gt;Ambiguous State Branches reduce traceability and make it harder to understand the actual state of the product.&lt;/p&gt;

&lt;h3&gt;
  
  
  Remove Completed Task Branches
&lt;/h3&gt;

&lt;p&gt;Once a task has fulfilled its purpose, its Task Branch typically loses operational value.&lt;/p&gt;

&lt;p&gt;Keeping old branches indefinitely tends to increase repository complexity and make navigation more difficult over time.&lt;/p&gt;

&lt;p&gt;Whenever possible, remove branches that have completed their lifecycle.&lt;/p&gt;

&lt;p&gt;If additional changes are required in the future, a new task can be created from the appropriate State Branch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automate Promotion Whenever Possible
&lt;/h3&gt;

&lt;p&gt;Fluid Flow does not require a specific CI/CD implementation.&lt;/p&gt;

&lt;p&gt;However, the strategy tends to produce better results when validation, build, and deployment processes are automated.&lt;/p&gt;

&lt;p&gt;Because promotions occur independently, automated pipelines help ensure predictability and reduce the operational cost of managing multiple concurrent tasks.&lt;/p&gt;

&lt;p&gt;Automation also improves traceability throughout the lifecycle of each task.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adapt the Strategy to Your Reality
&lt;/h3&gt;

&lt;p&gt;Fluid Flow was not designed to impose a single way of working.&lt;/p&gt;

&lt;p&gt;Different teams have different needs.&lt;/p&gt;

&lt;p&gt;Some organizations rely on validation environments.&lt;/p&gt;

&lt;p&gt;Others maintain multiple product versions.&lt;/p&gt;

&lt;p&gt;Some practice continuous deployment.&lt;/p&gt;

&lt;p&gt;Others operate through planned release cycles.&lt;/p&gt;

&lt;p&gt;The purpose of the strategy is not to replace these particularities, but to provide a model that enables independent tasks to be promoted independently without creating artificial dependencies between them.&lt;/p&gt;

&lt;p&gt;For that reason, adapt these recommendations whenever necessary while preserving the fundamental axioms that define Fluid Flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Branching strategies exist to help teams deliver software with safety, predictability, and traceability. However, as products and organizations grow, the challenges faced by teams evolve as well.&lt;/p&gt;

&lt;p&gt;In many modern environments, the problem is no longer limited to organizing source code or managing versions. The challenge becomes enabling multiple tasks to coexist, be validated at different speeds, and reach their desired product states without creating artificial dependencies between one another.&lt;/p&gt;

&lt;p&gt;Fluid Flow emerged from this need.&lt;/p&gt;

&lt;p&gt;Throughout this article, we explored a proposal built around a simple idea: the task is the fundamental unit of promotion.&lt;/p&gt;

&lt;p&gt;This shift in perspective moves the focus away from environments and toward the work itself. Instead of depending on the collective evolution of product states, each task gains its own lifecycle and promotion path.&lt;/p&gt;

&lt;p&gt;This approach allows independent features to evolve independently, reducing operational bottlenecks and providing greater flexibility for teams handling multiple simultaneous tasks.&lt;/p&gt;

&lt;p&gt;Naturally, this flexibility comes with trade-offs. Fluid Flow does not eliminate the need for sound engineering practices, does not solve existing technical dependencies, and does not replace proper quality, automation, or governance processes. Like any branching strategy, it represents a set of choices and compromises.&lt;/p&gt;

&lt;p&gt;For that reason, the goal of this article is not to present a universal solution nor to suggest that established models should be abandoned. Git Flow, GitLab Flow, Trunk-Based Development, and other strategies remain excellent options when applied to the contexts for which they were designed.&lt;/p&gt;

&lt;p&gt;Fluid Flow is simply an alternative for a specific problem: Environments where independent tasks need to evolve independently.&lt;/p&gt;

&lt;p&gt;Instead of treating environments as mandatory stages in a promotion pipeline, Fluid Flow treats them as reproducible product states.&lt;/p&gt;

&lt;p&gt;And when that shift in perspective makes sense for an organization, a natural consequence emerges:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A task should be promoted when it is ready, without waiting for other tasks to become ready.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>devops</category>
      <category>development</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Choosing the ideal Git branching strategy for your project</title>
      <dc:creator>Vinicius de Santana</dc:creator>
      <pubDate>Mon, 01 Jun 2026 14:04:03 +0000</pubDate>
      <link>https://dev.to/viniciusvts/choosing-the-ideal-git-branching-strategy-for-your-project-2a0l</link>
      <guid>https://dev.to/viniciusvts/choosing-the-ideal-git-branching-strategy-for-your-project-2a0l</guid>
      <description>&lt;p&gt;The &lt;a rel="noopener noreferrer" href="https://git-scm.com/"&gt;Git&lt;/a&gt; is the standard version control system in modern software development. With the ability to track changes and facilitate collaboration between teams, Git allows different versions of the source code to coexist, enabling parallel work and code maintenance.&lt;/p&gt;

&lt;p&gt;Branching strategies are roadmaps teams use to organize their work, maintain control of different code versions, and collaborate smoothly. They define how developers should create, use, and integrate branches throughout the software development lifecycle. Without a clear strategy, teams may face challenges such as frequent merge conflicts, difficulty tracking progress, and instability in the main codebase. Git is a flexible tool and allows different forms of collaboration, there is no single solution for every scenario and teams need to choose the branching strategy that best adapts to their needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploring the Main Git Branching Strategies
&lt;/h2&gt;

&lt;p&gt;Branching strategies evolved to support different development scenarios. Understanding the nuances between them is the first step toward making an informed choice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trunk-Based Development (TBD)
&lt;/h3&gt;

&lt;p&gt;In &lt;a rel="noopener noreferrer" href="https://trunkbaseddevelopment.com/"&gt;Trunk-Based Development&lt;/a&gt;, developers integrate small updates into a main branch, known as the &lt;strong&gt;trunk&lt;/strong&gt; or &lt;strong&gt;main&lt;/strong&gt;. This strategy emphasizes rapid integration with a minimal number of branches, promoting faster iteration.&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%2F45rdzpefui7gz89snh4p.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%2F45rdzpefui7gz89snh4p.png" alt="Trunk-Based Development For Smaller Teams" width="728" height="329"&gt;&lt;/a&gt;&lt;/p&gt;
Trunk-Based Development For Smaller Teams (trunkbaseddevelopment.com)



&lt;p&gt;In TBD, developers work directly on the main branch or use short-lived branches, with a lifecycle of a few hours or at most one day, resisting any pressure to create other long-lived development branches. Code integration and testing happen continuously and pull requests are used for code review before merging feature branches into the trunk. A common technique in TBD is the use of "feature flags" to isolate features that are not yet complete, allowing the code to be integrated without affecting the end-user experience.&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%2Fai5eqqadaguenf490g5h.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%2Fai5eqqadaguenf490g5h.png" alt="Scaled Trunk-Based Development" width="726" height="366"&gt;&lt;/a&gt;&lt;/p&gt;
Scaled Trunk-Based Development (trunkbaseddevelopment.comq)



&lt;p&gt;TBD promotes rapid integration and continuous feedback, minimizes merge conflicts, and encourages frequent communication between team members. It facilitates the implementation of Continuous Integration and Continuous Delivery (CI/CD) and reduces complexity by avoiding the proliferation of long-lived branches.&lt;/p&gt;

&lt;p&gt;TBD also presents challenges. It requires automated testing to guarantee the stability of the main branch. Attention to the process is essential to avoid problems. If not managed correctly, TBD can still lead to conflicts. In addition, the strategy requires developers to divide their work into small batches, which can be a significant change for some teams. The implementation of TBD can also be challenging in scenarios where maintaining multiple versions of the software is necessary.&lt;/p&gt;

&lt;p&gt;Large technology companies such as the &lt;a rel="noopener noreferrer" href="https://trunkbaseddevelopment.com/game-changers/#google-revealing-their-monorepo-trunk-2016"&gt;Google&lt;/a&gt; and the &lt;a rel="noopener noreferrer" href="https://trunkbaseddevelopment.com/"&gt;Facebook&lt;/a&gt; adopted TBD. Adoption by these organizations demonstrates its scalability and effectiveness for complex projects, as long as there is investment in automation and a well-established culture of collaboration. The ability to continuously integrate and reduce conflicts, even in large-scale projects, outweighs the challenges when supported by automation and rigorous code review practices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature Branching
&lt;/h3&gt;

&lt;p&gt;In the &lt;a rel="noopener noreferrer" href="https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow"&gt;Feature Branching&lt;/a&gt; workflow, a new branch is created for each feature from the main branch. Developers work on this branch, making commits as necessary to register progress. Once the feature is complete, a pull request is created to request the integration of the changes back into the main branch. Other developers review the code in the pull request, providing feedback and ensuring quality. After review and approval, the feature branch is merged back into the main branch. Finally, the feature branch is usually deleted because it is no longer necessary.&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%2Ftck9v8bweo3ipqja4tfk.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%2Ftck9v8bweo3ipqja4tfk.png" alt="How to publish your feature using feature branch" width="800" height="141"&gt;&lt;/a&gt;&lt;/p&gt;
How to publish your feature using feature branch workflow (atlassian.com)



&lt;p&gt;Feature Branching offers several advantages. It provides clear isolation of changes for each feature, facilitating collaboration because multiple developers can work on different features simultaneously. If a feature introduces problems, its branch can be discarded without affecting the rest of the project. The strategy also facilitates code review and testing processes, resulting in a predictable development workflow.&lt;/p&gt;

&lt;p&gt;However, Feature Branching also presents some disadvantages. There is a possibility of merge conflicts, especially if feature branches live for a long period. Managing and keeping many branches updated can become complex. There may be delays in merging changes into the main branch due to extensive reviews. In addition, if branches are not merged regularly, they can become stale, making future integration more difficult.&lt;/p&gt;

&lt;p&gt;Feature Branching is a strategy that serves as the foundation for more complex models such as Gitflow and is also adapted into simpler workflows such as GitHub Flow and GitLab Flow. Its flexibility allows it to be used by teams of different sizes and project complexities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gitflow
&lt;/h3&gt;

&lt;p&gt;The &lt;a rel="noopener noreferrer" href="https://nvie.com/posts/a-successful-git-branching-model/"&gt;Gitflow&lt;/a&gt; is a structured branching strategy that uses multiple branches with specific purposes, including &lt;strong&gt;main&lt;/strong&gt;, &lt;strong&gt;develop&lt;/strong&gt;, &lt;strong&gt;feature&lt;/strong&gt;, &lt;strong&gt;release&lt;/strong&gt;, and &lt;strong&gt;hotfix&lt;/strong&gt;. This strategy is suitable for projects with well-defined release cycles.&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%2Ft9brq8t237nkuw6xduid.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%2Ft9brq8t237nkuw6xduid.png" alt="Gitflow workflow" width="800" height="574"&gt;&lt;/a&gt;&lt;/p&gt;
Gitflow workflow (atlassian.com)



&lt;p&gt;In the Gitflow workflow, the main branch stores the official release history, reflecting a production-ready state. The develop branch serves as the integration branch for features under development. For each new feature, a feature branch is created from develop, and after completion it is merged back into develop. When a set of features is ready to be released, a release branch is created from develop to prepare the release by applying final adjustments and bug fixes. After the final tests, the release branch is merged into both main and develop, and the version in main is tagged with the release number. For urgent production fixes, a hotfix branch is created directly from main. After the fix, it is merged back into main (with a new version tag) and into develop (to guarantee that the fix is included in future releases). Branch naming conventions play a crucial role in this model.&lt;/p&gt;

&lt;p&gt;Gitflow offers several advantages. It is well organized and provides a clear workflow for development, testing, and deployment. It is effective for projects with many contributors and supports large teams and complex projects. The isolation of releases guarantees stability during preparation, and the strategy facilitates parallel development.&lt;/p&gt;

&lt;p&gt;However, Gitflow also presents disadvantages. It can be complex and slow for smaller projects or for teams seeking continuous delivery. Historically, it does not fully support CI/CD because of its longer development cycle. Gitflow requires strict adherence to the defined processes and may be considered overly prescriptive or inflexible by some teams. Although it was popular in the past, Gitflow has been losing space to lighter strategies such as GitHub Flow and Trunk-Based Development, especially for teams pursuing agility and CI/CD.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"(Git-flow) has become hugely popular in many a software team to the point where people have started treating it like a standard of sorts — but unfortunately also as a dogma or panacea. [...] To conclude, always remember that panaceas don't exist. Consider your own context. [...] Decide for yourself."&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Vincent Driessen, creator of GitFlow)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  GitHub Flow
&lt;/h3&gt;

&lt;p&gt;The &lt;a rel="noopener noreferrer" href="https://docs.github.com/en/get-started/using-github/github-flow"&gt;GitHub Flow&lt;/a&gt; is a lighter branching strategy focused on continuous delivery, with only one main branch (main or master) and short-lived feature branches. This approach is suitable for small teams and web applications that do not require support for multiple production versions.&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%2Fpv46mh9posroz1llbp5c.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%2Fpv46mh9posroz1llbp5c.png" alt="GitHub Flow Workflow" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;
GitHub Flow Workflow (nhonvo.github.io)



&lt;p&gt;In GitHub Flow, any code in the main branch should be ready to deploy. To work on something new, developers create descriptive branches from the main branch. Commits are made in these local branches and the work is regularly pushed to the remote branch with the same name. When feedback or help is needed, or when the work is considered ready for merge, a pull request is opened. After review and approval by another team member, the branch is merged back into the main branch. Once merged and pushed to main, deployment should happen immediately.&lt;/p&gt;

&lt;p&gt;GitHub Flow offers ease of understanding. Its simplicity allows easy implementation of CI/CD. It is ideal for small teams and web applications and promotes faster releases and feedback cycles.&lt;/p&gt;

&lt;p&gt;However, GitHub Flow has less structure for complex releases or for supporting multiple production versions.&lt;/p&gt;

&lt;p&gt;The popularity of GitHub Flow lies in its simplicity and alignment with agile principles and continuous delivery, making it a preferred choice for modern teams. Its adoption by a leading platform such as GitHub reinforces its practicality and effectiveness.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitLab Flow
&lt;/h3&gt;

&lt;p&gt;The &lt;a rel="noopener noreferrer" href="https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/"&gt;GitLab Flow&lt;/a&gt; is presented as a simpler alternative to Gitflow, combining feature-driven development and environment branches. It seeks a balance between the simplicity of GitHub Flow and the structure of Gitflow, offering more options to manage different environments and releases.&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%2Ftjwe2j05d3zedeogceq8.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%2Ftjwe2j05d3zedeogceq8.png" alt="GitLab Flow" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;
GitLab Flow



&lt;p&gt;In GitLab Flow, development usually starts in the main branch. The strategy incorporates a pre-production branch to perform bug fixes before changes are merged back into main and deployed to production. Teams can add as many pre-production branches as necessary for their workflows, such as &lt;strong&gt;test&lt;/strong&gt;, &lt;strong&gt;acceptance&lt;/strong&gt;, and &lt;strong&gt;production&lt;/strong&gt;. Commits flow from main to the pre-production branches and finally to the production branch, guaranteeing that each line of code is tested in all relevant environments. One of the distinctive characteristics of GitLab Flow is its integration with an issue tracking system, where every significant code change should be associated with an issue describing the purpose of the change.&lt;/p&gt;

&lt;p&gt;GitLab Flow offers several advantages. It provides flexibility to collaborate and maintain multiple software versions across different environments. The strategy reduces the overhead associated with releases, tagging, and merges, which can be challenging in other workflows. It is particularly useful for teams that want to maintain a staging environment separated from production. GitLab Flow is built with DevOps practices in mind, facilitating integration with CI/CD pipelines.&lt;/p&gt;

&lt;p&gt;Although it offers more flexibility than GitHub Flow, GitLab Flow can become complex with a large number of environment branches. In addition, it requires discipline to guarantee that commits follow the correct flow.&lt;/p&gt;

&lt;p&gt;GitLab Flow seeks a balance between the simplicity of GitHub Flow and the structure of Gitflow, offering more options to manage different environments and releases. As an alternative to Gitflow, the emphasis on alignment with specific environments suggests that GitLab Flow was designed to address some limitations of GitHub Flow in more complex deployment scenarios.&lt;/p&gt;

&lt;h3&gt;
  
  
  Other Strategies
&lt;/h3&gt;

&lt;p&gt;In addition to the main strategies, there are other approaches that may be suitable for specific scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Main-Only Strategy: In this strategy, the main branch is used for both development and deployment. It is a simple approach suitable for small teams or very simple projects, but it is not scalable for larger projects or teams with many contributors.&lt;/li&gt;
&lt;li&gt;Release Branching: In this strategy, separate branches are maintained for each software release version. This approach is useful for maintaining a clear history of all releases and guaranteeing that the main branch remains stable and ready for new features. It also facilitates the application of patches and bug fixes in specific versions without affecting others.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparing the Strategies
&lt;/h2&gt;

&lt;p&gt;To help visualize the differences between the main Git branching strategies, the following table summarizes their characteristics, advantages, and disadvantages:&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%2Fvawxipjzweqmb0w3ntt9.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%2Fvawxipjzweqmb0w3ntt9.png" alt="table showing the differences between the main branching strategies" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;
Differences between the main Git branching strategies (author)



&lt;h2&gt;
  
  
  How to Choose the Right Strategy for Your Project
&lt;/h2&gt;

&lt;p&gt;Selecting the ideal branching strategy is not a trivial decision and depends on a variety of interconnected factors.&lt;/p&gt;

&lt;p&gt;The size and structure of the development team play a crucial role. Smaller teams may find simpler strategies such as GitHub Flow or Main-Only more suitable, while larger teams may benefit from the organization and structure of GitLab Flow.&lt;/p&gt;

&lt;p&gt;The complexity and scope of the project are also important considerations. More complex projects generally require more organization.&lt;/p&gt;

&lt;p&gt;The frequency and type of releases (continuous versus versioned) significantly influence the choice. Teams practicing Continuous Integration and Continuous Delivery (CI/CD) usually lean toward GitHub Flow or Trunk-Based Development.&lt;/p&gt;

&lt;p&gt;Team maturity and discipline should also be considered. Trunk-Based Development, for example, requires a high level of discipline and robust automated testing to avoid instability in the main branch.&lt;/p&gt;

&lt;p&gt;The need to support multiple simultaneous versions is another important factor. If the project requires maintaining several production versions, Gitflow or Release Branching may be more appropriate.&lt;/p&gt;

&lt;p&gt;Compliance requirements and the organization's specific release processes can also influence the decision. Some industries may have stricter release processes that align better with structured strategies such as Gitflow.&lt;/p&gt;

&lt;p&gt;The type of product and its release method are also relevant. For example, mobile applications with defined release windows may benefit from strategies such as Gitflow or GitLab Flow with release branches.&lt;/p&gt;

&lt;p&gt;Finally, the team's risk tolerance may play a role in the decision. Strategies with more frequent integration, such as TBD, may require greater confidence in automation and testing.&lt;/p&gt;

&lt;p&gt;Choosing a branching strategy is not an isolated decision, but one that should align with team culture, project goals, and software delivery processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Choosing the ideal Git branching strategy is a crucial decision that directly impacts how a development team collaborates and delivers software. The main strategies discussed — Trunk-Based Development, Feature Branching, Gitflow, GitHub Flow, and GitLab Flow — offer different approaches with their own advantages and disadvantages. The Main-Only strategy and Release Branching address more specific needs.&lt;/p&gt;

&lt;p&gt;The selection of the most appropriate strategy should be carefully considered, taking into account team size, project complexity, release frequency, CI/CD requirements, and team maturity. There is no single solution for every scenario, and the chosen strategy should align with the specific goals of the project and the team's culture.&lt;/p&gt;

&lt;p&gt;Adopting a branching strategy is only the first step. Writing &lt;a href="https://dev.to/blog/standardize-and-facilitate-your-project-documentation/"&gt;commit messages with purpose&lt;/a&gt; helps maintain a clear and useful project history. The consistent application of best practices, such as naming conventions, frequent merges, code reviews, and automated testing, is essential to guarantee an effective workflow and the delivery of high-quality software.&lt;/p&gt;

</description>
      <category>git</category>
      <category>gitflow</category>
      <category>branching</category>
      <category>development</category>
    </item>
    <item>
      <title>How I responded to a Supply Chain attack before it hit my project</title>
      <dc:creator>Vinicius de Santana</dc:creator>
      <pubDate>Mon, 18 May 2026 20:15:47 +0000</pubDate>
      <link>https://dev.to/viniciusvts/how-i-responded-to-a-supply-chain-attack-before-it-hit-my-project-5d05</link>
      <guid>https://dev.to/viniciusvts/how-i-responded-to-a-supply-chain-attack-before-it-hit-my-project-5d05</guid>
      <description>&lt;p&gt;If you work within the modern JavaScript/TypeScript ecosystem, there is a very high chance you are using a TanStack library. Whether it's the omnipresent TanStack Query (formerly React Query), Table, or the newer React Router, they are pretty much everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  The attack
&lt;/h2&gt;

&lt;p&gt;And May 11, 2026, definitely gave a lot of developers a stomachache.&lt;/p&gt;

&lt;p&gt;For those who missed it, the TanStack ecosystem suffered a critical supply chain compromise (&lt;strong&gt;CVE-2026-45321&lt;/strong&gt;). A threat actor managed to compromise TanStack's CI/CD pipelines through a "Pwn Request" (cache poisoning via &lt;code&gt;pull_request_target&lt;/code&gt; in GitHub Actions), successfully publishing 84 malicious versions across 42 discrete packages. While the main blast radius targeted &lt;code&gt;@tanstack/react-router&lt;/code&gt;, the entire stack flashed red.&lt;/p&gt;

&lt;p&gt;The worst part about this type of attack? The malicious code executes immediately the moment you or your build server runs an innocent &lt;code&gt;npm install&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Crisis Mode" Activated: What I did first
&lt;/h2&gt;

&lt;p&gt;When a CVE like this lands on your lap, there's no point in panicking; you need data. My priority was isolating the blast radius using three basic steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  Timeline Cross-Referencing vs. CI/CD Logs
&lt;/h3&gt;

&lt;p&gt;The very first thing I did was open the official TanStack post-mortem to grasp the exact exposure window (the timeline from when the malicious packages became available on npm to when they were officially pulled).&lt;/p&gt;

&lt;p&gt;With those timestamps in hand, I went to our CI/CD server logs. I needed to answer one crucial question: &lt;strong&gt;"Did we run any automated build or deploy pipelines during this specific timeframe?"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Fortunately, the result was negative. Our servers hadn't touched npm while the attack was live. First line of defense: OK.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local Dependency Auditing
&lt;/h3&gt;

&lt;p&gt;Even with the server secure, the danger often lurks right next door: developer machines. Since we use packages like &lt;code&gt;@tanstack/vue-query&lt;/code&gt; and &lt;code&gt;@tanstack/query-core&lt;/code&gt;, there was a realistic risk that someone on the team could have run &lt;code&gt;npm install&lt;/code&gt; locally and pulled a compromised version.&lt;/p&gt;

&lt;p&gt;I immediately alerted the team to pause all local installations and initiated a dependency scan to ensure no one was stuck on an attacker-built version.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leaving a Paper Trail (Governance)
&lt;/h3&gt;

&lt;p&gt;Once the immediate risk was mitigated, I spent some time putting together a technical incident report. It might look like bureaucracy on the surface, but documenting the event chronology, what systems were validated, and logging a final status of "Not Compromised" is what separates a team that "got lucky" from a team with mature governance workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to make sure your environment is clean
&lt;/h2&gt;

&lt;p&gt;If you think you might have been exposed over the past week, the path forward recommended by the TanStack team involves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Force the update:&lt;/strong&gt; Move immediately to the patched versions they released right after the incident.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nuke local cache:&lt;/strong&gt; Changing your &lt;code&gt;package.json&lt;/code&gt; isn't enough. Delete your &lt;code&gt;node_modules&lt;/code&gt; folder, delete your &lt;code&gt;package-lock.json&lt;/code&gt; (or equivalent), and completely wipe your package manager cache (&lt;code&gt;npm cache clean --force&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Host Inspection:&lt;/strong&gt; The malicious script attempts to spread or harvest environment data. It's well worth checking out the &lt;code&gt;Detection&lt;/code&gt; section in their official post-mortem to hunt down any anomalous processes or mutations within your &lt;code&gt;.npm&lt;/code&gt; directory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full post-mortem can be read at: &lt;a rel="noopener noreferrer" href="https://tanstack.com/blog/npm-supply-chain-compromise-postmortem#timeline"&gt;Postmortem: TanStack npm supply-chain compromise&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons for the future (An Architecture Perspective)
&lt;/h2&gt;

&lt;p&gt;Incidents like this remind us that our software architecture is only as strong as the weakest link in our dependency supply chain.&lt;/p&gt;

&lt;p&gt;Monitoring CVEs manually simply doesn’t scale. As a takeaway from this scare, our next step here is refining our CI/CD pipelines to bake in &lt;strong&gt;SCA (Software Composition Analysis)&lt;/strong&gt; tools more aggressively, automatically breaking the build if a &lt;code&gt;package-lock.json&lt;/code&gt; tries to sneak through with a compromised dependency.&lt;/p&gt;

&lt;p&gt;What about you? How did you find out about this attack, and did you manage to run diagnostics on your project in time?&lt;/p&gt;

</description>
      <category>suplychainatack</category>
      <category>webdev</category>
      <category>npm</category>
    </item>
  </channel>
</rss>
