When doing a 'git push', what does '--set-upstream' do?
Categories:
Understanding git push --set-upstream
: Linking Local and Remote Branches

Explore the purpose and functionality of git push --set-upstream
(or -u
) for establishing a tracking relationship between your local and remote Git branches, simplifying future pushes and pulls.
When working with Git, you frequently interact with remote repositories to share your changes and fetch updates from others. The git push
command is central to this process. However, you might have encountered git push --set-upstream origin <branch-name>
or its shorthand git push -u origin <branch-name>
and wondered what exactly it does. This article will demystify the --set-upstream
option, explaining its role in establishing a crucial tracking relationship between your local and remote branches, and how it streamlines your future Git workflows.
The Concept of Upstream Branches
In Git, an 'upstream' branch is a remote branch that your local branch is configured to track. This tracking relationship is incredibly useful because it tells Git which remote branch your local branch corresponds to. Without an explicit upstream, Git doesn't automatically know where to push your changes or from where to pull updates for a newly created local branch.
graph TD subgraph Local Repository A[Local Branch: feature/A] end subgraph Remote Repository (origin) B[Remote Branch: feature/A] end A -- "Tracks" --> B
A local branch tracking its corresponding remote upstream branch.
How --set-upstream
Works
The --set-upstream
(or -u
) option is used during your first push of a new local branch to a remote repository. Its primary function is to configure your local branch to track a specific remote branch. Once this tracking relationship is established, you no longer need to specify the remote and branch name for subsequent git push
or git pull
commands for that branch.
# Create a new local branch
git checkout -b new-feature
# Make some changes and commit them
git add .
git commit -m "Initial commit for new feature"
# Push the new branch to 'origin' and set 'origin/new-feature' as its upstream
git push --set-upstream origin new-feature
Using git push --set-upstream
for the first push of a new branch.
git branch -vv
. This command shows the remote branch your local branch is tracking, along with the last commit hash.Benefits of Setting an Upstream Branch
Setting an upstream branch offers several significant advantages for your Git workflow:
- Simplified Pushes and Pulls: After the initial
--set-upstream
push, you can simply usegit push
andgit pull
without specifying the remote or branch name. Git automatically knows where to push your changes and from where to fetch updates. - Tracking Information: Git provides useful information about the divergence between your local and remote branches (e.g., 'your branch is ahead of 'origin/main' by 2 commits'). This helps you stay aware of your branch's status relative to the remote.
- Automatic Merge/Rebase: When you
git pull
on a tracking branch, Git automatically attempts to merge or rebase the remote changes into your local branch, depending on your configuration. - Clarity: It clearly defines the relationship between your local work and the shared remote repository, reducing ambiguity.
sequenceDiagram participant Local as Local Repo participant Remote as Remote Repo Local->>Local: git checkout -b feature-branch Local->>Local: (Work & Commit) Local->>Remote: git push -u origin feature-branch Remote-->>Local: Remote branch 'feature-branch' created Local->>Local: Local 'feature-branch' now tracks 'origin/feature-branch' Note over Local,Remote: Upstream relationship established Local->>Local: (More Work & Commit) Local->>Remote: git push Remote-->>Local: Changes pushed to 'origin/feature-branch' Remote->>Local: git pull Local-->>Remote: Fetches and merges/rebases from 'origin/feature-branch'
Sequence of operations demonstrating the effect of git push -u
.
What Happens Without --set-upstream
?
If you push a new local branch without --set-upstream
, Git will typically give you a warning or an error message, suggesting you use the -u
option. For example:
fatal: The current branch new-feature has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin new-feature
If you ignore this and just use git push origin new-feature
for the first push, the branch will be created on the remote, but your local branch will not be configured to track it. This means subsequent pushes and pulls would still require you to specify origin new-feature
every time, which is less convenient.
# After initial push without -u
git push origin new-feature
# Later, trying to push without specifying remote/branch will fail
git push
# Output: fatal: The current branch new-feature has no upstream branch.
# To fix it later, you can explicitly set the upstream
git branch --set-upstream-to=origin/new-feature new-feature
# Now, 'git push' will work
git push
Demonstrating the need for --set-upstream
and how to set it later.
git push -u
is common, you can also set the upstream for an existing local branch using git branch --set-upstream-to=origin/<remote-branch> <local-branch>
.