如何签出远程Git分支?


6711

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

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

我试过了:

  • git checkout test 什么都不做

  • git checkout origin/test* (no branch)。这令人困惑。我怎么会处于“无分支”状态?

如何签出远程Git分支?


9
@inger但它不包括重命名新的本地分支的可能性(如果您以后要--set-upstream并保持命名一致性)
fachexot 2014年

15
我认为此线程无济于事。似乎没有任何效果,许多答案似乎都遗漏了原始问题。我已经读完每个字,尝试了下面的所有内容,却不知道如何做OP想要做的事情。
Tony Ennis 2014年

6
Git命令一开始并不直观,将最新版本引入的更改添加到混合中,您就会看到此页面...
Christophe Roussy

14
我觉得自己在服用疯药。我试图从检出一个分支upstream,而不仅仅是origin,每推荐答案并不做任何远程帮助的(双关语,意)。编辑 -对不起,前2个答案中包含的大量建议都没有用;第三个(git branch test origin/test)是有效的。很高兴前2名的投票数是20倍...
dwanderson

4
也许您的工作树中有一个名为“ test”的文件,有关详细信息,请参见stackoverflow.com/a/45006389/792416
年长的人,

Answers:


9149

更新资料

雅库布的答案实际上对此有所改善。使用≥1.6.6的Git版本,并且只有一个遥控器,您可以执行以下操作:

git fetch
git checkout test

正如masukomi用户在评论中指出的那样,git checkout test如果您有多个遥控器,则在现代git中将不起作用。在这种情况下使用

git checkout -b test <name of remote>/test

或速记

git checkout -t <name of remote>/test

旧答案

在开始在远程分支上进行本地工作之前,您需要按照下面的答案中的说明获取它。

要获取分支,您只需要:

git fetch origin

这将为您获取所有远程分支。您可以通过以下方式查看可用于结帐的分支:

git branch -v -a

有了远程分支后,您现在需要检出您感兴趣的分支,并为您提供本地工作副本:

git checkout -b test origin/test

398
对此进行扩展:git不允许您在其他人的分支上工作。您只能自己工作。因此,如果您想添加到其他人的分支,则需要创建该分支的自己的“副本”,这就是上述命令的作用(当然,它也会创建您的分支并将其签出)。
Dan Moulding)2009年

139
如果这是一个新的远程分支,则可能需要git fetch在执行此操作之前使git知道origin/test
Neil Sarkar

56
...并且您可以通过git fetch origin test
Andrew

22
错误:“ git checkout:更新路径与切换分支不兼容。您是否打算检出origin/test无法解决为提交的检出?”
Xeoncross 2012年

85
git checkout test如果您有多个具有相同分支名称的遥控器,则在现代git中将不起作用。它不知道要使用哪个。
masukomi 2014年

1256

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

git checkout test

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


* (no branch)git branch输出的意思是你在无名分支,在所谓的“分离的头”状态(HEAD直接点提交,并不是象征性的参考了一些当地的分支机构)。如果您在此未命名分支上进行了一些提交,则始终可以从当前提交创建本地分支:

git checkout -b test HEAD

**编辑(由编辑者而非作者编辑)**

我发现下面有一条评论,似乎可以使此答案现代化:

@Dennis:git checkout,例如git checkout origin / test结果在分离的HEAD /未命名分支中,而git checkout test或git checkout -b test origin / test结果在本地分支测试中(远程跟踪分支origin / test为上游)– JakubNarębski2014年1月9日在8:17

强调 git checkout origin/test


33
毫不奇怪,但是此版本已在最近几年发布-知道此语法可以节省大量时间,因为仍然有很多旧文档和注释线程建议使用此方法是较旧的方法。
柯蒂斯

10
“现代git”-记录下来,(大约)您指的是什么版本?有时我们必须在运行较旧发行版的系统上工作。
Craig McQueen 2012年

5
在这种情况下,“现代git”是git 1.6.6
Bobby Norton

10
@aidan如果收到类似的响应error: pathspec 'branch_name' did not match any file(s) known to git.,则应首先进行git fetch。
丹尼斯

6
使用git版本1.8.3.msysgit.0,这对我不起作用-与git已知的任何文件都不匹配-我已经进行了许多git提取
PandaWood 2013年

563

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

$ git branch test origin/test

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


15
这将创建一个本地分支而不切换到该分支。
Alex Skrypnyk

2
尽管我很致命:模棱两可的对象名称:'origin / dev'-最明确地存在起源上的分支'dev'-但我不小心在机器上创建了一个名为“ origin / dev”的分支(在我之前的愚蠢尝试中)毫无疑问地获得这项权利)...
ouch

1
这一直给我带来错误错误:无法将某些引用推送到提示:由于推送的分支提示位于其远程提示:对应项之后,因此更新被拒绝。签出此分支并合并远程更改提示:(例如'git pull'),然后再次推送。提示:有关详细信息,请参见“ git push --help”中的“关于快进的注意事项”。
pal4life 2014年

475

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

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

$ 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并且可以获得远程跟踪的好处。


2
如果您在本地有一个单独的分支,我将添加一条注释:确保已使用'git remote add origin [the_path_to_your_repo / repo_name.git]'将其与远程仓库关联。然后使用“ git fetch origin”,其中“ origin”表示与之建立关联的原始存储库。
elliotrock

git checkout -b newbranch一站式创建和基于当前分支签出新分支也非常有用。
Linus

2
我认为这是最新的(它使$ @#!ing不断变化!)。Git 2.5.5我发现实际看到远程分支git ls-remote的唯一方法是,而实际使用远程分支的唯一方法是git checkout -b [branch] --track [remote/branch]...那是工作之后的 git pull [remote] [branch]。即,它实际上拉动了整个分支,但仍未列出。
delicateLatticeworkFever

当此答案也不起作用时,请参阅答案。
eis

仅添加,如果git fetch other_remote only_branch您仍然会收到fatal错误。您必须git fetch other_remote没有分支名称。奇怪的设计。
est

258

我尝试了上述解决方案,但是没有用。试试这个,它的工作原理:

git fetch origin 'remote_branch':'local_branch_name'

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


37
当git fetch origin或git remote update都没有创建本地分支时,这对我有用。我不知道为什么。
Godsmith,2014年

4
这是完成我所需要的最直接的方法,即使用远程分支(而非主分支)创建新分支。
罗拉里

7
无缝工作,特别是从具有多个分支的远程克隆单个分支时。
亚历克斯·C

7
这对我也很有效,在这里接受的答案和其他高票都没有。我的git版本是2.5.0
pdepmcp '17

5
有谁知道为什么其他所有方法都不奏效?(我在git 2.13.0上)
内森·亚瑟

108

这将对未命名的远程DWIM文档):

$ git checkout -t remote_name/remote_branch

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

$ git remote add remote_name location_of_remote
$ git fetch remote_name

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


104

采用:

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

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


2
您是否意识到这是此答案的一部分
Thomas Ayoub,2016年

14
现在看,它们确实重叠。只有我的话是简洁的,它告诉您做什么而不是讲故事。因此,我认为它可能更有用,尤其是对于当今的git版本。如果您认为这是一个错误的答案,则可以对其投票。
matanster '16

1
git fetch是安全的选择。在使用拉动之前尝试获取。两者都下载远程内容,但是虽然获取不会更改本地状态,但是pull会立即更改本地状态。
彼得·萨莱

89

好的,答案很简单...您基本上可以看到分支,但是您还没有本地副本!...

您需要到fetch分公司...

您可以简单地提取然后签出到分支,使用下面的单行命令执行此操作:

git fetch && git checkout test

我还创建了下面的图片供您分享差异,看看其fetch工作原理以及与以下内容的不同之处pull

git获取


@DmitriZaitsev是的,它将起作用,如果存在远程分支,并且您进行提取,则将在本地获取该分支... git fetch && git checkout test ..因此,此方法有效,除非没有远程分支,但问题说那里已经有一个远程分支……
Alireza '18

我看问题的方式test看起来像一个新分支,因此它不可能在本地出现。否则,您可以使用单个git pull命令将其轻松拉出。
德米特里·扎伊采夫

@DmitriZaitsev,是的,这就是为什么我说git fetch,检查刚刚创建的远程分支,pull可以引入其他不需要的东西,但是如果您已经在本地拥有回购协议,则fetch使所有分支可用...
Alireza

是否会在获取的副本中fetch没有pull保留更改,而在本地分支中没有保留更改,导致您的本地分支不是最新的吗?
Dmitri Zaitsev '18

56

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

文献资料


git clone <ssh url / http url>-对我来说很完美
Kmeixner 2014年

是的,你是对的。感谢您提供的信息,我会尽快对其进行更新@warvariuc
Madhan Ayyasamy

如果遥控器没有master,则无法使用。
polkovnikov.ph 16/09/27

36

你可以试试

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

要么

git fetch
git checkout -b local_branch_name origin/branch_name

2
FYI,--track在较新版本的git中不再需要,因为它是默认设置的,如之前的答案中所述

33

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

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

git fetch origin branch_name

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

git checkout -b branch_name origin/branch_name

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


我不明白-b。如果您可以做“ git checkout master”,为什么不能做“ git checkout origin / test”?
约翰·利特尔

-b表示来自起源/主
节点的

28

我使用以下命令:

git checkout --track origin/other_remote_branch

13
如果您解释了为什么以这种方式使用它,那么这个答案将更加有用。即为什么有人应该使用“ --track”等等……
Matt Friedman

27

指令

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_devdevelopment


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


18

这些答案都不适合我。这工作:

git checkout -b feature/branch remotes/origin/feature/branch


1
谢谢。我想知道是否必须使用在调用命令时看到的完整路径(remotes / origin / feature / branch),但是我不确定,因此我只是使用了它,而且看起来可以正常工作。讯息:gitgit branch -agit checkout -b apps/FEATURE/branch origin/apps/FEATURE/branchBranch 'apps/FEATURE/branch' set up to track remote branch 'apps/FEATURE/epicBranch' from 'origin'. Switched to a new branch 'apps/FEATURE/branch'
克里斯

18

我陷入了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

17

只需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配置,该配置指定了解决这种歧义时默认使用的遥控器。


16

git branch -r说对象名称无效,因为该分支名称不在Git的本地分支列表中。使用以下命令从来源更新本地分支列表:

git remote update

然后尝试再次签出您的远程分支。

这对我有用。

我相信,git fetch在拉所有远程分支机构,这是不是原来的海报想要什么。


2
仅供参考,git remote update 还将提取所有远程分支机构

13

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

@hallski回答不工作2.15.1版本,但我减少了.git文件,只克隆了一个分支,并使用--depth标志过滤了历史记录。例如,$ git clone -b release --single-branch --depth 5 https://github.com/user/repo.git不提供信息$ git remote show origin,不会列出具有单个分支克隆存储库的所有远程分支。
Qh0stM4N

10

从远程获取并检出分支。

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

例如:

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


9

其他人和女同性恋者提供了解决方案,但也许我可以告诉你原因。

git checkout测试,什么都不做

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

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

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

git checkout xxx解析,

  1. Git首先看起来xxx是一个分支名称,但是没有任何名为test的分支。
  2. 然后Git认为这xxx是一条路径,幸运的是(或者不幸的是)有一个名为test的文件。因此git checkout xxx意味着丢弃xxx文件中的任何修改。
  3. 如果没有一个文件名xxx,那么Git会尝试xxx根据一些规则创建文件。规则之一是创建一个名为xxxif 的分支remotes/origin/xxx

谢谢,一直试图弄清楚git为什么什么也没做。
Mike R


6

您可以使用以下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 ;

5

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

git分支--all

git checkout -b“您的分支名称”

git分支

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

在此处输入图片说明


git checkout -b“ Branch_name” [B表示创建本地分支]
Keshav Gera

3

要获取所有远程分支,请使用以下命令:

git fetch --all

然后结帐到分支:

git checkout test

2

使用fetch您的所有远程拉

   git fetch --all

列出远程分支机构:

   git branch -r

列出所有分支机构

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

结帐/更改分支

   git checkout master

尝试过git branch -l,没有显示远程分支。
Dmitri Zaitsev

使用git pull --allgit fetch --all
Nasir Khan

是的,在那之后,git branch -l 仍然仅显示本地分支。它似乎和git branch没有时一样工作-l,那是什么原因-l呢?
Dmitri Zaitsev

另外,您的答案不能回答问题- master不是远程分支。
Dmitri Zaitsev

-l标记列表。您可以使用--list
纳西尔·汗

2

对于我们来说,remote.origin.fetch配置似乎出了问题。因此,除了之外,我们看不到其他任何远程分支机构master,因此git fetch [--all]无济于事。既不git checkout mybranch也不git 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在本地远程分支了。

不知道此配置如何在我们的本地存储库中结束。


1
自从我克隆了一个分支以来,这为我解决了问题
Pontus Holmbom

2

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

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

在此处输入图片说明

由于某种原因,我想知道尖号(#)是否与它有关,然后我尝试用单引号将分支名称引起来,例如'#9773'rathen than just #9773,幸运的是它可以正常工作。

$ git checkout -b '#9773' origin/'#9773'

在许多Unix shell中,该#字符用于注释,因此#将忽略之后的所有内容。这是外壳程序,不是git特有的。在之前使用反斜杠引号#就足够了。
Paulo Scardine

1

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

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'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.