如何检出远程Git分支?

8535

有人使用命令 git push origin test 推送了一个名为 test 的分支到一个共享的代码库。我可以通过命令 git branch -r 查看这个分支。那么,我如何检出远程的 test 分支呢?我尝试过:

  • git checkout test,但没有任何变化。
  • git checkout origin/test 显示 * (no branch)

57
我认为这个帖子对解决问题没有帮助。看起来没有什么方法是有效的,原问题似乎已经被大量回答淹没了。我阅读了每个词,尝试了下面提供的所有方法,但仍然不知道如何做到原帖中想做的事情。 - Tony Ennis
56
我感觉自己像是在疯狂吃药。我想从一个不仅仅是“origin”的“upstream”中检出一个分支,然而每一个推荐的答案都没有任何帮助(玩笑意味)。编辑- 抱歉,前两个答案中包含的大量建议都没用;第三个答案(git branch test origin/test) 才是有效的。很高兴前两个答案有20倍的投票数... - dwanderson
10
"git fetch" 意为拉取远程仓库的更新,"git switch" 意为切换分支。 - onmyway133
1
至少在现代(2022年)的git环境中,在执行git checkout origin/test之前,git fetch origin test是必要的命令。 - Craig Hicks
5
这个回答应该被归档。向人们展示这样旧的答案没有用。Stackoverflow 应该有一个更新的答案按钮。 - NickJ
显示剩余6条评论
43个回答

11514
答案已根据是否配置了一个远程存储库或多个而拆分。原因是对于单个远程情况,由于存在较少的歧义,一些命令可以简化。 更新为Git 2.23:对于旧版本,请参见结尾处的部分。

只有一个远程

在两种情况下,都要从远程存储库开始获取,以确保您已下载所有最新更改。

$ git fetch

这将会为您获取所有的远程分支。您可以通过以下命令查看可用于签出的分支:

$ git branch -v -a

...
remotes/origin/test

remotes/* 开头的分支可以被视为远程分支的只读副本。要在分支上工作,您需要从中创建一个本地分支。这可以通过 Git 命令 switch(自Git 2.23起)来完成,只需给它远程分支的名称(减去远程名称)即可:
$ git switch test

在这种情况下,Git正在猜测(可以使用--no-guess禁用),您正在尝试检出并跟踪具有相同名称的远程分支。

使用多个远程仓库

如果存在多个远程仓库,则需要显式命名远程仓库。

与以前一样,首先获取最新的远程更改:

$ git fetch origin

这将为您获取所有远程分支。您可以使用以下命令查看可用于检出的分支:

$ git branch -v -a

有了远程分支,现在您需要使用-c检出您感兴趣的分支以创建一个新的本地分支:

$ git switch -c test origin/test

有关使用 git switch 的更多信息:

$ man git-switch

Git 2.23 之前

git switch 是在 Git 2.23 中添加的,在此之前,git checkout 被用于切换分支。

要仅检出单个远程存储库:

git checkout test

如果配置了多个远程仓库,那么它会变得有点长。
git checkout -b test <name of remote>/test

480
进一步讲解:Git不允许你在别人的分支上工作,你只能在自己的分支上工作。所以如果你想要向别人的分支添加内容,你需要创建自己的“分支副本”,这就是以上命令所做的事情(实际上,它会创建并切换到你的分支)。 - Dan Moulding
158
如果这是一个新的远程分支,您可能需要在执行此操作之前进行 git fetch,以便 git 知道 origin/test 的存在。 - Neil Sarkar
65
你可以使用git fetch origin test来完成此操作。 - Andrew
23
错误:"git checkout:更新路径与切换分支不兼容。您是否打算检出无法解析为提交的origin/test?" - Xeoncross
94
如果您有多个远程仓库,且这些仓库中存在相同的分支名称,则在现代版本的 Git 中使用 git checkout test 无法生效。这是因为 Git 不知道应该使用哪一个仓库的分支。 - masukomi
显示剩余6条评论

1519

旁注:使用现代 Git(>= 1.6.6),你可以仅使用

git checkout test

请注意,它是'test'而不是'origin/test',可以执行神奇的DWIM操作为您创建本地分支'test',其上游将是远程跟踪分支'origin/test'。

git branch输出中的*(无分支)表示您处于未命名分支上,即所谓的“分离的HEAD”状态(HEAD直接指向提交,并不是某个本地分支的符号引用)。如果您在此未命名分支上进行了一些提交,则始终可以从当前提交创建本地分支:

git checkout -b test HEAD

根据评论建议的一种更现代的方法:

@Dennis: git checkout <non-branch>,例如 git checkout origin/test 会导致分离 HEAD / 未命名分支,而 git checkout testgit checkout -b test origin/test 会导致本地分支 test(带有远程跟踪分支 origin/test 作为 上游) - Jakub Narębski Jan 9 '14 at 8:17

重点在于 git checkout origin/test


39
毫不奇怪,但这个版本在过去几年中已发布 - 知道这种语法可以节省很多时间,因为仍有许多旧文档和评论线程在流传,建议使用旧的方法来完成此操作。 - Curtis
13
“现代的Git”——为记录,你指的是大约哪个版本?有时我们必须在运行较旧Linux发行版的系统上工作。 - Craig McQueen
14
如果你收到这样的回应:error: pathspec 'branch_name' did not match any file(s) known to git. 那么你应该先执行 git fetch - Dennis
6
使用git版本1.8.3.msysgit.0,但这对我不起作用 - 没有匹配到任何git已知的文件 - 我已经做了很多git fetches。 - PandaWood
14
@Dennis:git checkout <non-branch>,例如 git checkout origin/test 会导致 HEAD 分离 / 无分支状态,而 git checkout testgit checkout -b test origin/test 会创建本地分支 test(并将远程跟踪分支 origin/test 设为上游)。 - Jakub Narębski
1
git checkout -b test FETCH_HEAD 对我有效。 - KRoy

786

在这种情况下,您可能希望创建一个本地的 test 分支,该分支跟踪远程的 test 分支:

$ git branch test origin/test

在早期的git版本中,你需要显式地使用--track选项,但是现在当你从远程分支分支时,默认就是这样的。

要创建本地分支并切换到它,请使用:

$ git checkout -b test origin/test

26
这将创建一个本地分支,但不会切换到它。 - Alex Skrypnyk
2
在你上面的建议中:git checkout -b test/origin/test你可能需要在它之前加上一个git fetch upstream以确保你的本地仓库知道远程分支 test 的存在。否则,谢谢,一切都按照广告所说的那样运作。 - oldfartdeveloper
这就是我实际想要达到的目标。当我使用其他命令时,我最终进入了一个脱离HEAD状态,这不是我想要的结果。谢谢! - Dominic P

570

被接受的答案对你无效吗?

虽然第一个和被选择的答案在技术上是正确的,但有可能您尚未从远程仓库检索所有对象和引用。如果是这种情况,您将收到以下错误消息:

$ git checkout -b remote_branch origin/remote_branch

致命错误:git checkout: 更新路径与切换分支不兼容。
你是想要检出无法解析为提交的 'origin/remote_branch' 分支吗?

解决方案

如果你收到此消息,你必须先执行git fetch origin,其中origin是远程仓库的名称,然后再运行git checkout remote_branch。以下是具体示例和响应:

$ git fetch origin
remote: Counting objects: 140, done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 69 (delta 36), reused 66 (delta 33)
Unpacking objects: 100% (69/69), done.
From https://github.com/githubuser/repo-name
   e6ef1e0..5029161  develop    -> origin/develop
 * [new branch]      demo       -> origin/demo
   d80f8d7..359eab0  master     -> origin/master

$ git checkout demo
Branch demo set up to track remote branch demo from origin.
Switched to a new branch 'demo'

如您所见,运行git fetch origin将检索我们尚未设置为在本地机器上跟踪的任何远程分支。从那里开始,由于现在我们有了对远程分支的引用,我们可以简单地运行git checkout remote_branch,并获得远程跟踪的好处。


谢谢!git checkout -b branch_name 对我有用。 - Sanushi Salgado

400

我尝试了上面的解决方案,但它没有起作用。请尝试这个,它有效:

git fetch origin 'remote_branch':'local_branch_name'

这将获取远程分支并创建一个名为local_branch_name的新本地分支(如果不存在),并在其中跟踪远程分支。


52
当 "git fetch origin" 或 "git remote update" 均未建立本地分支时,这对我起了作用。我不太确定为什么。 - Godsmith
10
这是我需要完成任务的最直接方式,即使用一个远程分支(而不是主分支)来创建一个新分支。 - Roralee
10
在从具有多个分支的远程仓库克隆单个分支时,工作无缝。 - Alex C
10
这个方法也适用于我,尽管被接受的答案和其他高票回答并没有奏效。我的git版本是2.5.0。 - pdepmcp
12
有人知道为什么这个在其他所有方法都不起作用的情况下却有效吗?(我的git版本是2.13.0) - Nathan Arthur
显示剩余3条评论

124

这将为未命名为 origin 的远程仓库 DWIMdocumentation):

$ git checkout -t remote_name/remote_branch

要添加新的远程,您需要首先执行以下操作:

$ git remote add remote_name location_of_remote
$ git fetch remote_name

第一个命令告诉Git远程存在,第二个命令获取提交记录。

124

用法:

git checkout -b <BRANCH-NAME> <REMOTE-NAME>/<BRANCH-NAME>

在我这种情况下,其他答案在使用现代 Git 时无法正常工作。如果远程分支是新的,您可能需要先拉取,但我还没有检查过这种情况。


15
现在看来,它们确实有重叠之处。只不过我的回答更加简洁明了,告诉你该做什么而不是讲故事。因此,我认为它可能更有用,特别是对于现在的Git版本。如果您认为这是一个糟糕的回答,您可以给它点踩。 - matanster
在阅读了其他答案并越来越困惑之后,这个答案实际上对我起了作用 :) - RosieC

120
你基本上看到了分支,但你还没有本地副本!...
你需要`fetch`这个分支...
你可以简单地`fetch`然后切换到这个分支,使用下面的一行命令来完成:
git fetch && git checkout test

我还为您创建了下面的图片,以便您分享这些差异,看看fetch的工作原理以及与pull的区别:

git fetch


78

要克隆Git仓库,请执行以下操作:

git clone <either ssh url /http url>

上述命令会检出所有分支,但只会初始化master分支。如果想要检出其他分支,请执行以下命令:

git checkout -t origin/future_branch (for example)

这个命令会检出远程分支,你的本地分支名称将与远程分支相同。
如果你想在检出时覆盖本地分支名称:
git checkout -t -b enhancement origin/future_branch

现在您的本地分支名称是enhancement,但您的远程分支名称是future_branch


66

我经常执行以下操作:

git fetch origin && git checkout --track origin/branch_name


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