Skip the cruft
You almost never want to sync a project verbatim. node_modules, .git, build artifacts, .DS_Store, __pycache__, log files — all noise. Excluding them speeds transfers, saves space, and avoids overwriting target-side state you didn't mean to touch.
Two ways: inline and .rsyncignore-style
For one-offs, inline --exclude per pattern. For project work, keep the patterns in a file and use --exclude-from=. Same syntax as gitignore-ish: leading / anchors to the source root, trailing / matches directories, * globs.