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


一种方法是:

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

但这并没有设置跟踪。

要了解更多信息,请参阅git获取的文档。

编辑:正如@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,例如:

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

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


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

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

从git帮助远程:

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>

选择任何您想要使用的<remote_name>(可以随意使用origin 跳过第一步。) Git远程添加<remote_name> <remote_url> Git获取<remote_name> <分支> 选择任何您想使用的<your_local_branch_name>。可以与<branch>相同。 Git checkout <remote_name>/<branch> -b <your_local_branch_name>

希望有帮助!


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

Git获取<remote_name> <branch_name> git branch <branch_name> FETCH_HEAD . git Git checkout <branch_name>

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

如何签出远程Git分支? Git中的FETCH_HEAD是什么意思?


git 版本 2.16.1.Windows.4

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

然后执行git checkout branchName


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

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

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

使用git branch -r检查是否可以将该分支视为跟踪分支。如果不是(就像我的例子中一个分支克隆),通过“git remote set-branches”添加这个分支到跟踪分支列表中,带——add选项:

Git远程设置分支——add <remote_name> <branch_name>

从远程获取你已经添加的分支:

Git获取<remote_name> <branch_name> 注意:只有在从远程获取新的跟踪分支后,你才能在跟踪分支列表中使用git branch -r看到它。

使用"checkout——track"创建并签出一个新的本地分支,它的"branch_name"将与跟踪分支相同:

Git checkout——track <remote_name>/<branch_name> . txt


这是最简单的方法

  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'

让我用我的两便士来曲解马德森先生的回答:

Git获取<remote_name_or_url> <branch_name> git checkout FETCH_HEAD -B <branch_name>

与马德森的提议相比,这两条线路的主要优势在于,即使分支机构已经在本地存在,它也能工作。


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

If it is a one time deal from a different repository and you don't need a reference (e.g. to merge GitHub Pull Requests, where <remote_url> is like https://github.com/USER/REPO.git), then you can use: git checkout -b <local_branch> <local_branch_to merge_into> git pull <remote_url> <remote_branch> If you want to update and track the branch you have to set first the remote and there are 4 alternatives: If you are cloning a new repository (e.g. working only on it) git clone --single-branch --branch remote_branch remote_url If you are adding a new remote to your working directory # multiple -t options are allowed git remote add -t <remote_branch> <remote_repo> <remote_url> If you are adding the branch restriction to an existing remote in your working directory # 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> You could also skip the restrictions because clone by default fetches only the main branch and remote add does not fetch branches. Buth then you'll have to mention the remote branch all the remote branch all the time you fetch the remote_repo. git remote add <remote_repo> <remote_url> After setting the remote you can fetch the remote branch, checkout and pull: # 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>。它会打印“Remote branch:”下的分支列表,还会告诉你它们是否被获取,以及是否被跟踪。

你也可以通过使用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的意见,这不是一个好主意。

NOTE: If a branch is not in the list of branches of a remote (visible in git remote show or the config file), then you will not be able to have a reference to it, git will save it to the temporary FETCH_HEAD and you will not be able to track it or to use it directly in git checkout. This is the problem that brought me to this thread (the opposite of the one in the question): I cloned a repo with GitHub client gh repo clone USER/REPO and it added automatically "upstream", the repository forked from, restricted only to the branch "master". I was unable to checkout other branches and getting errors like "fatal: '<remote_repo>/<remote_branch>' is not a commit and a branch '<local_branch>' cannot be created from it". I fixed it with: git remote set-branches <remote_repo> \*.


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

Git获取<远程url> <远程分支名称>:<本地分支名称>