A <ref> specification can be either a single pattern, or a pair
of such patterns separated by a colon ":" (this means that a ref name
cannot have a colon in it). A single pattern <name> is just a
shorthand for <name>:<name>.
Each pattern pair <src>:<dst> consists of the source side (before
the colon) and the destination side (after the colon). The ref to be
pushed is determined by finding a match that matches the source side,
and where it is pushed is determined by using the destination side.
-
It is an error if <src> does not match exactly one of the
local refs.
-
If <dst> does not match any remote ref, either
-
it has to start with "refs/"; <dst> is used as the
destination literally in this case.
-
<src> == <dst> and the ref that matched the <src> must not
exist in the set of remote refs; the ref matched <src>
locally is used as the name of the destination.
Without ‘--force`, the <src> ref is stored at the remote only if
<dst> does not exist, or <dst> is a proper subset (i.e. an
ancestor) of <src>. This check, known as "fast-forward check",
is performed to avoid accidentally overwriting the
remote ref and losing other peoples’ commits from there.
With --force, the fast-forward check is disabled for all refs.
Optionally, a <ref> parameter can be prefixed with a plus + sign
to disable the fast-forward check only on that ref.