It's all about what is recorded, git records less information.
Git has no versioned file object, it has one graph for the whole repository, there are no per file graphs. Which means there are no create/delete/rename events, git guesses at that information.
BK has a graph per file in addition to the repository graph. The pathname is an attribute of the file, just like the contents.
The per file graph means the GCA you use when you merge is the correct one for this file, not the one for the repository. The two might be miles apart, so we make merging easier.
One more: it's easy to write (and we did) a bk fast-export and have it work deterministically so that incremental exports work correctly even when done in parallel in trees not at the same place.
We wrote a bk fast-import but we can't get it to work correctly incrementally, git doesn't record enough information.
At this point, I really wish Linus had just copied our tech, the world would have improved. Git is a step, a big step, backwards and we are stuck with it.