This question elucidates that git commits form a DAG, not necessarily a tree. A DAG that is not a tree results from a merge commit, which will have multiple parents.
Is it fair to say that when Git is allowed to fast-forward, the resulting structure will be a DAG that is equal to its own transitive reduction?
For example:
master   develop
  |         |
  v         v
  A <- B <- C
If you had master checked out and ran git merge develop, git would recognize that there's already a path from A to C and would not create a new one (aka a merge commit)—unless you force it to with --no-ff.
