

11 September 2026

Git solves a problem for code: track every change, let multiple people work without overwriting each other, and make any previous state reproducible on demand. The moment a project involves datasets and trained models instead of just code, none of that holds — Git wasn't built to version large binary files efficiently, and "reproduce this exact result" stops being answerable without knowing exactly which dataset and model version produced it.
DVC (Data Version Control) exists to close that gap — treating datasets and models with the same discipline Git already gives code.
A single person, on one machine, running one training script, can get away without this — they just remember what they did. The problem shows up the moment any of that changes: a second contributor joins, the dataset gets updated and you need to compare model performance across both versions, or you need to answer "which exact run produced the model currently in production" months after the fact. At that point, "I think it was this version" isn't good enough.
DVC tracks large files (datasets, model weights) outside of Git — typically in cloud storage — while keeping lightweight pointer files inside Git that reference the exact version. That means:
git checkout an old commit and dvc pull gets you the exact dataset and model that were used at that point, not just the codeThe mental shift DVC forces is treating a dataset version and a model checkpoint the same way you'd treat a code change — something with a version, a diff, and a history — rather than a loose file sitting in a folder that gets silently overwritten the next time someone reruns preprocessing.
"Reproducible ML" gets talked about as a training-code problem, but in practice it's just as often a data-versioning problem — the same training code run against a slightly different dataset version produces a different model, and without DVC-style tracking, that difference is invisible until results stop matching and nobody can say why.
FAQ
Git isn't designed for large binary files — it handles them inefficiently, and it has no concept of 'which dataset version produced this result,' which is exactly what reproducibility requires.