Versioning

DVC vs lakeFS vs Delta Lake

DVC, lakeFS, and Delta Lake all version data, but they version different things. DVC versions files next to Git. lakeFS versions a data lake with Git-like branches on object storage. Delta Lake is an ACID table format on Parquet with time travel. They are not interchangeable.

Updated · Part of What is dataset versioning?

Three versioning jobs

"Git for data" is a slogan that covers unlike products. One pins files for an ML experiment. One branches a lake without copying objects. One is a table format with transactions.

DVC

DVC (Data Version Control) versions datasets and models beside Git. You install it as a CLI, a VS Code extension, or a Python library. It stores hashes in Git and large files in remote storage you configure. It is a workflow around files and pipelines, not a lakehouse table format. Docs: https://dvc.org/doc

lakeFS

lakeFS is version control over a data lake using Git-like semantics: branch, commit, merge, revert, tag, and hooks. Initial branch creation is a metadata operation (zero-copy). Data stays in S3, GCS, Azure, or compatible storage. It speaks the S3 API so existing tools can read lakefs://repository/branch/path. Teams use it for isolated experiments, write-audit-publish, and agent branches gated by pull requests. Docs: https://docs.lakefs.io/

Delta Lake

Delta Lake is an open-source storage layer that enables a lakehouse on data lakes: ACID transactions, scalable metadata, unified streaming and batch, schema enforcement, time travel, and upserts/deletes (MERGE). Tables live as Parquet plus a transaction log on S3, ADLS, GCS, or HDFS. Engines include Apache Spark, Flink, Hive, Trino, and others. Docs: https://docs.delta.io/latest/delta-intro.html

How to choose

Pick the unit you need to pin: a file set, a lake branch, or a table version.

  • Pick DVC when Git already versions code and you need to pin dataset files and pipeline stages for an experiment.
  • Pick lakeFS when many tools share a bucket and you need isolated, zero-copy branches and atomic merges on that lake.
  • Pick Delta Lake when Spark (or another connector) should read and write ACID tables with time travel on Parquet.

Last reviewed

Facts on this page were checked against vendor documentation on 2026-10-28. Product surfaces move; treat version names and APIs as directional and follow the official links in Related.

DVC vs lakeFS vs Delta Lake (last reviewed: Oct 2026)

DVC vs lakeFS vs Delta Lake (last reviewed: Oct 2026)
DVClakeFSDelta Lake
What it versionsFiles and pipeline stages next to GitA data lake: branches, commits, mergesTables: Parquet files plus a transaction log
Unit of isolationA Git commit plus DVC remotesA branch (zero-copy metadata)A table version (time travel)
TransactionsGit commit of hashes, not lake ACIDAtomic merge of a branchACID on Spark and other connectors
Where bytes liveA remote you configure (S3, local, and others)Your existing bucket; lakeFS is a metadata layerThe lake path you give the table
Best forML experiments that must pin filesGit-like collaboration on a shared lakeLakehouse tables with MERGE and time travel
Official docshttps://dvc.org/dochttps://docs.lakefs.io/https://docs.delta.io/latest/delta-intro.html

Where Pixeltable fits

Use Pixeltable when the unit you need to pin is a table of typed media and computed columns, with history() and revert on that catalog, not a lake branch and not a Git-tracked file hash. It is not DVC, not lakeFS, and not Delta Lake. Keep DVC for experiment files beside Git. Keep lakeFS when the company lake needs Git-like branches. Keep Delta Lake when Spark ACID tables are the contract. Export to a lake when a warehouse or lakehouse must read a snapshot.

import pixeltable as pxt
from pixeltable.functions.openai import chat_completions
TableModel = pxt.model_base()
class Docs(TableModel, name='docs'):
text: pxt.String
summary = chat_completions(
messages=[{'role': 'user', 'content': text}],
model='gpt-4o-mini',
).choices[0].message.content
# pxt schema update app.py docs -f
# Insert recomputes that row. Unchanged rows keep the cached summary.
# pxt history
# pxt revert --steps 1

Questions

Is lakeFS the same as Delta Lake time travel?

No. lakeFS versions a lake with branches and commits over objects, format-agnostic. Delta Lake versions a table format (Parquet plus log) with ACID and time travel. You can store Delta tables in a lake that lakeFS versions.

Is DVC a lakehouse?

No. DVC versions files and pipelines next to Git. It does not provide Spark ACID tables or lake branches.

Can I use more than one?

Yes. DVC for the training repo's data files, lakeFS for isolated lake branches, Delta Lake for the tables Spark reads. They overlap only in the slogan "version data."

Where do computed media columns fit?

In an application catalog that versions rows and expressions. Pixeltable does that job. It does not replace lake-scale Git semantics or Delta MERGE.

Next step

Install the Pixeltable skill, or sign up for Cloud and run the same file on a hosted database.