Overview
The error “fatal: The upstream branch of your current branch does not match” occurs when you run git push with Git’s default push mode (simple) and your local branch tracks a differently named remote branch. Example: you are on local dev tracking origin/main, then git push fails because the names differ.
This guide shows quick fixes, how to diagnose, and how to choose a push strategy that avoids the problem.
Quickstart
- See which branch you track:
git rev-parse --abbrev-ref --symbolic-full-name @{u} - Fast fix (push to a same-named remote and set upstream):
git push -u origin HEAD(creates/uses origin/<current-branch>)
- Or push to the tracked upstream branch even if names differ:
git push origin HEAD:<upstream-branch-name>
- Make a permanent rule (pick one):
- Always push to same-named branch:
git config --global push.default current - Always push to the configured upstream:
git config --global push.default upstream
- Always push to same-named branch:
Minimal working example
Reproduce the error and fix it.
# Start in a clone that has origin/main
# Create a local branch dev that tracks origin/main (mismatched names)
git checkout -b dev origin/main
# Confirm the upstream (tracking) branch
git rev-parse --abbrev-ref --symbolic-full-name @{u}
# outputs: origin/main
# Make a commit
echo "test" >> demo.txt
git add demo.txt
git commit -m "demo"
# Push without arguments (default push.default=simple)
git push
# fatal: The upstream branch of your current branch does not match ...
# Fix A: Push to a same-named branch and set upstream automatically
git push -u origin HEAD # creates/uses origin/dev and sets it as upstream
# Verify new upstream
git rev-parse --abbrev-ref --symbolic-full-name @{u}
# outputs: origin/dev
Diagnosis
- Identify your current branch:
git branch --show-current
- Inspect the upstream (if any):
git rev-parse --abbrev-ref --symbolic-full-name @{u}- If this prints origin/main while you are on dev, names are mismatched.
- Check your push mode:
git config --show-origin --get push.default(defaults to simple if unset)
Fixes (choose one)
Align upstream to a same-named remote branch
- Good when you want dev to push to origin/dev.
- Commands:
- Create and set upstream in one step:
git push -u origin HEAD - Or explicitly choose the name:
git push -u origin dev - Already exists? Just point to it:
git branch --set-upstream-to=origin/dev dev
- Create and set upstream in one step:
Keep the mismatched upstream but push to it
- Good if your local branch intentionally tracks a differently named remote branch.
- Command for one-off push:
git push origin HEAD:main(replace main with the upstream branch name)
Change your default push behavior (global)
- If you prefer pushing without arguments to “just work,” pick a mode:
- Same-name branch:
git config --global push.default current - Tracked upstream branch:
git config --global push.default upstream
- Same-name branch:
- Note: Changing push.default affects all repositories for that user.
- If you prefer pushing without arguments to “just work,” pick a mode:
Rename your local branch to match the upstream
- If the remote branch name is canonical (e.g., main), rename locally:
git branch -m dev main- Then set upstream if needed:
git push -u origin main
- If the remote branch name is canonical (e.g., main), rename locally:
Choosing a push mode
Pick one that matches your workflow.
| Mode | Behavior |
|---|---|
| simple (default) | Push current branch only if its name matches its upstream; otherwise fail with this error. |
| current | Push current branch to a same-named branch on the remote, creating it if missing; ignores upstream name mismatches. |
| upstream | Push to the configured upstream branch, even if the names differ. |
| matching | Push all branches that have the same name on both local and remote; risky for multi-branch repos. |
| nothing | Do not push unless you specify a refspec; safest but verbose. |
Tip: You can also auto-setup upstreams on first push so you don’t have to add -u every time:
# Git 2.37+
git config --global push.autoSetupRemote true
Step-by-step recipe (safe default)
- Confirm the mismatch
git branch --show-currentgit rev-parse --abbrev-ref --symbolic-full-name @{u}
- Decide your intent
- Want a same-name remote branch? Go to step 3.
- Want to keep tracking a differently named upstream? Go to step 4.
- Same-name remote branch
git push -u origin HEAD- Future pushes: just
git push.
- Keep mismatched upstream
- One-off push:
git push origin HEAD:<upstream> - Make it the default:
git config --global push.default upstream
- One-off push:
- Verify
git status -sbshows the tracking branch, e.g.,## dev...origin/dev
Pitfalls
- Confusing “upstream” (tracking branch) with a remote named upstream. In Git terminology here, upstream means the tracking branch for your current branch, not necessarily a remote called upstream.
- Setting push.default=matching can push multiple branches unintentionally. Use with caution in multi-branch repos.
- Forgetting -u on the first push means your branch has no upstream. Then git push may behave differently depending on push.default and Git version.
- Renaming branches locally without updating upstream can reintroduce the error. If you rename, reset upstream:
git branch --unset-upstream && git push -u origin HEAD.
Performance notes
- This error is about configuration, not heavy computation. Fixes are instantaneous.
- Large pushes can be slow due to object packing and network I/O. To minimize:
- Commit only needed artifacts; use .gitignore and Git LFS for large binaries.
- Run
git gc --aggressivesparingly on very large repos to repack objects. - Use
git push --no-follow-tagsif automatic tag following causes extra data.
- Avoid repeated failed pushes; each attempt enumerates objects again.
FAQ
- Why did this start happening suddenly?
- Git’s default push mode is simple, which errors on mismatched names. If a branch’s upstream was changed (e.g., dev now tracking origin/main), you’ll see this on push.
- What’s the quickest, safest fix?
git push -u origin HEADcreates/uses a same-named remote and sets it as upstream, aligning names.
- How do I check my upstream at any time?
git rev-parse --abbrev-ref --symbolic-full-name @{u}orgit status -sb.
- Is changing push.default global a good idea?
- If your team convention is consistent, yes. Many teams prefer current. Otherwise, leave simple and set upstreams explicitly.