Overall, you have several options for versioning:

1. Check a single file (e.g. look at the version # of your executable), and if it's less than the current version, apply patches for each successive version until it's up to date. This is the way many games work. The downside is that you have to sequentially progress through the versions, and if multiple versions update the same file, you may be getting it several times. The benefit is that depending on your patch technology, you may need only to send those portions of the files that changed.

2. Similar to #1, but have either the client or server calculate a cumulative list of files that have changed between the source and target version and send each in entirety. The downside is that you send entire files, even if there are only partial changes, but the upside is that you can jump many versions in one update, and if you routinely change most/all of a file, this could save bandwidth compared to 1.

3. If your total installation size is small enough, you can hash each file, compare with the server, and send any that have a hash mismatch. The downside is that you need to hash your entire installation, the benefit is that you can also repair broken files (many games use this along side #1, with #1 being used for most patching, and #3 being used as a repair option)