Specor

Git for Product Teams: Applying Version Control Thinking to Product Design

Daniel Ciolfi ·

Every software engineer understands Git intuitively. You branch to work in isolation. You commit to seal a unit of work with a message. You merge when you’re confident. You roll back when something goes wrong. The whole model is built on a simple premise: changes should be explicit, reversible, and traceable.

Product teams don’t have any of this.

Product changes live in Notion pages, Figma files, Jira tickets, Slack threads, and email chains. There’s no canonical version. There’s no history. There’s no way to roll back. And there’s definitely no way to run two experiments in parallel without one overwriting the other.

What would it look like to give product teams the same primitives that engineers take for granted?

Commits: Sealing a Unit of Work

In Git, a commit is a named, immutable snapshot of the codebase at a specific point in time. It has a message, an author, a timestamp, and a parent. It’s the atom of version control.

The product equivalent is a semantic commit: a named snapshot of your product definition. “Checkout redesign v2 — adds guest checkout flow and removes email-first requirement.” That commit seals a set of product changes — node additions, relationship modifications, rule updates — into a versioned unit you can reference, compare, or revert to.

Unlike a Jira ticket or a Notion page, a semantic commit is:

This gives your product history the same integrity that your codebase has always had.

Branches: Parallel Exploration Without Conflicts

Branches are how engineers work on multiple things at once without stepping on each other. The main branch is always stable. Feature branches are where experiments happen.

The same model applies to product design. Imagine you’re exploring two different approaches to onboarding — one short-form, one guided multi-step. Right now, you’d probably prototype them in separate Figma files and Notion docs, with no formal relationship to the main product model. When you pick one, you’d manually reconcile it.

With product branches, you fork from main, make structural changes to each approach, and keep them fully isolated. The main product model stays clean. When you’re ready, you merge the winning approach — and the merge process tells you exactly what’s changing and flags any conflicts with other in-flight work.

This isn’t a metaphor. It’s a literal workflow:

  1. Fork from the current product state
  2. Evolve the branch — add features, modify rules, update flows
  3. Review the semantic diff before merging
  4. Merge when approved, with conflict detection

No more “wait, which version of the onboarding flow is current?”

Diffs: Seeing Exactly What Changed

One of the most powerful things about Git is git diff. Before you merge, before you deploy, you can see a precise, line-by-line accounting of what changed.

Product teams don’t have this. “What changed in this sprint?” usually requires someone to manually reconstruct a narrative from tickets and comments.

A semantic diff gives you the product equivalent: a structured view of exactly what changed between two states. New nodes added. Relationships modified. Rules changed. Flows restructured. Not prose — structure. The diff is machine-readable and reviewable, like a PR for your product model.

This makes design reviews radically more efficient. Instead of “walk me through all the changes,” you share a diff. Reviewers can focus on what actually changed, not reconstruct the delta from memory.

Rollback: Undoing Without Destroying

In Git, git revert creates a new commit that undoes a previous one. It doesn’t rewrite history — it adds to it. The original change is still there; you’ve just added a reversal.

This is the right model for product changes too. If a feature launch goes wrong, you don’t want to silently overwrite your product model. You want to create a new commit — a named, explicit rollback — that says “we reverted checkout v2 back to the previous behavior, because of X.”

This preserves the history. You can still see what you tried, when, and why it was rolled back. That’s institutional knowledge.

The Missing Primitive: Why Product Teams Don’t Have This Yet

The reason product teams don’t have these primitives isn’t that nobody thought of it. It’s that building them requires solving a harder problem: what is the “code” of a product?

For software, code is text. Git diffs text. But product definitions aren’t text — they’re a semantic graph of features, needs, rules, flows, and relationships. Diffing and merging a graph is fundamentally harder than diffing a file.

Specor solves this by modeling your product as a typed ontology — a graph with defined node types, relationship rules, and invariants. Once your product has structure, you can diff it, merge it, branch it, and commit it the same way engineers do with code.

The mental model is already there. Developers have been living it for decades. Product teams just need the tooling to catch up. And the first step is recognizing that your current PRD is already out of date.

Explore Specor →