https://git-scm.com/book/en/v2/Git-Internals-Git-Objects
Pushing from a shallow clone to a remote is more complex, but is supported in modern git versions.
https://stackoverflow.com/a/6900428