在不同的远程仓库上检出分支

56

我有一个代码仓库,除了 origin 之外还有另一个远程名为 upstream。我可以通过执行 git checkout origin/master 命令来检出本地的origin分支。但是,当我尝试执行 git checkout upstream/master 命令时,会收到以下错误信息:

error: pathspec 'upstream/master' did not match any file(s) known to git.

这个也不起作用:

$ git fetch upstream
From https://github.com/getsentry/sentry
 * branch            HEAD       -> FETCH_HEAD
$ git co -b asdf --track upstream/master
fatal: Cannot update paths and switch to branch 'asdf' at the same time.
Did you intend to checkout 'upstream/master' which can not be resolved as commit?

如何像在 origin 远程仓库一样,在 upstream 远程仓库上检出分支?我的 git 版本是 2.1.2。

4个回答

98

只需从远程获取引用(这将检索上游存储库的所有分支、提交、引用等)

git fetch upstream

之后,检出所需的分支(这将创建分支的本地副本)

git checkout -b <branchname> --track upstream/<branchname>
现在,如果你将来想要拉取这个分支中的更改,你只需要执行以下操作:
git pull upstream <branchname>

正如这里所提到的,尝试在分支名称上进行显式提取:


git fetch upstream master:branch_name

无法工作:fatal: 无法同时更新路径并切换到分支 'asdf'。您是否打算检出无法解决为提交的 'upstream/master'? - Fish Monitor
@fossilet 你能否检查一下 git fetch upstream master:branch_name 是否适用于你?请参考 https://dev59.com/1XNA5IYBdhLWcg3wfNyO#1614996 - Anshul Goyal
@fossilet 不太清楚为什么。之前试过搜索,但没弄明白。可能是git版本的bug。 - Anshul Goyal
我该如何将我跟踪上游的分支推回到原始仓库? - tnrich
我得到了 fatal: 'upstream/develop' 不是一个提交,也不能从中创建分支 'develop' - Michael Fulton

10

如果你刚添加了远程仓库,你需要执行fetch命令让Git知道有哪些分支可用:

git fetch upstream master

接下来,你可以这样做

git checkout upstream/master

没有任何问题。


1
这会将来自上游/主干的更改合并到origin/master吗?这是不想要的。 - Fish Monitor
2
抱歉,我的意思是 fetch 而不是 pull。谢谢。 - nneonneo
在获取之后?这很令人惊讶,因为我刚刚在我的 git 上尝试了一下,它可以正常工作...你能发布一下你使用的步骤吗? - nneonneo
8
是的,你可以检出 upstream/master,但你会处于“游离头”状态。如果你希望它像分支一样正常工作,你需要像@mu所写的那样将其设置为跟踪分支。 - xtofl

2
更简洁的方式(我使用git 2.28),您可以说:
git fetch upstream

然后

git checkout -b <branch_name> --guess

使用 --guess 标志,检查与 <branch_name> 相应的分支是否存在于任何远程仓库中,并跟踪相应的远程仓库(文档在此)。


-1
请按照以下步骤操作:
第一步:使用以下添加命令添加新的远程
git remote add testRemote https://repourl.git 第二步:将URL设置为远程
git remote set-url testRemote https://repourl.git 第三步:从新存储库中拉取分支
git pull
第四步:切换到新分支
git checkout branchFromNewremote 然后,您可以从当前分支创建新分支。

我不确定这会不会起作用:你真的可以添加一个名为 origin 的新远程吗?没有参数的 git pull 确实从新的远程拉取吗?在你的 git checkout 命令中,OP 在执行 git checkout upstream/master 时遇到了错误,你能解释一下如何避免这种情况吗? - joanis
你是对的,如果我们已经有了远程名称为origin,它就不起作用。抱歉,有一个打字错误刚刚被更正。由于我们正在使用“git remote set-url”设置新的远程,git pull将尝试从新的远程拉取所有分支,并帮助从testRemote切换到新分支。 - Vasanthakumar Jagannathan
感谢您修复了这个错别字。关于 git pull,我仍然不太确定:根据我的经验,它只会从默认的远程仓库拉取代码,如果你在运行时处于跟踪 origin 的分支上,那么默认的远程仓库就是 origin。我刚刚测试了您的指令,git pull 的输出是 "Already up to date."。实际上,您需要使用 git fetch testRemote,就像被接受的答案中所示。 - joanis
说实话,如果我听起来有点刻薄,那我很抱歉,但我不确定你想要为已接受的答案添加什么。我很感激你的努力,但重要的是要测试你在这里提出的解决方案,并确保旧问题的新答案在某种方式上添加了一些新颖、更简单或更好的东西,而你可以在你的答案中解释清楚。 - joanis
一旦您添加新的远程,您必须使用 set-url 切换到新的远程,这将指向您的新远程。然后,如果您想在当前远程下检出新分支,请执行 git pull 以从当前远程获取所有分支。在执行 git pull 之前,您无法在当前远程下看到新分支。我在发布之前已经测试了上述场景,对我有效 :) - Vasanthakumar Jagannathan

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