7755

有人将一个名为testwith的分支推git push origin test送到共享存储库。我可以看到带有 的分支git branch -r

现在我正在尝试检查远程test分支。

我试过了:

  • git checkout test什么都不做

  • git checkout origin/test* (no branch). 这令人困惑。我怎么能在“没有分支”?

如何签出远程 Git 分支?

4

39 回答 39

10584

答案已根据配置的远程存储库是一个还是多个而有所不同。这样做的原因是,对于单个远程情况,一些命令可以简化,因为歧义较少。

针对 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
于 2009-11-23T14:26:08.970 回答
1400

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

git checkout test

(请注意,它是“测试”而不是“起源/测试”)执行神奇的DWIM -mery 并为您创建本地分支“测试”,上游将是远程跟踪分支“起源/测试”。


* (no branch)in输出意味着您在未命名的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 2014-01-09 08:17:37

强调git checkout origin/test

于 2009-11-24T00:17:17.517 回答
653

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

$ git branch test origin/test

在早期版本中git,您需要一个显式--track选项,但现在当您从远程分支分支时,这是默认选项。

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

$ git checkout -b test origin/test
于 2009-11-23T14:27:06.207 回答
531

接受的答案对您不起作用?

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

$ git checkout -b remote_branch origin/remote_branch

致命:git checkout:更新路径与切换分支不兼容。
您是否打算签出无法解析为提交的“origin/remote_branch”?

解决方案

如果您收到此消息,您必须先执行git fetch originwhere originis the name of the remote repository,然后再运行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,我们将获得远程跟踪的好处。

于 2012-12-07T20:52:10.790 回答
332

我尝试了上述解决方案,但没有奏效。试试这个,它有效:

git fetch origin 'remote_branch':'local_branch_name'

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

于 2013-10-18T05:55:11.553 回答
115

这将为未命名的远程DWIM原点(文档):

$ git checkout -t remote_name/remote_branch

要添加新的遥控器,您需要先执行以下操作:

$ git remote add remote_name location_of_remote
$ git fetch remote_name

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

于 2012-04-27T22:37:01.830 回答
110

利用:

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

在我的良性案例中,其他答案不适用于现代 Git。如果远程分支是新的,您可能需要先提取,但我没有检查过这种情况。

于 2016-02-21T10:58:58.923 回答
110

您基本上看到了分支,但是您还没有本地副本!...

你需要到fetch分行...

您可以简单地获取然后结帐到分支,使用下面的一行命令来执行此操作:

git fetch && git checkout test

我还为您创建了下面的图像来分享差异,看看它是如何fetch工作的以及它与以下内容的不同之处pull

获取

于 2017-09-05T14:20:27.137 回答
70

要克隆 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

于 2013-01-21T10:04:06.300 回答
45

你可以试试

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

或者

git fetch
git checkout -b local_branch_name origin/branch_name
于 2014-03-24T13:11:25.887 回答
36

首先,您需要执行以下操作:

git fetch# 如果你不知道分支名称

git fetch origin branch_name

其次,您可以通过以下方式将远程分支签出到本地:

git checkout -b branch_name origin/branch_name

-b将从您选择的远程分支以指定名称创建新分支。

于 2017-05-18T13:55:43.003 回答
32

我陷入了看到error: pathspec 'desired-branch' did not match any file(s) known to git.上述所有建议的境地。我在 Git 版本 1.8.3.1 上。

所以这对我有用

git fetch origin desired-branch
git checkout -b desired-branch FETCH_HEAD

背后的解释是我注意到在获取远程分支时,它被提取到了FETCH_HEAD

git fetch origin desired-branch

From github.com:MYTEAM/my-repo
    * branch            desired-branch -> FETCH_HEAD
于 2018-10-10T21:52:44.113 回答
31

我使用以下命令:

git checkout --track origin/other_remote_branch
于 2017-09-06T14:41:22.890 回答
28

命令

git fetch --all
git checkout -b <ur_new_local_branch_name> origin/<Remote_Branch_Name>

等于

 git fetch --all

接着

 git checkout -b fixes_for_dev origin/development

两者都将创建一个latest fixes_for_dev来自development

于 2016-04-21T19:10:39.880 回答
26

只需git checkout使用远程分支的名称运行。Git 将自动创建一个本地分支来跟踪远程分支:

git fetch
git checkout test

但是,如果在多个远程中找到该分支名称,这将不起作用,因为 Git 不知道该使用哪个。在这种情况下,您可以使用:

git checkout --track origin/test

或者

git checkout -b test origin/test

2.19中,Git 学习了checkout.defaultRemote配置,该配置指定了解决此类歧义时默认使用的远程。

于 2018-09-13T12:21:19.177 回答
24

如果分支位于远程以外的其他地方,origin我喜欢执行以下操作:

$ git fetch
$ git checkout -b second/next upstream/next

这会将远程next分支检出upstream到名为second/next. 这意味着如果您已经有一个名为 next 的本地分支,它将不会发生冲突。

$ git branch -a
* second/next
  remotes/origin/next
  remotes/upstream/next
于 2013-03-01T10:00:18.810 回答
23

这些答案都不适合我。这有效:

git checkout -b feature/branch remotes/origin/feature/branch
于 2018-07-10T02:11:25.127 回答
21

git remote show <origin name>命令将列出所有分支(包括未跟踪的分支)。然后你可以找到你需要获取的远程分支名称。

例子:

$ git remote show origin

使用以下步骤获取远程分支:

git fetch <origin name> <remote branch name>:<local branch name>
git checkout <local branch name > (local branch name should the name that you given fetching)

例子:

$ git fetch origin test:test
$ git checkout test
于 2018-01-07T13:12:54.257 回答
20

git fetch && git checkout your-branch-name

于 2014-03-26T07:00:14.277 回答
17

git branch -r表示对象名称无效,因为该分支名称不在 Git 的本地分支列表中。从 origin 更新您的本地分支列表:

git remote update

然后尝试再次检查您的远程分支。

这对我有用。

我相信git fetch拉入所有远程分支,这不是原始发布者想要的。

于 2013-06-06T12:21:48.030 回答
15

从远程获取并签出分支。

git fetch <remote_name> && git checkout <branch_name> 

例如:

git fetch origin && git checkout feature/XYZ-1234-Add-alerts

于 2018-05-21T11:33:53.613 回答
13

其他人给出了解决方案,但也许我可以告诉你原因。

git checkout test 什么都不做

Does nothing不等于doesn't work,所以我猜当您在终端中键入“git checkout test”并按回车键时,不会出现任何消​​息,也不会发生错误。我对吗?

如果答案是“是”,我可以告诉你原因。

原因是您的工作树中有一个名为“test”的文件(或文件夹)。

git checkout xxx解析时,

  1. Git 起初看起来xxx是一个分支名称,但没有任何名为 test 的分支。
  2. 然后 Git 认为xxx是一个路径,幸运的是(或不幸地),有一个名为 test.txt 的文件。所以git checkout xxx意味着丢弃xxx文件中的任何修改。
  3. 如果也没有文件名xxx,Git 将尝试xxx根据一些规则创建文件。规则之一是创建一个名为xxxif remotes/origin/xxxexists 的分支。
于 2017-07-10T07:45:04.797 回答
13

git checkout -b "Branch_name" [B 表示创建本地分支]

git 分支--全部

git checkout -b "你的分行名称"

git 分支

git pull origin "你的分支名称"

成功从 master 分支结帐到 dev 分支

在此处输入图像描述

于 2019-12-10T06:29:46.890 回答
12

获取新创建的分支

git fetch

切换到另一个分支

git checkout BranchName
于 2018-03-15T08:49:37.610 回答
8

由于某种原因,我不能这样做:

$ git checkout -b branch-name origin/branch-name

它抛出错误:

fatal: 'origin/branch-name' is not a commit and a branch 'branch-name' cannot be created from it

我必须做:

$ git checkout -b branch-name commit-sha
于 2021-09-09T09:01:59.467 回答
8

您可以使用以下 Bash 脚本开始跟踪所有远程分支:

#!/bin/bash
git fetch --all
for branch in `git branch -r --format="%(refname:short)" | sed 's/origin\///'`
  do git branch -f --track "$branch" "origin/$branch"
done

这里也是单行版本:

git fetch --all; for branch in `git branch -r --format="%(refname:short)" | sed 's/origin\///'`; do git branch --track "$branch" "origin/$branch" ; done ;
于 2017-08-11T12:06:57.497 回答
8

我经常做: git fetch origin && git checkout --track origin/branch_name

于 2021-01-13T11:59:11.557 回答
8

让所有远程分支使用这个:

git fetch --all

然后结帐到分支:

git checkout test
于 2019-09-23T06:46:40.440 回答
7

只需运行这两个命令,您就可以开始了。

git checkout <branch-name>
git pull <remote> <branch-name>
于 2020-06-26T05:15:01.073 回答
7

对我们来说,配置似乎出remote.origin.fetch了问题。因此,除了 之外,我们看不到任何其他远程分支master,因此git fetch [--all]没有帮助。既没有git checkout mybranchgit checkout -b mybranch --track origin/mybranch没有工作,虽然它肯定是在远程。

之前的配置只允许master获取:

$ git config --list | grep fetch
remote.origin.fetch=+refs/heads/master:refs/remotes/origin/master

通过使用*并从源获取新信息来修复它:

$ git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

$ git fetch
...
 * [new branch] ...
...

现在我们可以git checkout在本地进行远程分支。

不知道这个配置是如何在我们的本地仓库中结束的。

于 2019-09-20T10:20:18.163 回答
6

git fetch --all

会将所有远程分支提取到您的本地

git checkout test

会将您切换到测试分支

于 2021-06-12T11:17:27.470 回答
6

TL;DR 使用git switch而不是git checkout此链接中的更多详细信息

我认为答案已经过时了。Git 拆分了checkouttoswitchrestorenow 的一些功能。

以下是我的总结:

如果你想为远程分支更新一些东西,你应该创建本地分支来“跟踪”远程分支。您可以在本地更新您想要的任何内容,最后推送到远程。如果您在克隆存储库后直接签出到远程分支,您可能会看到“分离的 HEAD”状态和来自 Git 的以下消息:

Note: switching to 'origin/asd'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at d3e1083 Update a

那么如何创建本地分支来跟踪远程分支呢?

要创建本地分支以跟踪远程分支,您可以使用git checkout <remote branch name>git switch <remote branch name>。如果您有一个文件或文件夹与您的远程分支名称相同,git checkout会输出一些错误消息,但git switch可以正常工作!

例子:

  1. 查看所有分支,我们要创建本地分支来跟踪远程分支remotes/origin/asd,我们还有文件名asd
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/asd
  remotes/origin/ereres
  remotes/origin/master
  remotes/origin/zxc
$ ls                                
a  asd
  1. 文件名与远程分支相同,如果我们使用git checkout命令创建本地分支来跟踪远程分支,Git 应该会输出一些错误消息
$ git checkout asd  
fatal: 'asd' could be both a local file and a tracking branch.
Please use -- (and optionally --no-guess) to disambiguate
  1. 如果我们使用它,它会起作用git switch
$ git switch ereres  
Branch 'ereres' set up to track remote branch 'ereres' from 'origin'.
Switched to a new branch 'ereres'

$ git branch -vv
* ereres 3895036 [origin/ereres] Update a
  master f9e24a9 [origin/master] Merge branch 'master' of 
于 2021-09-16T03:04:32.720 回答
6

如果远程分支名称以特殊字符开头,则需要在 checkout 命令中使用单引号,否则 Git 将不知道您在谈论哪个分支。

例如,我尝试签出一个名为 的远程分支#9773,但该命令无法正常工作,如下图所示:

在此处输入图像描述

出于某种原因,我想知道尖锐符号 (#) 是否与它有关,然后我尝试用单引号将分支名称括起来,'#9773'而不是仅仅#9773,幸运的是它工作正常。

git checkout -b '#9773' origin/'#9773'
于 2018-11-07T11:17:30.593 回答
6

我用过那个:

git fetch origin
git reset --hard origin/{branchname}
于 2020-08-19T07:28:31.540 回答
5

在我看来,没有人提出最简单的方法(或者我可能太愚蠢了,无法认为这是“一种方法”)。但无论如何,你试过这个吗?

$ git pull origin remoteBranchName
$ git switch remoteBranchName

这在同样的情况下对我有用(在我最后一次拉取请求之后在远程创建的分支)。

于 2022-01-13T20:05:26.907 回答
3

用来fetch拉出你所有的遥控器

   git fetch --all

列出远程分支:

   git branch -r

列出你所有的分支

   git branch -l
   >>outpots like-
     * develop
       test
       master

结帐/更改分支

   git checkout master
于 2019-05-24T08:51:32.353 回答
2

请按照命令创建一个空文件夹。输入并使用以下命令:

saifurs-Mini:YO-iOS saifurrahman$ git clone your_project_url
Cloning into 'iPhoneV1'...
remote: Counting objects: 34230, done.
remote: Compressing objects: 100% (24028/24028), done.
remote: Total 34230 (delta 22212), reused 15340 (delta 9324)
Receiving objects: 100% (34230/34230), 202.53 MiB | 294.00 KiB/s, done.
Resolving deltas: 100% (22212/22212), done.
Checking connectivity... done.
saifurs-Mini:YO-iOS saifurrahman$ cd iPhoneV1/
saifurs-Mini:iPhoneV1 saifurrahman$ git checkout 1_4_0_content_discovery
Branch 1_4_0_content_discovery set up to track remote branch 1_4_0_content_discovery from origin.
Switched to a new branch '1_4_0_content_discovery'
于 2016-01-01T10:31:09.137 回答
1

有很多选择,例如:

  • 备选方案 1:

    git fetch && git checkout test
    

    这是最简单的方法。

  • 备选方案 2:

    git fetch
    git checkout test
    

    它是相同的,但在两个陡峭的地方。

于 2019-10-30T10:56:35.443 回答
1

您可以在本地添加一个新分支test,然后使用:

git branch --set-upstream-to=origin/test test
于 2020-09-19T02:57:52.457 回答