It’s a bit hard to say without knowing the exact requirements, but would storing each update (or bunch of updates) to a file as deltas be sufficient?
If the files are text-based (binary probably too, just harder?) the deltas could be created from a diffing algorithm for which there usually are libraries in many languages.
If the deltas are timestamped, a rollback would be as simple as only applying the deltas up to the requested date when loading a specific version of a file. 🤔
