That sounds like expected behavior. Both users are incrementing a value of 100, which would be 101 in both cases. It's not atomic.
If User A incremented 100, and saved it down; then User B loaded this saved state and incremented 101, it'd be 102.
If User A incremented 100, and saved it down; then User B loaded this saved state and incremented 101, it'd be 102.
For example, say you have a list AND a counter. Everytime you add an item to the list, you need to increment the counter, as an invariant of your system.
Of course, it's a contrived example, but you get the point: things can get more complicated and the system may break as a result, unless you're very careful.
But we merge by using differential synchronization (kinda) to resolve local changes and remote changes (to construct a "patch") by keeping an unchanged copy of the upstreams latest version (from the clients perspective).