如何获取远程Git存储库的一个分支?

我想获取远程存储库的单个分支(不是所有分支),并创建一个本地跟踪分支,该分支可以跟踪对该远程分支的进一步更新。远程存储库中的其他分支非常大,所以我希望避免获取它们。我怎么做呢?

281994 次浏览

一种方法是:

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

但这并没有设置跟踪。

更多信息,参见git获取的文档

编辑: As @user1338062 指出下面:如果你还没有想要添加新分支的存储库的本地克隆,但你想要创建一个新的本地存储库,那么git clone --branch <branch_name> --single-branch <repo_url>提供了一个更短的解决方案。

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

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

默认情况下只从原点获取master。 有关详细信息:https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

编辑:刚刚意识到这和-t选项对git远程添加所做的事情是一样的。至少,如果你不想在远程添加后删除远程并使用-t再次添加远程,这是一个很好的方法。

摘自作者的文章:

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

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

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

要更新现有的远程跟踪特定的分支,只使用:

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.
git fetch <remote_name> <branch_name>

为我工作。

为了完整起见,这里有一个新签出的示例命令:

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

一种方法是:

在.git/config中获取远程回购应该设置为获取任何分支:

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

获取远程分支:

git fetch origin branch-name

创建一个本地分支'branch-name',用于从原点跟踪远程分支'branch-name'。

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

列出所有分支

git branch -a

Git版本:2.74

我是这样做的:

git remote add [REMOTE-NAME] [REMOTE-URL]
git fetch [REMOTE-NAME] -- [BRANCH]

我的解决方法:

git fetch --depth=1
git checkout <branch_name>

如果您没有本地克隆:

git clone --depth 1 -b <branch_name> <repo_url>
  1. 选择任何你想使用的<remote_name>(可以随意使用origin 并且跳过步骤1)
  2. git remote add <remote_name> <remote_url>
  3. git fetch <remote_name> <branch>
  4. 选择任何你想使用的<your_local_branch_name>。可以与<branch>相同。
  5. git checkout <remote_name>/<branch> -b <your_local_branch_name>

希望有帮助!

我知道已经有很多答案了,但下面这些步骤对我来说是有效的:

  1. git fetch <remote_name> <branch_name>
  2. git branch <branch_name> FETCH_HEAD
  3. git checkout <branch_name>

这些是基于@Abdulsattar Mohammed的回答,@Christoph对这个回答的评论,以及其他堆栈溢出问题和他们的答案:

Git 2.16.1.windows.4

只做git获取remoteRepositoryName branchName (eg: git fetch origin my_local_branch)就足够了。Fetch将完成,并将创建一个具有相同名称的新本地分支,并将跟踪设置为远程分支。

然后执行git checkout branchName

答案实际上取决于当前的跟踪分支列表。你可以用git fetch <remote_name> <branch_name> 只有在从远程获取一个特定的分支,该分支已经在跟踪分支列表中(你可以用git branch -r检查它)。

让我们假设我之前克隆了带有——single-branch选项的远程,在这种情况下,我拥有的唯一跟踪分支是&;clone &;一个。我有点困惑的建议手动调整git配置,以及键入git remote add <remote_name> <remote_url>命令。作为“git远程添加”;设置一个新的远程,它显然不能与现有的远程存储库一起工作;供应“-t分支”;期权对我没有帮助。

如果远程存在,并且你想要获取的分支存在于该远程:

  1. 使用git branch -r检查是否可以将此分支视为跟踪分支。如果没有(就像我的例子中一个分支克隆),将这个分支添加到跟踪分支列表中。添加选项:
  • git remote set-branches --add <remote_name> <branch_name>
  1. 从远程获取你已经添加的分支:
    <李> git fetch <remote_name> <branch_name> 注意:只有在从远程获取新的跟踪分支后,你才能在跟踪分支列表中使用git branch -r.
  1. 用“checkout——track”创建并签出一个新的本地分支,它将被赋予相同的“branch_name”;作为一个跟踪分支:
  • git checkout --track <remote_name>/<branch_name>

这是最简单的方法

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

示例:我想从原点获取uat分支,并切换到此作为当前工作分支。

   git fetch origin uat && git checkout uat

这个方法对我很有用。

获取目标分支的远程分支:

git fetch origin branch-name

签出目标分支:

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

在这里,我尝试成功地获取release-20.10.08。

name:directory zgong$ git fetch release-20.10.04 release-20.10.04
fatal: 'release-20.10.04' does not appear to be a git repository
fatal: Could not read from remote repository.


Please make sure you have the correct access rights
and the repository exists.
WM-C02WM0T3HTD8:vdca_android_20_10_04_stable zgong$ git fetch origin release-20.10.04
From ssh://stash.trusted.visa.com:7999/vdcbc3a/vmcp-android-mobile-app
* branch                  release-20.10.04 -> FETCH_HEAD
WM-C02WM0T3HTD8:vdca_android_20_10_04_stable zgong$ git checkout -b release-20.10.08 origin/release-20.10.08
fatal: 'origin/release-20.10.08' is not a commit and a branch 'release-20.10.08' cannot be created from it
WM-C02WM0T3HTD8:vdca_android_20_10_04_stable zgong$ git fetch origin release-20.10.08
remote: Counting objects: 637, done.
remote: Compressing objects: 100% (320/320), done.
remote: Total 637 (delta 303), reused 465 (delta 202)
Receiving objects: 100% (637/637), 312.26 KiB | 262.00 KiB/s, done.
Resolving deltas: 100% (303/303), done.
From ssh://stash.trusted.visa.com:7999/vdcbc3a/vmcp-android-mobile-app
* branch                  release-20.10.08 -> FETCH_HEAD
* [new branch]            release-20.10.08 -> origin/release-20.10.08
WM-C02WM0T3HTD8:vdca_android_20_10_04_stable zgong$ git checkout -b release-20.10.08 origin/release-20.10.08
M   VMCP/fmcore_android
M   VMCP/foundation_android
M   VMCP/mep_3ds_android
M   VMCP/mep_login_android
M   VMCP/mep_provisioning_and
Branch 'release-20.10.08' set up to track remote branch 'release-20.10.08' from 'origin'.
Switched to a new branch 'release-20.10.08'

让我把我的两个便士加上MrMadsen的回答:

  1. git fetch <remote_name_or_url> <branch_name>
  2. git checkout FETCH_HEAD -B <branch_name>

MrMadsen的提议相比,这两行代码的主要优点是,即使分支已经在本地存在,它也可以工作。

答案取决于你想要完成什么。

  1. 如果它是来自不同存储库的一次性交易,你不需要引用(例如,合并GitHub Pull Requests,其中<remote_url>类似https://github.com/USER/REPO.git),然后你可以使用:
    git checkout -b <local_branch> <local_branch_to merge_into>
    git pull <remote_url> <remote_branch>
    
  2. 如果你想要更新和跟踪分支,你必须先设置远程,有4种选择:
    1. 如果你正在克隆一个新的存储库(例如,只在它上面工作)
      git clone --single-branch --branch remote_branch remote_url
      
    2. 如果您正在添加一个新的远程到您的工作目录
      # multiple -t options are allowed
      git remote add -t <remote_branch> <remote_repo> <remote_url>
      
    3. 如果您正在向工作目录中的现有远程添加分支限制
      # with --add it will add the branch instead of setting it
      # you can add multiple branches with multiple --add lines
      # wildcards are allowed,
      #   e.g. branch_v\* matching branch_v1, branch_v2, ...
      git remote set-branches [--add]  <remote_repo>  <remote_branch>
      
    4. 你也可以跳过这些限制,因为默认情况下clone只获取主分支,而remote add不获取分支。但是你必须在获取remote_repo时一直提到远程分支。
      git remote add <remote_repo> <remote_url>
      
    设置远程后,您可以获取远程分支,签出和拉:
    # If you set only one <remote_branch> in the restrictions above (i.e no option 4),
    # then you can omit it and still only <remote_branch> will be fetched
    git fetch <remote_repo> [<remote_branch>]
    # without -b the local branch name is guessed to be the same as the remote one
    git checkout --track [-b <local_branch>] <remote_repo>/<remote_branch>
    

检查一个远程对象和已经获取或将要获取的分支的最佳命令是git remote show <remote_repo>。它打印“远程分支”下的分支列表:它还告诉你它们是否被获取,是否被跟踪。

你也可以通过git branch -r列出已知的远程分支来检查远程中的分支限制,如果你有很多遥控器,则结合grep,或者通过检查git配置文件.git/config中的远程详细信息。它将包含如下部分:

[remote "<remote_repo>"]
url = <remote_url>
fetch = +refs/heads/<remote_branch>:refs/remotes/<remote_repo>/<remote_branch>

编辑配置文件将改变限制,但我同意@alexk的意见,这不是一个好主意。

注意:如果一个分支不在远程分支的列表中(在git remote show或配置文件中可见),那么你将不能对它有引用,git将把它保存到临时FETCH_HEAD中,你将不能跟踪它或直接在git checkout中使用它。这就是把我带到这个线程的问题(与问题中的问题相反):我用GitHub客户端gh repo clone USER/REPO克隆了一个repo,它自动添加了“上游”,存储库分叉,只限制到分支“master”。我无法签出其他分支,并得到诸如“致命:'< remote_report >/<remote_branch>'不是一个提交,并且分支'<local_branch>'不能从它创建”之类的错误。我用:git remote set-branches <remote_repo> \*修复了它。

在我的例子中,我想在不创建新的远程的情况下获取一个分支,所以这是有效的:

git fetch <remote url> <remote branch name>:<local branch name>