如何只获取远程Git仓库的一个分支?

405

我想获取远程仓库的一个分支(而非全部分支),并创建一个本地跟踪分支,以便跟踪该远程分支的进一步更新。由于远程仓库中的其他分支很大,所以我想避免获取它们。如何做到这一点?


3
"git clone" 命令会获取整个代码仓库,包括所有分支。虽然可以使用浅层复制来限制版本数量,但无法选择特定分支。 - Ikke
2
git clone 只会克隆主分支。如果你使用 git fetch,它会获取所有分支。 - WebComer
“git clone” 命令会获取整个代码库,包括所有分支。但事实并非如此,如果你只获取一个分支,Git 会获取该分支祖先的所有对象,而其他分支可能仍未被获取。对于有许多分支(数千个)的代码库,只获取特定分支可以提高获取速度。 - qneill
18个回答

368
git fetch <remote_name> <branch_name>

对我有效。


34
刚学到,在拉取(fetch)后,拉取的分支(branch)可以作为“FETCH_HEAD”使用。谢谢! - Christoph
16
请使用命令 git checkout FETCH_HEAD 切换当前分支到最新的拉取(fetch)内容。 - d9k
4
如何获得<remote_name>? - mrgloom
16
在大多数情况下,“remote_name”是“origin”。例如:“git fetch origin <branch_name>”。 - Saahithyan Vigneswaran
2
问题在于,如果您稍后“像往常一样”意外运行简单表单git fetch <remote>,则会突然获取整个大型repo。因此最好通过配置来限制提取 - 例如通过git remote set-branches [--add] <name> <branch>…​或(从一开始)通过git clone --single-branch ...来实现。 - kxr
4
这是 Git 命令 git remote -v,它用于列出与当前 Git 仓库相关联的远程仓库的详细信息,包括它们的名称和 URL。 - CervEd

129
我知道已经有很多答案了,但这些是对我有效的步骤:
1. `git fetch ` 2. `git branch FETCH_HEAD` 3. `git checkout `
这些步骤基于@Abdulsattar Mohammed的答案,以及@Christoph对该答案的评论,还有其他相关的Stack Overflow问题和它们的答案:
- [如何检出远程Git分支?](link1) - [Git中FETCH_HEAD是什么意思?](link2)
如果跳过第2步,会出现以下错误:
error: pathspec '<branch_name>' did not match any file(s) known to git

10
我认为这里最有用的答案是: - Daniel Holmes
如果本地已经存在该分支,则会出现以下错误:fatal: A branch named '<branch_name>' already exists. 因此,我根据您的建议提供了这个改进的解决方案 - ToJo
这是唯一一个对我有效的答案。 - Inhabitant
当我运行命令#1时,我会停留在默认分支的开头,而不是我指定的分支。 - dudeNumber4
这种方法的限制是:如果本地已经存在该分支(fatal: a branch named '<branch_name>' already exists),则会失败。要了解即使在这种情况下也能正常工作的解决方案,请参见:https://dev59.com/wGw15IYBdhLWcg3w1vOB#70441995。 - ToJo
步骤1和3足够了,我认为。 - iphondroid

90

其中一种方法如下:

git fetch <remotename> <remote branch>:refs/remotes/<remotename>/<local branch>

这并不会设置跟踪。

要了解更多信息,请参见git fetch文档

编辑:正如@user1338062在下方注明的那样:如果您还没有想要添加新分支的存储库的本地副本,但是您想要创建一个新的本地存储库,则 git clone --branch <branch_name> --single-branch <repo_url> 提供了一种更简短的解决方案。


1
谢谢,这正是OP所要求的。为了创建一个跟踪分支 git checkout -t <远程分支>/<分支名称> <分支名称> - ken
11
如果我只是执行 git checkout <branchname>,我会发现如果该名称的分支仅为远程分支,则 git 会自动设置跟踪分支。 - bukzor
1
这是我唯一有效的方法。即使配置设置为仅获取单个分支的引用,使用fetch或pull仍会拉取所有分支的引用。这个命令只拉取了我想要的分支,所以仓库只有500kb而不是5mb。谢谢。 - herostwist
这是解决方案的关键。设置分支跟踪是一个有点独立的问题,但这是一个命令,它只会获取那个分支所需的提交,而不是花时间更新你可能不关心的repo上的所有其他分支。 - Daniel Skarbek
2
这个答案可能已经过时了。现在git clone支持--branch--single-branch选项,我发布了一个带演示的答案 - user1338062
3
如果你想在克隆后仅获取一个新分支(而不是使用git fetch获取所有分支),那么这仍然有效。 - rubyprince

47

要将现有的远程仓库更新为仅跟踪特定分支,请使用以下命令:

git remote set-branches <remote-name> <branch-name>

git help remote中得知:

set-branches
    Changes the list of branches tracked by the named remote. This can be used to track a subset of the available remote branches
    after the initial setup for a remote.

    The named branches will be interpreted as if specified with the -t option on the git remote add command line.

    With --add, instead of replacing the list of currently tracked branches, adds to that list.

4
太棒了,我在一个 --single-branch 的代码库里,后来无法下载其他分支。谢谢! - Yajo

32

一种实现方法:

在 .git/config 中,应将远程仓库的 fetch 设置为获取任何分支:

   [remote "origin"]
            fetch = +refs/heads/*:refs/remotes/origin/*

获取远程分支:

git fetch origin branch-name

创建一个本地分支 'branch-name' 并使其跟踪远程仓库 origin 上的同名分支。

git checkout -b branch-name origin/branch-name
列出所有分支
git branch -a

17

从作者的帖子中复制:

使用-t选项来添加git remote add,例如:

git remote add -t remote-branch remote-name remote-url

你可以使用多个-t branch选项来获取多个分支。

1
你知道我如何在使用-t分支后向远程添加和删除更多的分支吗? - display name

17
答案实际上取决于您当前拥有的跟踪分支列表。如果该分支已经在跟踪分支列表中(可以使用git branch -r检查),则可以通过git fetch <remote_name> <branch_name>从远程获取特定分支。假设我之前使用--single-branch选项克隆了远程仓库,在这种情况下,我只有一个跟踪分支“cloned”。对于手动调整git配置或键入git remote add <remote_name> <remote_url>命令的建议让我有点困惑。由于“git remote add”设置了一个新的远程,它显然不能用于现有的远程仓库;提供“-t branch”选项也没有帮助我。
如果远程存在,并且您想要获取的分支也存在于该远程中:
1. 使用git branch -r检查是否可以将此分支视为跟踪分支。如果不行(像我一样只有单个分支的克隆),则使用"git remote set-branches"与--add选项将此分支添加到跟踪分支列表中: git remote set-branches --add <remote_name> <branch_name> 2. 从远程获取您所添加的分支: git fetch <remote_name> <branch_name> 注意:仅在从远程获取了新的跟踪分支后,您才能使用git branch -r查看它。
3. 使用“checkout --track”创建并检出一个新的本地分支,该分支将与跟踪分支具有相同的“branch_name”: git checkout --track <remote_name>/<branch_name>

15

为了完整起见,这里提供一个新的检出命令示例:

git clone --branch gh-pages --single-branch git://github.com/user/repo

如其他答案所述,它设置 remote.origin.fetch 如下:

[remote "origin"]
        url = git://github.com/user/repo
        fetch = +refs/heads/gh-pages:refs/remotes/origin/gh-pages

15
如果你想将“git pull”和“git fetch”的默认设置更改为仅获取特定分支,那么你可以编辑.git/config文件,使远程配置看起来像这样:

[remote "origin"]
  fetch = +refs/heads/master:refs/remotes/origin/master

默认情况下,这只会从远程仓库获取主分支。 更多信息请参见:https://git-scm.com/book/en/v2/Git-Internals-The-Refspec 编辑:刚才意识到这与 git remote add 的 -t 选项是相同的。如果您不想删除远程并使用 -t 再次添加它,那么这是一个不错的方法,在添加远程后执行此操作。

1
progit.org/book/ch9-5的链接已经移动到http://git-scm.com/book/en/Git-Internals-The-Refspec。 - here

13

实现该目标的最简单方法

  git fetch origin <branch> && git checkout <branch>

示例:我想从源中获取uat分支并将其切换为当前的工作分支。

   git fetch origin uat && git checkout uat

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