From --help:
--ff When the merge resolves as a fast-forward, only update the branch pointer, without creating a merge commit. This is the default behavior.
--no-ff Create a merge commit even when the merge resolves as a fast-forward. This is the default behaviour when merging an annotated (and possibly signed) tag.
If you merge fast-forward the existing "source"-commits are "placed" on top of the "target"-commits.
With --no-ff a (single) new commit is created and "placed above" the last "target"-commit.
PS: A good git-resource to read is the GitBook. (in different languages available)