如何更改远程分支跟踪的目标?

987

由于需要在新服务器上建立central仓库,因此我在本地仓库创建了一个新的远程分支,并将其推送到了该仓库。

但是,现在当我执行git pull时,它声称我已经更新到最新版本。这是错误的——它告诉我关于旧的远程分支,而不是新的分支,而我知道新分支有新的提交可以获取。

如何将我的本地分支更改为跟踪另一个远程分支?

我可以在git配置文件中看到这一点,但我不想搞砸事情。

[branch "master"]
    remote = oldserver
    merge = refs/heads/master

2
我调整了您的标题 - 实际上,您正在尝试更改您正在跟踪的远程,但仍要在其中跟踪相同的分支名称。 - Cascabel
1
可能是重复的问题:如何使现有的Git分支跟踪远程分支? - user289086
10
很难认为这与 如何使现有的Git分支跟踪远程分支? 是重复的。那个问题没有说明该分支已经在跟踪一个远程分支,而这个问题是这样做的。 - user456814
1
在我看来,编辑配置文件似乎是处理这个问题最简单且最安全的方法。 - Steven Lu
15个回答

1577

使用 git v1.8.0 或更高版本:

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

或者你可以使用-u开关

git branch branch_name -u your_new_remote/branch_name

使用 git v1.7.12 或更早版本

git branch --set-upstream branch_name your_new_remote/branch_name

7
啊,我的错。我仍会通过配置来完成它,因为你可以确保不会意外更改分支名称,但一切都好了。+1。 - Cascabel
1.8.0版本说明中可以看到:“诱人的做法是使用“git branch --set-upstream origin/master”,但这会告诉Git将本地分支“origin/master”与当前检出的分支集成,这很可能不是用户想要的。该选项已被弃用;请改用新的“--set-upstream-to”(简短而甜美的“-u”)选项。” - Jared Beck
122
如果远程跟踪分支尚不存在但当前已存在一个被跟踪的远程跟踪分支,则无法将其更改为不存在的新远程跟踪分支。您需要先取消当前的远程跟踪分支:git branch --unset-upstream - 然后按照此答案中给出的方式进行操作(或使用下一个 git push -u / --set-upstream)。 - hakre
2
谢谢!这个很好用!顺便说一下,如果有人遇到这个错误:error: the requested upstream branch 'origin/master' does not exist,那么只需运行git fetch来检索有关远程的信息。我将origin重命名为其他名称并添加了一个新的origin,但我没有获取有关它的信息。 - racl101
1
git branch branch_name --set-upstream-to origin/branch_name 我需要什么,谢谢。 - Leo
显示剩余5条评论

133

我的原始回答是:

对我来说,解决方法是:

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

然后:

git push

更好的答案是:

回头看这个答案,正如@stevendesu在评论中正确指出的那样,更好的方法是:

删除旧的origin引用:

git remote remove origin

添加新的origin参考:
git remote add origin https://some_url/some_repo

请验证是否成功:

git remote -v

And/or:

git remote show origin

请注意,您可以添加多个起点。例如,您可以保留origin远程不变,并添加另一个名为secondary_repo的起点:

git remote add secondary_repo https://some_url/some_repo

现在您将看到多个存储库,使用git remote -v命令,类似于:

origin  https://some_url/some_origin_repo (fetch)
origin  https://some_url/some_origin_repo (push)
secondary_repo  https://some_url/some_repo (fetch)
secondary_repo  https://some_url/some_repo (push)

然而,确保你总是明确指定你正在拉取/推送的仓库名称,像这样:

git push origin

或者:

git push secondary_repo

此外,更多详细信息请参阅文档

3
这是Github的建议做法。https://help.github.com/articles/changing-a-remote-s-url/ - fsharp
28
这实际上改变了远程仓库的位置,而不是更改你正在跟踪的远程仓库(在技术上)-- 你仍然在跟踪"origin",只是更新了"origin"的定义。对于某些用例来说,这可能是不好的事情。假设你分叉了jQuery并创建了一个新的远程仓库,"origin"是你的分叉版本,"upstream"是jQuery。然后,假设你需要暂时跟踪原始存储库而不是你的分叉版本。如果你使用了set-url并忘记了将其设置回去,则未来的git push命令将失败。 - stevendesu

105

使用最新的git(2.5.5),命令如下:

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

这将更新您当前本地分支的远程跟踪分支。


3
运行 git branch --set-upstream-to=origin/develop 命令时出现错误:"error: the requested upstream branch 'origin/develop' does not exist"。之前,我将一个远程分支重命名为delelop。 - belgoros
3
也许可以尝试运行 git fetch --all 命令? - Gabriel Devillers
1
@belgoros,我遇到了相同的问题。我使用 git push --set-upstream origin 解决了它。只有在那之后,我才意识到 @hakre 在被接受的答案中的评论已经更清楚地解释了它。 - rijam

32

另一种控制正在发生的事情的方法是手动编辑您的配置:

git config --edit

或者简写方式

git config -e

随后,随意编辑该文件,保存即可应用修改。


1
我的问题是有两个源(origin和origin-algo)。但本地主分支正在跟踪“origin-algo”。但我想让它跟踪“origin”。我唯一能改变这种情况的方法是通过编辑git配置文件。 - Aswin Prasad

21

如果你对此很理智,编辑配置文件还是很安全的。如果你想要更加谨慎一些,可以使用瓷器命令进行修改:

git config branch.master.remote newserver

当然,如果你在处理前后查看配置文件,你会发现它确实执行了你将要做的操作。

但对于你个人的情况,我会这样做:

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

也就是说,如果新服务器将成为规范的远程服务器,为什么不将其称为“origin”,就像最初从它克隆一样呢?


3
在遇到这个问题之前,我实际上已经完成了那个操作——Git很聪明,将远程重命名操作传递到了配置文件中,在你的例子中,我的配置文件显示为“old-origin”。 - joachim
就个人而言,我认为这种方式在概念上比被接受的方式更有意义,但我猜它们在功能上是等效的,对吗? - Evan Donovan
1
@Jefromi:远程重命名不能完成所要求的操作,因为它会同时更改[remote]配置和[branch]配置中远程的名称。因此,在这种情况下,需要编辑配置文件,并在[remote]配置行中执行您所说的操作(重命名远程)。 - Sumeet Pareek

14

这是最简单的命令:

git push --set-upstream <new-origin> <branch-to-track>
例如,给出命令git remote -v会产生以下类似的内容:
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)

要切换到跟踪团队:

git push --set-upstream team master

当没有任何歧义时,跟踪的分支是可选的。我在远离Github时使用了您的建议;) 谢谢。 - gouessej

7
git fetch origin
git checkout --track -b local_branch_name origin/branch_name

或者

git fetch
git checkout -b local_branch_name origin/branch_name

对于我的情况,我需要使用git fetch。我在Bitbucket上创建了一个新分支,并想要切换到它。Git不知道远程更改,所以我必须在git checkout feature/new-feature-branch之前执行git fetch。希望这能帮助其他人。 - TelamonAegisthus

4
您可以删除当前分支并执行以下操作:
git branch --track local_branch remote_branch

或者在配置文件中将远程服务器更改为当前服务器


对我来说不起作用,唯一有效的命令是 @uma 提供的:git checkout --track -b local_branch_name origin/branch_name - Saad Benbouzid

3

根据我从最新的git 文档中所了解到的,简要概述如下:

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

这个用法似乎与urschrei的回答有些不同,因为他的简介是:
git branch local-branch -u upstream-branch 
git branch local-branch --set-upstream-to=upstream-branch 

我猜他们又改了文档?

3

最简单的方法就是直接推送到新分支:

git push -u origin branch/name


1
不确定为什么这个答案没有得到更多的赞 - 这实际上是更新正在被跟踪的远程的最快速的方法。我来寻找比这更好的答案,即一个可以在不推送的情况下更改的命令行选项,但这似乎是最合适的...如果你还没有准备好推送,git config -e是第二个选择... - David Farrell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接