Skip to main content

Feature Flags Killed My Team's Release Branch Problem

If you've ever watched a release slip because someone forgot to cherry-pick one commit onto the release branch, or spent an afternoon untangling why develop and main disagree about what's actually live, you've already run into this problem. The branching model usually gets blamed, but it's rarely the real issue — it's a mismatch between the strategy you copied and your actual deploy frequency, whether you need multiple versions live at once, and which manual steps nobody's gotten around to automating.

Here's what I'd actually tell a team picking a branching strategy today, with the specifics that usually get skipped in the "GitFlow vs. trunk-based" comparisons.

Deploy Frequency: The One Number That Decides Everything

The branching debate isn't really about GitFlow vs. trunk-based philosophy — it's about how often you ship and how many versions need to be live simultaneously:

  • Deploying daily or more fits trunk-based development. Feature branches merge into main within a day or two; long-lived branches actively hurt you here, because by the time one merges, main has drifted enough that the merge itself — not the code — becomes the risky part of the release.
  • Deploying every few weeks to monthly, one version live fits a stabilization branch cut from main at release time — not a permanent develop branch. The stabilization window is real work (QA, targeted bugfixes) that shouldn't block ongoing development on main.
  • Multiple versions live simultaneously — enterprise customers on staggered releases, regulated environments with audit trails — is the only case where long-lived release branches and GitFlow's full ceremony earn their overhead.

Most teams default to the third bucket because that's what the diagrams online assume. Check your actual cadence before you inherit that complexity.

Release Branches: Cut Them From main, Don't Maintain Them Forever

For a monthly cadence, the concrete workflow looks like this:

# Ongoing development, short-lived feature branches
git checkout -b feature/invoice-export main
# ... work, PR, merge into main after CI passes

# When it's time to prepare a release
git checkout -b release-2026-10 main

From that point, release-2026-10 gets bugfixes only — no new features. Development for the next release keeps merging into main in parallel; the two branches don't block each other.

# Bugfix found during QA on the release branch
git checkout release-2026-10
# fix, commit
git cherry-pick <fix-commit-hash>   # bring it back into main too

Some teams flip this order instead: land the fix on main first through a normal PR, then cherry-pick it backward into the release branch. That keeps the release branch review-light and avoids ending up with a fix that only ever existed there. Either direction works — pick the one that matches how much you trust a change that skips your usual review path.

Name the branch by date, not semver, unless something downstream (a versioned public API, for instance) genuinely consumes semver. "Minor or major bump" is a question a five-person team doesn't need to answer every month, and a date answers something a version number can't: what was actually live on a given day.

The Selection Problem: Feature Flags, Not Cherry-Picking

This is where most manual release processes quietly rot. Hand-selecting commits or copying files right before a release works fine a few times, then someone forgets a dependent commit or copies a stale file, and the release ships a regression unrelated to its actual content.

The fix isn't a more careful manual process — it's removing the selection step entirely:

  • Feature flags on anything not release-ready — code that's passed review and CI merges into main right away, complete or not, with unfinished work sitting behind a flag that defaults to off. The flag hides the feature from users; it doesn't lower the bar for what gets merged. Cutting the release branch then means taking everything in main, because anything not ready is already invisible to users.
  • The gate: no flag, no merge — a feature that isn't behind a flag and isn't finished simply doesn't merge yet. That's a discipline cost, but a smaller one than a release process nobody trusts.

This single change is the highest-leverage fix for a team currently doing manual cherry-picking or file copying at release time.

The production Branch: Automate the Pointer, Don't Maintain It

A tag or a release branch answers "what's live" for anyone willing to run git describe --tags --abbrev=0 or check the CI/CD dashboard. A persistent production branch answers it for anyone who'd rather just run git log production — and on a team where not everyone lives in the terminal, that's worth having.

The failure mode is maintaining it by hand: someone has to remember to fast-forward it after every release, which reintroduces the exact manual-step risk this whole approach is meant to eliminate. Make the update a side effect of the deploy pipeline instead:

# after successful production deploy
permissions:
  contents: write

steps:
  - name: Update production branch pointer
    run: |
      git push origin <released-tag>^{commit}:refs/heads/production --force

Two things that trip people up the first time: the job's token needs contents: write, and if production has branch protection rules — a common instinct for a branch with that name — you'll need an explicit exception letting the deploy job force-push past them. Skip either and the update fails silently, and you're right back to a stale pointer nobody trusts.

production becomes a mirror, not a maintained artifact — nobody updates it, so nobody forgets to.

Common Pitfalls

  • A develop branch that never dies — running develop and main as parallel permanents means keeping them in sync becomes its own recurring source of "which one actually has the latest code."
  • Branches per environment instead of per release — dev/staging/prod as permanent branches conflates two separate concerns: what the code looks like, and where it's deployed. The same commit should move through environments via configuration, not by being re-merged into a differently-named branch.
  • Hotfixing a release branch without cherry-picking back — a fix that exists only on release-2026-10 disappears the moment that branch is deleted, and resurfaces as a "didn't we already fix this?" two releases later.
  • No fixed rule for when the release branch cuts — an ad hoc cut date means QA doesn't know when their window starts and developers don't know if their PR makes the release.

The Honest Takeaway

Branching strategy isn't a matter of taste — it's a direct function of deploy frequency and how many versions need to be live at once. Most teams over-engineer this by adopting a model built for a cadence they don't actually run, then compensate with manual work: ad hoc cherry-picks, hand-copied files, permanent branches nobody remembers to sync.

Match the strategy to your real release cadence, automate what's currently manual — feature flags instead of selective merging, a pipeline-driven pointer instead of a hand-maintained branch — and the branching model stops being something the team argues about every release.

Comments

Popular posts from this blog

The Power of Relationships: Strategies for Prioritizing Connections in Business

  Introduction      Introduce the central theme of prioritizing relationships in business and its significance for long-term success.   Highlight the impact of strong relationships on customer loyalty, employee engagement, and organizational growth.   Provide an overview of the comprehensive strategies, case studies, and references covered in the blog post. Understanding the Importance of Relationships in Business     Define the concept of relationship-building in the business context and its role in fostering trust, loyalty, and collaboration.   Explore research findings from institutions like Harvard Business Review and Gallup on the tangible benefits of strong business relationships.   Showcase case studies of companies like Amazon and Zappos that prioritize customer relationships and the resulting impact on brand reputation and market share. Strategies for Building Strong Customer Relationships     Discuss evidenc...

The Power of Giving Back: How Corporate Social Responsibility Drives Success

 Introduction - Set the stage by emphasizing the importance of corporate social responsibility (CSR) and giving back in today's business landscape. - Highlight the potential benefits of giving back, including improved brand reputation, employee morale, and community impact. - Provide an overview of the comprehensive strategies, case studies, and references covered in the blog post. 1. Defining Corporate Social Responsibility (CSR) - Define CSR and its significance in modern business practices, drawing from seminal works such as Carroll's CSR Pyramid. - Explore the multifaceted nature of CSR, encompassing philanthropy, environmental sustainability, ethical labor practices, and community engagement. - Provide insights from research studies and industry reports on the growing importance of CSR in driving business success and societal impact. 2. The Business Case for Giving Back - Discuss the tangible benefits of giving back to society, including enhanced brand reputation, customer...

Unlocking Business Potential: Strategic Implementation of AI

Introduction - Establish the significance of artificial intelligence (AI) in reshaping business landscapes, driving innovation, and enhancing competitiveness. - Introduce the multifaceted role of AI in business operations, from customer engagement to process optimization. - Provide a succinct overview of the comprehensive strategies outlined in the blog post for effective AI integration. 1. Defining AI and Its Business Applications - Articulate a comprehensive understanding of AI, encompassing machine learning, natural language processing, and computer vision. - Examine the diverse applications of AI across industries, illustrating its transformative potential in driving efficiency and innovation. - Offer compelling examples of businesses leveraging AI to streamline operations, personalize customer experiences, and gain strategic insights. 2. Strategic Identification of AI Opportunities - Advocate for a systematic approach to identifying AI integration opportunities, rooted in thorough...