Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
-
2.55.0
2026-06-29
- 2.54.0 no changes
-
2.53.0
2026-02-02
-
2.52.0
2025-11-17
- 2.48.1 → 2.51.2 no changes
-
2.48.0
2025-01-10
- 2.45.1 → 2.47.3 no changes
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.4 no changes
-
2.44.0
2024-02-23
- 2.43.1 → 2.43.7 no changes
-
2.43.0
2023-11-20
- 2.42.2 → 2.42.4 no changes
-
2.42.1
2023-11-02
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 no changes
-
2.41.0
2023-06-01
- 2.40.1 → 2.40.4 no changes
-
2.40.0
2023-03-12
- 2.39.1 → 2.39.5 no changes
-
2.39.0
2022-12-12
- 2.38.1 → 2.38.5 no changes
-
2.38.0
2022-10-02
- 2.35.1 → 2.37.7 no changes
-
2.35.0
2022-01-24
- 2.33.1 → 2.34.8 no changes
-
2.33.0
2021-08-16
- 2.32.1 → 2.32.7 no changes
-
2.32.0
2021-06-06
- 2.30.1 → 2.31.8 no changes
-
2.30.0
2020-12-27
- 2.25.1 → 2.29.3 no changes
-
2.25.0
2020-01-13
- 2.23.1 → 2.24.4 no changes
-
2.23.0
2019-08-16
- 2.22.1 → 2.22.5 no changes
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 no changes
-
2.21.0
2019-02-24
- 2.20.1 → 2.20.5 no changes
-
2.20.0
2018-12-09
- 2.18.1 → 2.19.6 no changes
-
2.18.0
2018-06-21
- 2.17.0 → 2.17.6 no changes
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
- 2.14.6 no changes
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
-
2.10.5
2017-09-22
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
-
2.7.6
2017-07-30
-
2.6.7
2017-05-05
- 2.5.6 no changes
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
-
2.2.3
2015-09-04
- 2.1.4 no changes
-
2.0.5
2014-12-17
SYNOPSIS
git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>] [--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose] [-u | --set-upstream] [-o <string> | --push-option=<string>] [--[no-]signed|--signed=(true|false|if-asked)] [--force-with-lease[=<refname>[:<expect>]]] [--no-verify] [<repository> [<refspec>…]]
DESCRIPTION
Updates remote refs using local refs, while sending objects necessary to complete the given refs.
You can make interesting things happen to a repository every time you push into it, by setting up hooks there. See documentation for git-receive-pack[1].
When the command line does not specify where to push with the
<repository> argument, branch.*.remote configuration for the
current branch is consulted to determine where to push. If the
configuration is missing, it defaults to origin.
When the command line does not specify what to push with <refspec>...
arguments or --all, --mirror, --tags options, the command finds
the default <refspec> by consulting remote.*.push configuration,
and if it is not found, honors push.default configuration to decide
what to push (See git-config[1] for the meaning of push.default).
When neither the command-line nor the configuration specify what to
push, the default behavior is used, which corresponds to the simple
value for push.default: the current branch is pushed to the
corresponding upstream branch, but as a safety measure, the push is
aborted if the upstream branch does not have the same name as the
local one.
OPTIONS
- <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>…
-
Specify what destination ref to update with what source object. The format of a <refspec> parameter is an optional plus
+, followed by the source object <src>, followed by a colon:, followed by the destination ref <dst>.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~4orHEAD(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
gitpush[<repository>] without any <refspec> argument is set to update some ref at the destination with <src> withremote.<repository>.pushconfiguration variable,:<dst> part can be omitted—such a push will update a ref that <src> normally updates without any <refspec> on the command line. Otherwise, missing:<dst> means to update the same ref as the <src>.If <dst> doesn’t start with
refs/(e.g.refs/heads/master) we will try to infer where inrefs/*on the destination <repository> it belongs based on the type of <src> being pushed and whether <dst> is ambiguous.-
If <dst> unambiguously refers to a ref on the <repository> remote, then push to that ref.
-
If <src> resolves to a ref starting with refs/heads/ or refs/tags/, then prepend that to <dst>.
-
Other ambiguity resolutions might be added in the future, but for now any other cases will error out with an error indicating what we tried, and depending on the
advice.pushUnqualifiedRefnameconfiguration (see git-config[1]) suggest what refs/ namespace you may have wanted to push to.
The object referenced by <src> is used to update the <dst> reference on the remote side. Whether this is allowed depends on where in
refs/*the <dst> reference lives as described in detail below, in those sections "update" means any modifications except deletes, which as noted after the next few sections are treated differently.The
refs/heads/*namespace will only accept commit objects, and updates only if they can be fast-forwarded.The
refs/tags/*namespace will accept any kind of object (as commits, trees and blobs can be tagged), and any updates to them will be rejected.It’s possible to push any type of object to any namespace outside of
refs/{tags,heads}/*. In the case of tags and commits, these will be treated as if they were the commits insiderefs/heads/*for the purposes of whether the update is allowed.I.e. a fast-forward of commits and tags outside
refs/{tags,heads}/*is allowed, even in cases where what’s being fast-forwarded is not a commit, but a tag object which happens to point to a new commit which is a fast-forward of the commit the last tag (or commit) it’s replacing. Replacing a tag with an entirely different tag is also allowed, if it points to the same commit, as well as pushing a peeled tag, i.e. pushing the commit that existing tag object points to, or a new tag object which an existing commit points to.Tree and blob objects outside of
refs/{tags,heads}/*will be treated the same way as if they were insiderefs/tags/*, any update of them will be rejected.All of the rules described above about what’s not allowed as an update can be overridden by adding an the optional leading
+to a refspec (or using--forcecommand line option). The only exception to this is that no amount of forcing will make therefs/heads/*namespace accept a non-commit object. Hooks and configuration can also override or amend these rules, see e.g.receive.denyNonFastForwardsin git-config[1] andpre-receiveandupdatein githooks[5].Pushing an empty <src> allows you to delete the <dst> ref from the remote repository. Deletions are always accepted without a leading
+in the refspec (or--force), except when forbidden by configuration or hooks. Seereceive.denyDeletesin git-config[1] andpre-receiveandupdatein githooks[5].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.tag<tag> means the same asrefs/tags/<tag>:refs/tags/<tag>. -
- --all
-
Push all branches (i.e. refs under
refs/heads/); cannot be used with other <refspec>. - --prune
-
Remove remote branches that don’t have a local counterpart. For example a remote branch
tmpwill be removed if a local branch with the same name doesn’t exist any more. This also respects refspecs, e.g.gitpush--pruneremoterefs/heads/*:refs/tmp/*would make sure that remoterefs/tmp/foowill be removed ifrefs/heads/foodoesn’t exist. - --mirror
-
Instead of naming each ref to push, specifies that all refs under
refs/(which includes but is not limited torefs/heads/,refs/remotes/, andrefs/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 optionremote.<remote>.mirroris 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.
- -d
- --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/tagsare pushed, in addition to refspecs explicitly listed on the command line. - --follow-tags
-
Push all the refs that would be pushed without this option, and also push annotated tags in
refs/tagsthat are missing from the remote but are pointing at commit-ish that are reachable from the refs being pushed. This can also be specified with configuration variablepush.followTags. For more information, seepush.followTagsin git-config[1]. - --[no-]signed
- --signed=(true|false|if-asked)
-
GPG-sign the push request to update refs on the receiving side, to allow it to be checked by the hooks and/or be logged. If
falseor--no-signed, no signing will be attempted. Iftrueor--signed, the push will fail if the server does not support signed pushes. If set toif-asked, sign if and only if the server supports signed pushes. The push will also fail if the actual call togpg--signfails. See git-receive-pack[1] for the details on the receiving end. - --[no-]atomic
-
Use an atomic transaction on the remote side if available. Either all refs are updated, or on error, no refs are updated. If the server does not support atomic pushes the push will fail.
- -o <option>
- --push-option=<option>
-
Transmit the given string to the server, which passes them to the pre-receive as well as the post-receive hook. The given string must not contain a NUL or LF character. When multiple
--push-option=<option> are given, they are all sent to the other side in the order listed on the command line. When no--push-option=<option> is given from the command line, the values of configuration variablepush.pushOptionare used instead. - --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.
- --[no-]force-with-lease
- --force-with-lease=<refname>
- --force-with-lease=<refname>:<expect>
-
Usually, "git push" refuses to update a remote ref that is not an ancestor of the local ref used to overwrite it.
This option overrides this restriction if the current value of the remote ref is the expected value. "git push" fails otherwise.