git push vs git push origin <branchname>

Learn git push vs git push origin with practical examples, diagrams, and best practices. Covers git development techniques with visual explanations.

Understanding 'git push' vs. 'git push origin '

Understanding 'git push' vs. 'git push origin '

Explore the nuances of Git push commands, differentiating between the default git push and explicit git push origin <branchname>, and learn how to configure your Git workflow effectively.

When working with Git, pushing your local changes to a remote repository is a fundamental operation. However, the command git push often appears in various forms, leading to confusion about their exact behavior. This article clarifies the distinction between a simple git push and the more explicit git push origin <branchname>, helping you understand how Git determines where and what to push, and how to configure your repository for a smoother workflow.

The Default Behavior of 'git push'

When you execute git push without specifying a remote or a branch, Git attempts to infer the target based on your current branch's configuration. This behavior is largely governed by the push.default configuration and the upstream tracking branch. If your current branch is configured to track a remote branch (e.g., origin/main), then git push will push your current branch's changes to its configured upstream branch on the remote. If no upstream is set, or if push.default is configured differently, Git might behave unexpectedly, sometimes pushing all matching branches or failing with an error.

git branch --set-upstream-to=origin/main main

Sets the upstream tracking branch for your local 'main' branch.

Explicit Pushing with 'git push origin '

The command git push origin <branchname> is explicit. It tells Git exactly what to do: push the local branch specified by <branchname> to the origin remote. This command does not rely on upstream tracking configuration or push.default. It's particularly useful when you want to push a local branch to a different branch name on the remote, or when you're pushing a new branch for the first time. For example, git push origin feature/new-feature will create or update the feature/new-feature branch on the origin remote with the commits from your local feature/new-feature branch.

git checkout -b new-feature
# Make some commits
git push origin new-feature

Pushing a new local branch named 'new-feature' to 'origin'.

A flowchart showing the decision process of 'git push'. Start with 'git push' command. Decision 1: 'Is current branch tracking an upstream branch?'. If Yes, then 'Push current branch to its upstream branch'. If No, Decision 2: 'Is push.default configured?'. If Yes, 'Follow push.default configuration'. If No, 'Error: No upstream/push.default'. The 'git push origin ' path goes directly to 'Push specified local branch to specified remote branch'.

Decision flow for 'git push' commands.

Understanding 'push.default' Configuration

The push.default configuration option in Git controls the behavior of git push when no refspec is specified. Different values offer different behaviors:

  • nothing: Disallows git push without a refspec.
  • current: Pushes the current branch to a branch of the same name on the remote.
  • upstream (default in Git 2.0+): Pushes the current branch to its upstream branch.
  • simple (recommended): Similar to upstream, but refuses to push if the upstream branch has a different name than the local one. This prevents accidental pushes to similarly named but conceptually different branches.
  • matching: Pushes all branches that exist on both the local and remote repositories.

For most workflows, simple or upstream are preferred as they prevent accidental pushes of unrelated branches.

git config --global push.default simple

Sets the global 'push.default' to 'simple' for safer pushing.

1. Step 1

Check your current push.default configuration using git config push.default.

2. Step 2

If you desire a safer default, set it globally using git config --global push.default simple.

3. Step 3

When pushing a new branch for the first time, use git push -u origin <branchname> to push the branch and set its upstream tracking.

4. Step 4

For subsequent pushes on a tracking branch, a simple git push will suffice.

5. Step 5

To explicitly push a specific local branch to a specific remote branch, always use git push <remote> <local_branch>:<remote_branch>.