I'm sorry, I was super vague there.  To rewind a bit: libgit2 has some types of structures that are publicly visible (defined in the public header files) - some examples of that are the `git_merge_opts` and `git_merge_tree_opts`.  These are used when we need consumers to be able to set a lot of options and pass it as a single argument to a function.  On the other hand, we have a bunch of "opaque objects" - structures that are defined internally, but in the public header files you will only see a forward declaration:

    typedef struct git_merge_head git_merge_head;

Consumers can't create one of these because the compiler doesn't know anything about it -- but you *can* talk about a pointer to that structure:  `git_merge_head *` -- since the compiler knows how big a pointer will be.  Consumers can't deference it, but they can pass it to libgit2.  This allows libgit2 to provide an object to consumers that the library knows about, but consumers don't, allowing us to hide some implementation details and be able to change the details of that structure without breaking compatibility for our consumers.

Since `MergeHead` is an opaque object in libgit2, we don't need to build a serializable structure.  Instead we can call `git_merge_head_from_oid`, `git_merge_head_from_ref` or `git_merge_head_from_fetchhead`, get the opaque `GitMergeHeadHandle` back and pass that to `git_merge`.