3 min read

Our Journey with Branching Models: They're Not Just for Big Teams

Our Journey with Branching Models: They're Not Just for Big Teams

Remember the early days of your dev career? The adrenaline of pushing code, the camaraderie of a small team... and maybe a silent prayer that your latest changes wouldn't completely derail what someone else was doing? Yeah, we've been there. At Intuto, as we continued to build and our development efforts scaled, so did the headaches of managing our codebase. It’s funny (and a little bit terrifying) to look back and realise how much we fumbled our way through code collaboration before finding our stride. If you’re a small dev team feeling like you’re constantly tripping over each other’s code, trust us, you're not alone, and everyone makes these kinds of mistakes.

Our Journey from SVN to Git

A decade ago, our world ran on Subversion (SVN). It served a purpose, but its limitations, especially when trying to manage concurrent development, quickly became apparent (If you're curious about why, this article offers a good overview: Why is Git Better than SVN?). We knew we needed something more flexible, so we made the leap to Git, on a self-hosting Bitbucket Server. This was just as Bitbucket Cloud was emerging, and honestly, the idea of having all our precious code floating "out there" in the cloud felt a bit too risky for us back then, particularly with concerns about service uptime for something so critical.

In those initial Git days, our workflow was… minimalist, to say the least. We all just coded directly on the master branch. Deployments happened when we collectively decided enough features were "ready." As you can imagine, this led to a lot of overlapping work, difficult merges, and often, features being held hostage by others that weren't quite finished. It was the digital equivalent of everyone driving their car on the same road, at the same time, trying to get to different destinations. Chaos.

We eventually tried to bring some order to the madness. We created a development branch, thinking it would keep master pristine for hotfixes, always mirroring production. Better, right? Not quite. Our feature branches off development often became sprawling behemoths, containing numerous unrelated changes. Reviewing these giant pull requests became a daunting task. We were reviewing syntax adherence to our coding standards, but understanding the actual purpose and impact of the changes buried within felt impossible. Sometimes, to add another layer of complexity, multiple devs would code different features on the *same* branch. It was still far from efficient.

 

The "Aha!" Moment: Embracing GitFlow

We knew there had to be a better way, but clear, straightforward information for small teams like ours was hard to find back then. It felt like these advanced branching models were reserved for huge enterprises with dedicated DevOps teams. The thought of committing to a new, seemingly complex workflow felt risky; what if we broke everything? We’d just have to try it and see.

The real breakthrough came when we finally moved to Bitbucket Cloud (our initial fears about cloud security eased over time) and, crucially, we implemented GitFlow. It felt like the clouds parted. Instead of a single, overburdened development branch, GitFlow introduced a clear structure: master for production-ready code, development for ongoing integration, and dedicated branches for features, releases, and hotfixes. Each feature branch now focused on one single development objective.

Our biggest "aha!" moment? We used to think that one massive review of many different code changes was saving us time. It wasn't. We now know that creating more, smaller pull requests, each focused on a single change, while seemingly more cumbersome, actually helps us understand the changes in their entirety. This makes code reviews far easier, quicker, and enables us to spot bugs and logical flaws much faster. Instead of trying to figure out why a change was made amidst a sea of other modifications, each PR tells a clear, concise story.

 

Our Key Lessons for Your Team

Our journey wasn't perfect, but it taught us invaluable lessons we want to share. If you’re a small dev team struggling with code collaboration, consider these takeaways:

  • Don't Fear the Branching Tree (or the Flow!): What seems complex upfront, like managing more branches and more frequent pull requests, is an investment that pays off *huge* in the long run. We initially thought branching models were overkill for a small team, but they transformed our workflow. It’s worth reviewing different models to find what fits your team: Compare Git Workflows.

  • Small PRs, Big Wins: This was our biggest paradigm shift. It feels counter-intuitive to create many small pull requests for single, focused changes. You might think one giant review saves time. It doesn't. Smaller, focused PRs mean easier, quicker reviews, better bug detection, and a clearer understanding of why a change was made, not just what changed.

  • Deploy on Demand, Not by Accident: A well-structured branching model means you’re no longer holding back an entire release because one feature isn’t quite ready. You can deploy what *is* complete and stable, and defer what isn't, giving you incredible flexibility and reducing deployment anxiety. It allows you to "go live" with confidence, without everything in master needing to be perfect. For a deeper dive into GitFlow itself, check out this great overview, including visual diagrams: Understanding GitFlow.

Looking back, we can see how much our process has matured. The lessons we learned the hard way can hopefully save your team some headaches. Sometimes, the right path only becomes obvious once you’re already past the detours.

 


We used to think branching models like GitFlow were only for massive dev teams. Turns out, we were wrong (and life's a lot better now!). What's been your biggest misconception or "aha!" moment about code collaboration? Share your thoughts on X with #intutobuild and tag us @intutohq

 

Welcome to intuto.build()

Welcome to intuto.build()

Hey there, fellow builders! The team at Intuto is thrilled to announce the launch of our new blog: intuto.build() For a while now, we've been wanting...

Read More