Rsync not updating timestamp
Bidirectional synchronization means two (or sometime more) locations are all working copies, and changes in any one should become current in the other(s).
Which can cause more sorts of conflicts, as you can imagine.
In other words, it selects a file for transfer when it has changed size, and/or a changed last-modified time.
This is usually good behaviour, skipping files (and saving IO on) that haven't been touched, and only really assumes that timestamps are always written/updated on the destination.
In some cases you may want automatic resolving policies (such as "throw away all data but the one that says it's the newest"), in other cases you may to deal with conflicts interactively (in the interest of not losing data, so even if it's a tedious process).
Bandwidth (and read/write speed) is typically scarcer than storage size, so for many use cases there is quite a bit you can save by sending only differences.
There are other potential problem cases, such as multiple copies saying they have a variant of the data.This is less true these days; rsync comes from a time when network speed was much lower than disk speed.Which is also why it disables the rolling-hash thing on local transfers (and becomes a fairly dumb copier) - it's rarely ever worth it.It also implies that rsync can effectively continue broken-off transfers.