git-push(1) - Update remote refs along with associated objects
<repository>
    The "remote" repository that is destination of a push operation. This parameter can be either a URL
    (see the section GIT URLS below) or the name of a remote (see the section REMOTES below).

<refspec>...
    The format of a <refspec> parameter is an optional plus +, followed by the source ref <src>, followed
    by a colon :, followed by the destination ref <dst>. It is used to specify with what <src> object the
    <dst> ref in the remote repository is to be updated.

    The <src> is often the name of the branch you would want to push, but it can be any arbitrary "SHA-1
    expression", such as master~4 or HEAD (see gitrevisions(7)).

    The <dst> tells which ref on the remote side is updated with this push. Arbitrary expressions cannot
    be used here, an actual ref must be named. If :<dst> is omitted, the same ref as <src> will be
    updated.

    The object referenced by <src> is used to update the <dst> reference on the remote side, but by
    default this is only allowed if the update can fast-forward <dst>. By having the optional leading +,
    you can tell git to update the <dst> ref even when the update is not a fast-forward. This does not
    attempt to merge <src> into <dst>. See EXAMPLES below for details.

    tag <tag> means the same as refs/tags/<tag>:refs/tags/<tag>.

    Pushing an empty <src> allows you to delete the <dst> ref from the remote repository.

    The special refspec : (or +: to allow non-fast-forward updates) directs git to push "matching"
    branches: for every branch that exists on the local side, the remote side is updated if a branch of
    the same name already exists on the remote side. This is the default operation mode if no explicit
    refspec is found (that is neither on the command line nor in any Push line of the corresponding
    remotes file---see below).
--all
    Instead of naming each ref to push, specifies that all refs under refs/heads/ be pushed.
--mirror
    Instead of naming each ref to push, specifies that all refs under refs/ (which includes but is not
    limited to refs/heads/, refs/remotes/, and refs/tags/) be mirrored to the remote repository. Newly
    created local refs will be pushed to the remote end, locally updated refs will be force updated on
    the remote end, and deleted refs will be removed from the remote end. This is the default if the
    configuration option remote.<remote>.mirror is set.
-n, --dry-run
    Do everything except actually send the updates.
--porcelain
    Produce machine-readable output. The output status line for each ref will be tab-separated and sent
    to stdout instead of stderr. The full symbolic names of the refs will be given.
--delete
    All listed refs are deleted from the remote repository. This is the same as prefixing all refs with a
    colon.
--tags
    All refs under refs/tags are pushed, in addition to refspecs explicitly listed on the command line.
--receive-pack=<git-receive-pack>, --exec=<git-receive-pack>
    Path to the git-receive-pack program on the remote end. Sometimes useful when pushing to a remote
    repository over ssh, and you do not have the program in a directory on the default $PATH.
-f, --force
    Usually, the command refuses to update a remote ref that is not an ancestor of the local ref used to
    overwrite it. This flag disables the check. This can cause the remote repository to lose commits; use
    it with care.
--repo=<repository>
    This option is only relevant if no <repository> argument is passed in the invocation. In this case,
    git push derives the remote name from the current branch: If it tracks a remote branch, then that
    remote repository is pushed to. Otherwise, the name "origin" is used. For this latter case, this
    option can be used to override the name "origin". In other words, the difference between these two
    commands

        git push public         #1
        git push --repo=public  #2

    is that #1 always pushes to "public" whereas #2 pushes to "public" only if the current branch does
    not track a remote branch. This is useful if you write an alias or script around git push.
-u, --set-upstream
    For every branch that is up to date or successfully pushed, add upstream (tracking) reference, used
    by argument-less git-pull(1) and other commands. For more information, see branch.<name>.merge in
    git-config(1).
--thin, --no-thin
    These options are passed to git-send-pack(1). A thin transfer significantly reduces the amount of
    sent data when the sender and receiver share many of the same objects in common. The default is
    --thin.
-q, --quiet
    Suppress all output, including the listing of updated refs, unless an error occurs. Progress is not
    reported to the standard error stream.
-v, --verbose
    Run verbosely.
--progress
    Progress status is reported on the standard error stream by default when it is attached to a
    terminal, unless -q is specified. This flag forces progress status even if the standard error stream
    is not directed to a terminal.
--recurse-submodules=check
    Check whether all submodule commits used by the revisions to be pushed are available on a remote
    tracking branch. Otherwise the push will be aborted and the command will exit with non-zero status.