`git pull` is `git fetch` plus an immediate merge (or rebase) — meaning you commit to integrating before you've actually looked at what's incoming. This is the safe sequence: fetch, inspect, then decide.
git fetch only downloads objects and updates remote-tracking refs (origin/main) — it never touches your working tree, index, or current branch. That makes it the safe way to see what's new before deciding how (or whether) to integrate it.
git pull --no-commit — fetch + merge, but stop right before the merge commit so you can inspect the index/diff and still `git merge --abort` if it's wrong
There is no `git pull --dry-run` — fetch-then-inspect (above) is the actual substitute. And `git pull --no-commit` is not a no-op: it still merges into your working tree and index, it just stops short of creating the commit — that's different from `git fetch`, which changes nothing local at all.