Git获取远程分支


2260

我和我的同事正在同一存储库上工作。我们已将其分为两个分支,每个分支在技术上均适用于不同的项目,但是它们具有相似之处,因此有时我们需要master从返回* branch

但是,我有branch。我的同事该如何专门拉那个分支?

git clone仓库的A 似乎并没有在本地为他创建分支,尽管我可以看到它们在最终推动后仍处于混乱状态。

另外,当我最初创建分支时,我也做了-b checkout。这有什么不同吗?

$ git branch -r
origin/HEAD -> origin/master
origin/daves_branch
origin/discover
origin/master

$ git fetch origin discover
$ git checkout discover

这些是我运行的命令。但这绝对是行不通的。

我希望能够检出该分支,然后从各种协作者或工作站将分支更改推回并提交



33
我用过: git fetch --all,然后查看所有分支:git branch,然后我检查了分支:git checkout nameofnewbranch
Jeff Mattson



6
git fetch origin discover:discover && git checkout discover
Gayan Weerakutti

Answers:


3056

您需要创建一个跟踪远程分支的本地分支。以下命令将创建一个名为daves_branch的本地分支,跟踪远程分支origin / daves_branch。当您进行更改时,远程分支将被更新。

对于最新版本的Git:

git checkout --track origin/daves_branch

--track是简写形式,git checkout -b [branch] [remotename]/[branch]其中[remotename]是起源,而[branch]是相同的两倍,在这种情况下是daves_branch

对于Git 1.5.6.5,您需要:

git checkout --track -b daves_branch origin/daves_branch

对于Git 1.7.2.3及更高版本,这已经足够了(它可能更早开始了,但这是我可以很快找到的最早的确认):

git checkout daves_branch

请注意,对于最新的Git版本,此命令将不会创建本地分支,而会将您置于“分离的HEAD”状态。如果要本地分支,请使用该--track选项。

完整的详细信息在这里:3.5 Git分支-远程分支,跟踪分支


133
“ git fetch”以确保使用远程引用更新了您的存储库,并且“ git checkout --track origin / discover”就足够了。然后,您可以提交到该分支,并执行“ git push”以将远程与您的更改同步。
ralphtheninja 2012年

33
我尝试了这一操作,并得到“致命的:git checkout:更新路径与切换分支不兼容。您是否打算检出无法解析为commit的'upstream / develop'?”。难道我做错了什么?
尼尔·巴恩威尔

42
看起来git 1.5.6.5需要这个代替:git checkout --track -b origin / daves_branch
Charlie

35
这给我带来了麻烦,它创建了一个名为origin / <branch>的本地分支,该分支现在与远程分支origin / <branch>无关,而且我不知道如何摆脱疯狂的本地分支!
艾伦·摩尔

24
您需要显式添加本地分支名称,否则git使用完整的分支路径创建一个新的本地分支,如上述@AlanMoore和@ derekmx271所示:git checkout -b --track daves_branch origin/daves_branch
Mike Scott

961

我已经使用了fetch之后checkout...

git fetch <remote> <rbranch>:<lbranch>
git checkout <lbranch>

...在哪里<rbranch>是远程分支或源引用,并且<lbranch>是您要跟踪的尚不存在的本地分支或目标引用,并且可能要与远程分支或源引用相同的名称。在的说明中的选项下对此进行了说明<refspec>

Git非常聪明,如果我在远程分支的前几个字母后按Tab键,它将自动完成第一个命令。也就是说,我什至不必命名本地分支,Git会自动为我复制远程分支的名称。谢谢吉特!

就像在类似的Stack Overflow帖子中显示的答案一样,如果您未在中命名本地分支fetch,则在使用-b标志检出它时仍可以创建它。也就是说, git fetch <remote> <branch>其后的git checkout -b <branch> <remote>/<branch>功能与我最初的答案完全相同。看样子,如果你的版本库只有一个遥控器,那么你可以这样做git checkout <branch>fetch,它会创建一个本地分支你。例如,您刚刚克隆了一个存储库,并想从远程签出其他分支。

我认为的某些文档fetch可能是从逐字复制的pull。特别是<refspec>in 选项中的部分相同。但是,我不相信fetch会永远merge这样,因此,如果您将冒号的目标端留空,fetch 应该什么也不做

注意:git fetch <remote> <refspec>的缩写,git fetch <remote> <refspec>:因此将无能为力,但git fetch <remote> <tag>git fetch <remote> <tag>:<tag>应在<tag>本地复制远程文件的含义相同。

我想这仅对您要在本地复制远程分支而不是立即将其签出有用。否则,我现在将使用已接受的答案,因为它是单行的,所以将在结帐说明的第一部分中详细说明,随后在选项部分中的解释下进行详细说明--track好吧……有点单线,因为您仍然必须先运行git fetch <remote>

仅供参考:<refspecs>(source:destination)的顺序说明了Git 1.7之前的怪异方法,用于删除远程分支。也就是说,什么都不要推入目标refspec中。


8
您假定已设置Git自动完成。code-worrier.com/blog/autocomplete-git
antonagestam

2
这对我来说很有效,可以将远程代码放入本地分支。但是,它没有让我的本地分支跟踪远程分支。
Aknosis

1
由于某种原因,git fetch remote branch尽管获取了所有引用,但根本没有为我添加分支头,因此,当我尝试按照接受的答案中的步骤进行操作时,出现了错误pathspec did not match any file(s) known to git.,但该rbranch:lbranch方法有效。有趣的是,它还提取了所有以相同前缀开头的标签,例如通配符(rbranch*)。
haridsv

3
Nit:git不会自动填充,它是bash shell进行的。
合法化

1
FWIW,我认为这个答案和公认的答案之间的区别在于,这个答案告诉您执行fetch命令。可以接受的答案是有道理的,因为OP指出他已经进行了提取。至少这是我遇到的问题。
tenor528

373

如果您要“签出”一个新的远程分支(仅存在于远程分支,但不存在于本地),则需要:

git fetch origin
git checkout --track origin/<remote_branch_name>

假设您要从origin获取。如果不是,请用您的远程名称替换origin


1
为我工作,我没有获取正确的远程分支,所以被接受的答案对我来说一直是令人困惑的消息。+1
Nathan Hinchey

通常,我使用git fetch,但是问题是git fetch和git fetch origin有什么区别?
平宇

@PingWoo假设分支您想获取驻留在产地偏远,都git fetchgit fetch remote会做同样的事情。如果您需要从其他地方获取数据origin,则可以使用进行操作git fetch <other_remote_name>。这种情况非常罕见,为完整性起见,在此仅提及。
paneer_tikka

1
我尝试将所有这些解决方案都撞到PC上。原来,我的分行名称有错字,愚蠢的呵呵。
Dev Yego

126

要检出远程存在而不是本地存在的myBranch-这对我有用:

git fetch --all
git checkout myBranch

我收到此消息:

Branch myBranch set up to track remote branch myBranch from origin
Switched to a new branch 'myBranch'

1
换句话说,您不必写-t
Andrew Samuelsen 2014年

4
我认为此答案有误。我最初不带命令就-t得到了,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 performing another checkout.因为没有同名的本地分支。我不得不重新运行以-t进行修复。
斯坦里

1
这对我来说效果很好-我的同事添加了一个新的远程分支,我想添加到我的本地仓库中。我一直在获取数据,但是没有看到新的分支出现在本地。没意识到我可以运行checkout它来创建它。谢谢!
skwidbreth '16

2
取决于git版本。如此处其他地方所述,最新版本仅需要git checkout <起源上分支的名称>。谨慎使用本地相同的名称vs远程分支-它们将把东西弄乱
leRobot

--all这绝不是一个好主意,因为它将下载每个分支上的每个文件。这将花费更多的时间和空间。最好是具体与分支的名称和不喜欢这样
蜂蜜

53

使用git branch -a(本地和远程分支)或git branch -r(仅远程分支)查看所有远程控制器及其分支。然后,您可以git checkout -t remotes/repo/branch对远程服务器执行操作并创建本地分支。

还有一个git-ls-remote命令来查看该遥控器的所有引用和标签。


git checkout remotes/repo/branch使git checkout查找pathspec,而不是远程回购。
Erin

1
是的,甚至可以在远程仓库上签出分支吗?显然(或者可能不是那么明显),首先要获取远程控制器,以便将其本地存储。git书上有一个不错的部分:git-scm.com/book/en/Git-Branching-Remote-Branches
Daniel Lee

43

标题和问题混淆了:

  • Git获取远程分支
  • 我的同事该如何专门拉那个分支。

如果问题是,我如何才能使用远程分支,或者如何Git签出远程分支?,一个更简单的解决方案是:

使用Git(> = 1.6.6),您可以使用:

git checkout <branch_name>

如果<branch_name>找不到local ,但是在一个完全匹配名称的远程中确实存在一个跟踪分支,则将其等效为:

git checkout -b <branch_name> --track <remote>/<branch_name>

请参阅Git结帐文档

给你的朋友:

$ git checkout discover
Branch discover set up to track remote branch discover
Switched to a new branch 'discover'

谢谢纪尧姆!我只是使用此命令并写了一篇帖子来描述我的确切情况:leniel.net/2014/05/…–
Leniel Maccaferri

<!-git checkout <远程分支名称>->可以正常工作,谢谢Guillaume!
Sachidananda Naik,

36

至少对我而言,最简单的方法是:

git fetch origin <branchName> # Will fetch the branch locally
git checkout <branchName> # To move to that branch

1
不带来其他分支机构
本杰明·哈雷尔

7
@BenjaminHarel问题说“并非获取所有分支”。对于跟随你,这可能是有益的stackoverflow.com/questions/10312521/...
詹姆斯Rochabrun

2
使用此fetch命令后,所需的分支将在本地计算机上可用。git checkout -b 'your_branch' origin/'remote branch'需要签出此分支。
阿披耶特

30

采用:

git checkout -b serverfix origin/serverfix

这是Git提供的--track速记的足够普遍的操作:

git checkout --track origin/serverfix

实际上,这是如此普遍,以至于甚至有一个快捷方式。如果您尝试检出的分支名称(a)不存在,并且(b)仅与一个远程上的名称完全匹配,Git将为您创建一个跟踪分支:

git checkout serverfix

要使用与远程分支不同的名称来设置本地分支,可以轻松地使用具有不同本地分支名称的第一个版本:

git checkout -b sf origin/serverfix

现在,您的本地分支sf将自动从提取origin/serverfix

资料来源:Pro Git,第二版,由Scott Chacon和Ben Straub撰写(出于可读性的考虑)


这些速记是一个教训
Z. Khullah '19


18

要获取远程存在的分支,最简单的方法是:

git fetch origin branchName
git checkout branchName

您可以使用以下命令查看它是否已经存在于远程服务器上:

git branch -r

这将获取远程分支到您的本地,并将自动跟踪远程分支。


2
这个问题如何没有更多的赞誉?我可能是错的,但是这肯定可以解决问题,从远程获取了我在本地没有的分支……
Nicholas Petersen

15

帮助我的是

1)查看所有可用的远程分支(例如“ remote-branch-name”)

git branch -r

2)使用远程分支名称创建本地分支

git fetch && git checkout 'remote-branch-name'

1
当您在git push不使用任何其他参数的情况下运行命令时会发生什么?名为的本地分支是否remote-branch-name自动与名为的远程分支关联(跟踪)origin/remote-branch-name。还是您需要跑步git push -u origin remote-branch-name
PatS '18

1
这将导致头部卸下状态
阿金焕



13

我打过

git checkout <branch_name>

并得到了

Branch <branch_name> set up to track remote branch <branch_name> from origin.
Switched to a new branch '<branch_name>'

来自git checkout文档:如果未找到<branch_name>,但确实在一个具有匹配名称的远程中存在跟踪分支,则等同于:git checkout -b <branch_name> --track <remote>/<branch_name>
Guillaume Vincent

11

有时会要求您不要摆弄master分支,而只工作远程分支(如我所要求的那样)。因此,您需要的只是远程分支。

因此,要单独克隆远程分支(不包含主分支),请执行此操作

git clone url --branch remote_branch_name

其中,remote_branch_name是远程分支的名称

例如,

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --branch v3.15

这将确保您使用远程分支的名称将远程分支克隆到本地分支。

现在,如果您提交代码并推送,则代码将仅提交到该分支。


相关:如何在Git中克隆单个分支?- “ git 1.7.10(2012年4月)实际上只允许您克隆一个分支:”
Peter Mortensen

11

[快速回答]

有很多选择,我的最爱是:

-备选方案1:

git fetch --all
git checkout YourBranch

使用此替代方法可使用远程存在的分支,而不是本地分支。

-备选方案2:

git checkout -b 'YourBranch' origin/'YourRemote'

可能这是最简单的方法。


9

假设您的遥控器是git@xyz.git,并且您想要它的random_branch分支。该过程应如下:

  1. 首先通过以下方式查看您的遥控器列表

    git remote -v

  2. 如果上面命令的输出中没有git@xyz.git远程,则可以通过以下方式添加它:

    git remote add xyz git@xyz.git

  3. 现在,您可以通过以下方式获取该遥控器的内容

    git fetch xyz

  4. 现在,通过以下方式检出该遥控器的分支

    git checkout -b my_copy_random_branch xyz/random_branch

  5. 通过以下方式查看分支列表

    git branch -a

本地分支my_copy_random_branch将跟踪您的遥控器的random_branch分支。



7

git fetch && git checkout <your friend's branch name> 应该做到的


7

我想给你一个单线命令,用于将所有远程分支提取到本地,并切换到所需的新创建的本地分支:

git fetch && git checkout discover

运行上面的命令后,您将获得以下消息:

Switched to a new branch 'discover'
Branch discover set up to track remote branch discover from origin.

第一行状态切换到 新分支 -为什么要新?它已经在远程存在!

但是实际上您也必须在本地创建它。该分支取自远程索引,并为您本地创建。

discover是从存储库的远程分支创建的新分支discover

但是第二行比第一提供了更多信息,告诉我们:

我们的分支机构设置为跟踪具有相同名称的远程分支机构

虽然git fetch 获取所有分支到本地。但是,如果您追随git branch它,则只会master在本地看到分支。为什么

因为对于远程拥有的每个分支,您也必须在本地创建它,以便像git checkout <branchname>上面的示例中那样跟踪它。

运行git checkout命令之后,您可以运行git branch,现在您可以看到两个分支:

  1. 大师和2.在您的本地列表中发现。


5

只需尝试:

git pull origin your_branch_name

2
Rizo,git pull origin branch_name应该是最好的解决方案。您是唯一将此发布为解决方案的人,它对我有用。这行得通,因为它将用master分支更新您的分支。简单而简单。
伊恩·波斯顿成帧器

3
问题是它会尝试将该远程分支与您的CURRENT分支合并,而该CURRENT分支不是远程分支(因为这对您的本地存储库来说是新的)
Z. Khullah

这将合并到您当前的分支。
Eem Jee

4

如果您使用克隆的存储库,--depth 1那么列出的许多命令将无法使用。例如看这里

% git clone --depth 1 https://github.com/repo/code
Cloning into 'code'...
cd code
remote: Counting objects: 1778, done.
remote: Compressing objects: 100% (1105/1105), done.
remote: Total 1778 (delta 87), reused 1390 (delta 58), pack-reused 0
Receiving objects: 100% (1778/1778), 5.54 MiB | 4.33 MiB/s, done.
Resolving deltas: 100% (87/87), done.
Checking connectivity... done.
Checking out files: 100% (1215/1215), done.
% cd code
% git checkout other_branch
error: pathspec 'other_branch' did not match any file(s) known to git.
% git fetch origin other_branch
remote: Counting objects: 47289, done.
remote: Compressing objects: 100% (15906/15906), done.
remote: Total 47289 (delta 30151), reused 46699 (delta 29570), pack-reused 0
Receiving objects: 100% (47289/47289), 31.03 MiB | 5.70 MiB/s, done.
Resolving deltas: 100% (30151/30151), completed with 362 local objects.
From https://github.com/repo/code
 * branch            other_branch-> FETCH_HEAD
% git checkout other_branch
error: pathspec 'other_branch' did not match any file(s) known to git.
%

在这种情况下,我将重新克隆存储库,但是也许还有其他技术,例如git deep clone(clone --depth)错过了远程分支


3

如果您已经这样知道您的远程分支机构...

git remote
=> One
=> Two

并且您知道要签出的分支名称,例如br1.2.3.4,然后执行

git fetch One
=> returns all meta data of remote, that is, the branch name in question.

剩下的就是签出分支

git checkout br.1.2.3.4

然后关闭它的任何新分支。


3

步骤如下。

  1. git fetch origingit fetch --all,这将提取所有到您本地的远程分支,然后这是您可以使用的第二个选项。

  2. git checkout --track origin/<The_remote_branch you want to switch over>

然后在该分支上工作,您可以通过键入以下命令来验证您是否在该分支上

git branch

它显示您当前所在的分支。



2

检查您的.git/config文件,尤其是该远程设备在获取时有什么跟踪。

[remote "randomRemote"]
    url = git@github.com:someUser/someRepo.git
    fetch = +refs/heads/*:refs/remotes/randomRemote/*

如果它heads/*指向randomRemote/*,则在运行时git fetch randomRemote,它将获取所有分支。

然后,您可以检出该分支。

除此以外,

  1. 您需要使用此功能将远程分支添加到跟踪中。.git/config运行此程序后检查。你会明白的。

    git remote set-branches --add randomRemote randomBranch
    
  2. 运行git fetch randomRemote。这将获取远程分支。

  3. 现在您可以运行git checkout randomBranch


1

您可以使用“ git pull”来使分支保持分离。由于很难解释“ lbranch”和“ rbranch”,因此我将使用实际的存储库和分支名称来提供帮助。

让我们使用:

  • myteam.unfuddle.com =远程Git服务器
  • tlc =储存库所在的未混淆项目帐户
  • daves_branch =远程分支名称

    您或任何同事都可以运行此命令仅拉动您的分支机构,而不管有多少分支机构:

    git init
    git pull git@myteam.unfuddle.com:myteam/tlc daves_branch:refs/remotes/origin/daves_branch
    

  • 0

    一个简单的命令git checkout remote_branch_name将帮助您创建一个本地分支,该分支具有远程分支中的所有更改。


    -2
    git checkout -b branch_name
    git pull remote_name branch_name
    

    3
    尽管此代码段可能会回答问题,但最好对其做些什么以及与此处已有的大量答案有何不同之处进行一些解释。
    DaveyDaveDave

    2
    我个人不喜欢此选项。因为如果您要从Master创建一个新分支,然后再从远程分支中提取数据,那么该远程分支可能与该Master不在同一页面上,并且可能会邀请一些不必要的代码更新
    zeetit

    一定要有一些解释。
    彼得·莫滕森
    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.