Agile Flow... why and what?

For some time now, my team and I have been using the Git-Flow version-control workflow. But as we go more and more into agility, I have found that Git-Flow does not fit our needs nor the ones of our clients.

To me, this come from the very nature of Git-Flow that relies on the Develop branch to make developments go live. Indeed, as each feature must be merged into Develop prior to be released, this makes things to much linear. All features that are on develop must be 100% ready in order to go live. This avoids the client to chose which feature(s) s•he wants to go live at what time. We, as developers, must then wait for our client to validate what is available on the Develop branch at a given time. And there may be a feature that has been ready for ages (days, weeks ?) but that cannot go live because another one still needs improvements. And this kills both agility and continuous integration.

The idea that led to Agile Flow is really to give the ability to the client to cherry-pick features to go live and say "I'm happy with this feature as it is today on Develop, please plan it for the next release! But this other feature still needs some work so let's keep on updating Develop with my new requirements on this other feature".

Agile Flow workflow chart

Advantages of Agile Flow

  • Any feature can go live at any time.
  • Have a view of what will go live next - may be a subset of some features.
  • Have a view of all features stacked.
  • Create new features based on what is live rather than what will be live. This increases stability.
  • Each feature can live on its own.
  • Each feature can continue being developed continuesly.
  • The client can choose which available features will go live next. This is where Agility resides.
  • Ability to forecast and test several releases.

Branches roles

  • Master - What is currently live in production. This is what the end-user uses.
  • Release - What will be the upcoming live version. This is what the end-user will use next.
  • Hotfix - Fixes that are feature-independant.
  • Feature(s) - Functionnalities that are meant to go live or not.
  • Develop - A full stack of the existing code. This is what the client uses. This is from here that the client cherry-picks the feature(s) to go live.

Principles

  • A Feature is always a branch of Master.
  • Only Release can be merged into Master.
  • Develop is never merged. Never. Nowhere.
  • All Features you want to show to your client must be merged into Develop.
  • There may be several Release branches.