The history of GitOps, born out of Weaveworks, the evolution of Flux, the four core GitOps principles, the real problems it solves in the world of deployment, and its benefits for teams working on a Git-based workflow.

In episode 0 you prepared your entire environment: a Kubernetes cluster, kubectl, Helm, Kustomize, and the Flux CLI. Now it's time to step away from the terminal and understand why all those tools are needed. GitOps is not just a tool — it is an operating philosophy born from real pain in the world of application deployment.
This episode traces the history of GitOps: who created it, why Flux became the earliest project to realize it, and the concrete problems this mindset solves. Understanding this history matters because every FluxCD design decision in the following episodes — from the controller architecture to the way it reads Git — is an answer to the problems covered here.
Before GitOps, the deployment world went through a long journey that left plenty of scars.
Deployment was originally done entirely by hand: SSH into a server, pull an image, start the process. The problems were obvious — no record of changes, no way to reproduce the same result, and a single typo could break production with no audit trail. Ask yourself: if your production server died today, could you rebuild it exactly as it was?
Enter the Infrastructure as Code (IaC) era: servers and pipelines defined as code. This was a huge step forward, but there was a gap: who executes that configuration? Usually a CI/CD pipeline running kubectl apply against the cluster. This gave rise to the term "config drift" — the configuration in Git no longer matches the actual state of the cluster, either because an unrecorded manual change was made, or because nobody verified what happened after apply.
The philosophical difference can be seen in the commands used in each era:
# The old way: a one-shot imperative command from CI
ssh deploy@prod "docker pull registry/myapp:1.2 && docker restart myapp"
# The GitOps way: change a value in Git, an in-cluster agent does the work
git add deploy/myapp.yaml
git commit -m "chore: update image myapp to 1.2"
git push origin mainNotice the last line: no SSH into servers, no kubectl apply from CI. All that happened was a change in Git — the rest is done by an agent running inside the cluster. This is the core of the paradigm shift from push to pull.
The turning point came in 2017. Weaveworks, a company building tools for Kubernetes, introduced the term GitOps to describe an operating pattern in which Git becomes the single source of truth for a deployment system. Before that name existed, Weaveworks had already built Flux v1 — a tool that continuously synchronizes a cluster with a Git repository — and this became the predecessor of the FluxCD we know today.
After the GitOps term gained popularity, the community formed the GitOps Working Group within CNCF to agree on its definition and principles. Around 2020+, the Flux project hit a second turning point: Flux v2 was completely redesigned with a modular architecture called the GitOps Toolkit. Flux v2 then entered the CNCF sandbox program and eventually graduated as one of CNCF's most mature projects.
Here's a brief timeline:
| Year | Event |
|---|---|
| 2016 - 2017 | Flux v1 developed by Weaveworks as Git-to-cluster synchronization. |
| 2017 | The GitOps term officially introduced by Weaveworks. |
| 2018 | GitOps Working Group formed under the CNCF umbrella. |
| 2020+ | Flux v2 completely redesigned as the GitOps Toolkit architecture. |
| 2022+ | Flux achieves CNCF graduated project status. |
Tip
Get familiar with this broad history: 2017 Weaveworks coined the term GitOps and Flux v1 was born, the GitOps Working Group was formed, in the 2020s Flux v2 was rewritten as the GitOps Toolkit, and then Flux was recognized as a CNCF graduated project.
GitOps stands on four community-defined principles. The entire FluxCD design follows them:
| Principle | Practical Meaning |
|---|---|
| Declarative configuration | Systems are expressed as a description of end state, not a sequence of steps. |
| Versioned and immutable | Configuration lives in an immutable Git history and can be rolled back. |
| Pulled automatically | An in-cluster agent pulls configuration from Git — Git is not pushed to the cluster. |
| Continuously reconciled | The agent continuously aligns actual state with what is declared. |
Compare this with the old way: kubectl apply once, then nothing watches it. GitOps does not stop after apply — it maintains the state forever.
The key phrase is pulled automatically. In a push architecture, cluster credentials must be carried to wherever CI runs — a huge leak potential. In the pull model, the agent inside the cluster holds the credentials, while Git merely provides configuration that is safe for anyone authorized to read. This is one reason GitOps is considered more secure by design, not just because it's a good habit.
The combination of these four principles produces an important guarantee: no matter what happens to the cluster, as long as Git remains correct, the system will return to the declared state. This is the principle FluxCD enforces rigorously.
Why do we need this pattern? Because the following problems occur all too often in teams using manual or CI-driven deployment:
git revert or by checking out a previous commit.Notice the common pattern behind all these problems: they all arise because there is no single, living source of truth. GitOps closes that gap by making Git the sole authority, while giving teams the tools to enforce that authority automatically.
Warning
Rollback in GitOps is not just "re-run the old deploy". Because the agent reconciles continuously, simply restore the Git contents to a good commit — the cluster follows automatically. This is why GitOps excels at disaster recovery.
From a practical standpoint, GitOps changes how teams work in six major ways:
Episode 1 lays the conceptual foundation of this series:
In episode 2 we move to the architecture level: getting to know FluxCD v2, why it chose a modular controller-based architecture called the GitOps Toolkit, FluxCD vs ArgoCD comparisons, and the core components that make it up. See you in the next episode!