The git push command is used to upload local repository content to a remote repository. Pushing is how you transfer commits from your local repository to a remote repo. It's the counterpart to git fetch, but whereas fetching imports commits to local branches, pushing exports commits to remote branches. Remote branches are configured using the git remote command. Pushing has the potential to overwrite changes, caution should be taken when pushing. These issues are discussed below.

Git push usage

git push <remote> <branch>

Mit diesem Befehl pushst du den angegebenen Branch an das in "<remote>" angegebene Remote-Repository, zusammen mit allen notwendigen Commits und internen Objekten. Dadurch wird im Ziel-Repository ein lokaler Branch erstellt. Damit keine Commits überschrieben werden, blockiert Git Push-Vorgänge, durch die ein Nicht-Fast-Forward-Merge im Ziel-Repository angestoßen werden würde.

git push <remote> --force

Dieser Befehl ist identisch mit dem oben beschriebenen, erzwingt den Push jedoch auch dann, wenn durch ihn ein Nicht-Fast-Forward-Merge angestoßen werden würde. Verwende das Flag --force nur, wenn du dir absolut sicher bist.

git push <remote> --all

Verschiebt alle lokalen Branches zum angegebenen Remote-Branch

git push <remote> --tags

Tags werden nicht automatisch eingeschlossen, wenn du einen Branch pushst oder die Option --all verwendest. Das Flag --tags sendet alle deine lokalen Tags an das Remote-Repository.

Git push discussion

git push is most commonly used to publish an upload local changes to a central repository. After a local repository has been modified a push is executed to share the modifications with remote team members.

Using git push to publish changes

Das Schaubild oben verdeutlicht, was passiert, wenn dein lokaler master aktueller ist als der master des zentralen Repositorys und du Änderungen per git push origin master veröffentlichst. Wie du siehst: git push arbeitet im Grunde genommen genauso wie git merge master im Remote-Repository.

Git push and syncing

git push is one component of many used in the overall Git "syncing" process. The syncing commands operate on remote branches which are configured using the git remote command. git push can be considered and 'upload' command whereas, git fetch and git pull can be thought of as 'download' commands. Once changesets have been moved via a download or upload a git merge may be performed at the destination to integrate the changes.

Pushing to bare repositories

A frequently used, modern Git practice is to have a remotely hosted --bare repository act as a central origin repository. This origin repository is often hosted off-site with a trusted 3rd party like Bitbucket. Since pushing messes with the remote branch structure, It is safest and most common to push to repositories that have been created with the --bare flag. Bare repos don’t have a working directory so a push will not alter any in progress working directory content. For more information on bare repository creation, read about git init.

Verschieben erzwingen

Git lehnt Push Requests ab, die einen Nicht-Fast-Forward-Merge anstoßen würden. Dadurch wird verhindert, dass der Verlauf des zentralen Repositorys überschrieben wird. Wenn der Verlauf des Remote-Repositorys also von deinem eigenen Verlauf abweicht, musst du den Remote-Branch pullen und mit deinem lokalen Branch zusammenführen. Anschließend kannst du den Push erneut versuchen. Dieser Prozess ähnelt der SVN-basierten Synchronisierung mit einem zentralen Repository über svn update, vor dem Commit eines Changesets.

Das Flag --force setzt dieses Verhalten außer Kraft und bewirkt, dass der Branch des Remote-Repositorys an deinen lokalen Branch angeglichen wird. Dabei werden sämtliche Upstream-Änderungen gelöscht, die seit dem letzten Pull vorgenommen wurden. Du solltest einen Push nur dann auf diese Weise erzwingen, wenn Commits, die du gerade veröffentlicht hast, fehlerhaft waren und du sie mit git commit --amend oder einem interaktiven Rebase korrigiert hast. Selbst dann musst du jedoch vor der Verwendung der Option --force unbedingt sicherstellen, dass keine deiner Teamkollegen die betreffenden Commits bereits gepullt haben.

Examples

Default git push

The following example describes one of the standard methods for publishing local contributions to the central repository. First, it makes sure your local master is up-to-date by fetching the central repository’s copy and rebasing your changes on top of them. The interactive rebase is also a good opportunity to clean up your commits before sharing them. Then, the git push command sends all of the commits on your local master to the central repository.

git checkout master
git fetch origin master
git rebase -i origin/master
# Squash commits, fix up commit messages etc.
git push origin master

Since we already made sure the local master was up-to-date, this should result in a fast-forward merge, and git push should not complain about any of the non-fast-forward issues discussed above.

Amended force push

The git commit command accepts a --amend option which will update the previous commit. A commit is often amended to update the commit message or add new changes. Once a commit is amended a git push will fail because Git will see the amended commit and the remote commit as diverged content. The --force option must be used to push an amended commit.

# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin master

The above example assumes it is being executed on an existing repository with a commit history. git commit --amend is used to update the previous commit. The amended commit is then force pushed using the --force option.

Deleting a remote branch or tag

Sometimes branches need to be cleaned up for book keeping or organizational purposes. The fully delete a branch, it must be deleted locally and also remotely.

git branch -D branch_name
git push origin :branch_name

The above will delete the remote branch named branch_name passing a branch name prefixed with a colon to git push will delete the remote branch.