Model versioning records every trained model and exactly how it came about.
A version number on a file is not versioning.
The version should pin the code, the data, the hyperparameters and the resulting metrics.
That combination is what makes a result reproducible.
Without it you cannot answer which model produced a given bad prediction.
That question arrives eventually, usually from someone senior and unhappy.
Data is the part people skip and the part that matters most.
The same code on last month's data is a different model.
DVC versions large files alongside git without putting them in git.
MLflow records runs, parameters, metrics and the model artefact together.
A registry adds lifecycle stages such as staging and production.
Rollback should be a matter of pointing at the previous version.
Log the model version with every prediction, since that is what links output to lineage.
Keep old versions, because the one you deleted is the one you need.
Treat a model as an artefact with provenance, not as a file someone produced.