您可以从任何远程获取任何 ref(只要服务器愿意将其提供给您)。在refs/heads/ 之外获取引用的关键是提供以refs/ 开头的完整引用路径。如果需要,您甚至可以从未配置为远程的存储库中提取(git fetch 可以采用 URL 而不是远程名称)。
默认情况下,配置的远程只会从远程存储库的refs/heads/ 命名空间中获取,因此它们不会在refs/remotes/ 中获取任何内容。但是,您可以通过使用像 refs/remotes/trunk 这样的完整 ref 来引用其中的 ref(remotes/trunk 也可能有效,但也可能不明确)。
如果获取的 refspec 没有指定目标 ref,它将存储在特殊的 FETCH_HEAD ref 中。
将存储库的refs/remote/trunk 获取到 FETCH_HEAD 并将其作为分离的 HEAD 检出:
git fetch remote-name-or-url refs/remotes/trunk &&
git checkout FETCH_HEAD
相同,但创建一个命名的本地分支,而不是使用分离的 HEAD:
git fetch remote-name-or-url refs/remotes/trunk &&
git checkout -b trunk-from-remote FETCH_HEAD
相同,但直接进入本地分支:
git fetch remote-name-or-url refs/remotes/trunk:trunk-from-remote &&
git checkout trunk-from-remote
如果您正在使用已配置的遥控器,则可以重写其 remote.<remote-name>.fetch 配置并添加一个额外条目以自动从 refs/heads/ 和 refs/remotes/ 获取。
# fetch branchs of remote into remote-name/heads/*
git config remote.remote-name.fetch '+refs/heads/*:refs/remotes/remote-name/heads/*' &&
# fetch remotes of remote into remote-name/remotes/*
git config --add remote.remote-name.fetch '+refs/remotes/*:refs/remotes/remote-name/remotes/*'
为避免可能的冲突,上面的示例配置 fetch 以将 ref 存储到不相交的命名空间(…/heads/ 和 …/remotes/)。如果你愿意,你可以选择不同的名字。如果您确定不会有冲突,您甚至可以将它们都直接放在refs/remotes/remote-name/ 下。