ChatGPT解决这个技术问题 Extra ChatGPT

How to change the remote a branch is tracking?

git

The central repository had to be set up on a new server, so I created a new remote on my local repo, and pushed to that.

But now when I do git pull, it claims I am up to date. It's wrong—it's telling me about the old remote branch, not the new one, which I know for a fact has new commits to fetch.

How do I change my local branch to track a different remote?

I can see this in the git config file but I don't want to mess things up.

[branch "master"]
    remote = oldserver
    merge = refs/heads/master
I tweaked your title - you're actually trying to change the remote you're tracking, but still track the same branch name in it.
It is difficult to consider this a duplicate of How do you make an existing Git branch track a remote branch?. That question doesn't specify that the branch is already tracking a remote branch. This one does.
seems to me like editing the config file is the easiest and safest way to go about this

R
Ronan Boiteau

Using git v1.8.0 or later:

git branch branch_name --set-upstream-to your_new_remote/branch_name

Or you can use the -u switch

git branch branch_name -u your_new_remote/branch_name

Using git v1.7.12 or earlier

git branch --set-upstream branch_name your_new_remote/branch_name

Ah, my bad. I'd still do it via config, because you can be sure to not accidentally change the branch name, but all good. +1.
From the 1.8.0 release notes: "It was tempting to say "git branch --set-upstream origin/master", but that tells Git to arrange the local branch "origin/master" to integrate with the currently checked out branch, which is highly unlikely what the user meant. The option is deprecated; use the new "--set-upstream-to" (with a short-and-sweet "-u") option instead."
When I use git branch --set-upstream mybranch new-remote/mybranch, I get a new local branch called new-remote/mybranch set up to track mybranch.
If the remote tracking branch does not yet exists but an existing remote tracking branch is currently tracked, it can not be changed to the in-existent new remote tracking branch. You need to unset the current remote tracking branch first: git branch --unset-upstream - then it works as given in this answer (or with the next git push -u / --set-upstream).
Thanks! This works well! Btw, if anyone gets this error: error: the requested upstream branch 'origin/master' does not exist then simply run git fetch to retrieve info about the remote. I renamed origin to something else and added a new origin, but I hadn't fetched info about it.
R
Raoul

For me the fix was:

git remote set-url origin https://some_url/some_repo

Then:

git push

This is the way Github says to do it. help.github.com/articles/changing-a-remote-s-url
This actually changes where the remote is, it doesn't change which remote you are tracking (technically) -- you are still tracking "origin", it just updates the definition of origin. For some use cases this could be a bad thing. Suppose you fork jQuery and make a new remote. "origin" is your fork, "upstream" is jQuery. Then suppose you need to temporarily track the original repo instead of your fork. If you used set-url and forgot to set it back, then future git push commands would fail
N
Naman

With an up to date git (2.5.5) the command is the following :

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

This will update the remote tracked branch for your current local branch


Hitting git branch --set-upstream-to=origin/develop raised the error: error: the requested upstream branch 'origin/develop' does not exist. Previously, I renamed a remote branch to delelop.
@belgoros git fetch --all maybe ?
@belgoros, I ran into the same problem. Sovled it by using git push --set-upstream origin instead. Only after that, I realised @hakre's comment on the accepted answer was explaining it more clearly already.
w
wranvaud

Another option to have a lot of control over what's happening is to edit your configurations by hand:

git config --edit

or the shorthand

git config -e

Then edit the file at will, save and your modifications will be applied.


This saved the day for me. Thanks!
My issue was that there were two origins. (origin and origin-algo). But the local master was tracking "origin-algo". But I wanted it to track "origin". The only way I could change that was by editing the git config.
C
Cascabel

If you're sane about it, editing the config file's safe enough. If you want to be a little more paranoid, you can use the porcelain command to modify it:

git config branch.master.remote newserver

Of course, if you look at the config before and after, you'll see that it did exactly what you were going to do.

But in your individual case, what I'd do is:

git remote rename origin old-origin
git remote rename new-origin origin

That is, if the new server is going to be the canonical remote, why not call it origin as if you'd originally cloned from it?


I had actually done that before encoutering this problem -- git was clever and carried the remote rename through to the config file, so in your example, my config file said 'old-origin'.
Personally, I think this way makes more sense conceptually than the accepted way, but I guess they are functionally equivalent, correct?
@Jefromi: A remote rename would not do what is being asked for as it changes the remote's name both in [remote] configs and in [branch] configs. So what one needs to do in this case is to edit the config file and do what you are saying (renaming of remotes) just at the [remote] config lines.
J
John Cummings

This is the easiest command:

git push --set-upstream <new-origin> <branch-to-track>

For example, given the command git remote -v produces something like:

origin  ssh://git@bitbucket.some.corp/~myself/projectr.git (fetch)
origin  ssh://git@bitbucket.some.corp/~myself/projectr.git (push)
team    ssh://git@bitbucket.some.corp/vbs/projectr.git (fetch)
team    ssh://git@bitbucket.some.corp/vbs/projectr.git (push)

To change to tracking the team instead:

git push --set-upstream team master

The branch to track is optional when there is nothing ambiguous. I used your suggestion when moving away from Github ;) Thank you.
u
uma
git fetch origin
git checkout --track -b local_branch_name origin/branch_name

or

git fetch
git checkout -b local_branch_name origin/branch_name

For my case I needed git fetch. I had created a new branch in bitbucket and wanted to switch to it. git doesn't know about remote changes so I had to do git fetch before git checkout feature/new-feature-branch. Hope this helps someone else.
R
RDL

You could either delete your current branch and do:

git branch --track local_branch remote_branch

Or change change remote server to the current one in the config


didn't work for me, only working command was the one from @uma : git checkout --track -b local_branch_name origin/branch_name
A
Arshan Khanifar

Based on what I understand from the latest git documentation, the synopsis is:

git branch -u upstream-branch local-branch
git branch --set-upstream-to=upstream-branch local-branch

This usage seems to be a bit different than urschrei's answer, as in his the synopsis is:

git branch local-branch -u upstream-branch 
git branch local-branch --set-upstream-to=upstream-branch 

I'm guessing they changed the documentation again?


u
user8128167

I've found @critikaster's post helpful, except that I had to perform these commands with GIT 2.21:

$ git remote set-url origin https://some_url/some_repo
$ git push --set-upstream origin master

m
mtwom

Based on the git documentation the best way is:

be sure the actual origin path:

git remote -v

Then make the change with:

git remote set-url origin

where url-repository is the same URL that we get from the clone option.


The question is about changing the pointer to a remote tracking branch, not a remote's URL. Also, there already are 2 remotes with different URLs, so this suggestion only misconfigure one remote. Further, when mentioning documentation, be sure to link to the page in question and to quote the relevant parts. Lastly, there seem to be many valid answers to this question already (with one being very similar to yours in fact), so unless you found something novel, I'd suggest just improving the existing answers.
M
Mohideen bin Mohammed

In latest git version like 2.7.4,

git checkout branch_name #branch name which you want to change tracking branch

git branch --set-upstream-to=upstream/tracking_branch_name #upstream - remote name


A
ArthNRick

the easiest way is to simply push to the new branch:

git push -u origin branch/name


Not sure why this answer isn't getting more love - Its literally the quickest way to update which remote is being tracked. I came looking for a better answer than this , i.e. a command line option that would change without pushing, but this seems to be the best fit ... git config -e is a second option if you're not ready to push ...
h
halfer

After trying the above and searching, searching, etc. I realized none of my changes were on the server that were on my local branch and Visual Studio in Team Explorer did not indicate this branch tracked a remote branch. The remote branch was there, so it should have worked. I ended up deleting the remote branch on github and 're' Push my local branch that had my changes that were not being tracked for an unknown reason.

By deleting the remote branch and 're' Push my local branch that was not being tracked, the local branch was re-created on git hub. I tried to this at the command prompt (using Windows) I could not get my local branch to track the remote branch until I did this. Everything is back to normal.


Hi Keenan. Please refrain from adding signatures to your material here - it is thought that the profile card performs this task sufficiently well. Thanks!
Y
Yunus

I tried lots of solution but this one worked for me from Bitbucket to Azure Devops Migration:

Create Repository git clone Source URL git config --global --unset credential.helper git config credential.helper store git remote rm origin git remote add origin URL to NEW repo git push origin --all In case error use git push -f origin --all In case error in access or identity go to branch-->select branch->3 dots-->branch security --> allow force push git push --tags