There are three ways to specify which refs to update on the
remote end.
With the --all flag, all refs that exist locally are transferred to
the remote side. You cannot specify any <ref> if you use
this flag.
Without --all and without any <ref>, the heads that exist
both on the local side and on the remote side are updated.
When one or more <ref> are specified explicitly (whether on the
command line or via --stdin), it 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 shorthand for <name>:<name>.
Each pattern pair 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. The rules used to match a ref are the same
rules used by git rev-parse to resolve a symbolic ref
name. See git-rev-parse(1).
-
It is an error if <src> does not match exactly one of the
local refs.
-
It is an error if <dst> matches more than one remote ref.
-
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 the "fast-forward check",
is performed to avoid accidentally overwriting the
remote ref and losing other people’s 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.