简述
你必须:
- 与
FETCH_HEAD
合并,或者
- 在你的
git fetch
refspec中指定一个目标引用名称,或者
- 调整
remote.origin.fetch
设置
或者这些项目的某种组合。根据使用的组合,你可能想要将其提取到refs/remotes/origin/master
并运行git merge origin/master
。
解释
关键在于refspecs。在其第二简单形式中,refspec是一对由冒号分隔的引用,例如refs/heads/master:refs/heads/master
。在某些情况下,可以缩写引用,例如master:master
。左侧的名称是源,右侧的名称是目标(Git文档将其缩写为<src>和<dst>)。
然后考虑你的命令:
git fetch origin -- master
(这里的
--
是无意义的。)
git fetch
命令将
origin
视为存储库的名称(因此它查找与
origin
关联的URL和
fetch =
与
origin
关联的refspecs),然后将
master
视为一个refspec,与先前定义的任何
fetch
refspecs组合并部分覆盖。
当您进行--single-branch
克隆时:
git clone {{REPO_URL}} --single-branch --branch my-branch
这将更改与新克隆相关联的fetch
refspecs。(注意:额外的my-branch
参数最终被视为目录名。)运行:
git config --list --local
将会展示给你,除其他内容外:
remote.origin.url=... whatever the URL expanded to...
remote.origin.fetch=+refs/heads/my-branch:refs/remotes/origin/my-branch
这告诉你的 Git,在联系 origin
的另一个 Git 时,默认操作是仅获取他们的分支 my-branch
,并将结果复制到你的远程跟踪名称 origin/my-branch
。
当你运行没有其他参数的 git fetch origin
时,你的 Git 执行此默认操作。
如果没有 --single-branch
,Git 将使用默认的 refspec,fetch=+refs/heads/*:refs/remotes/origin/*
。这将指示 Git 获取所有分支(所有 refs/heads/
名称),并将它们复制到你自己的存储库中的远程跟踪名称。
当你给 git fetch origin
添加其他参数时,它们是refspecs,就像这个 fetch
设置一样。例如,你可以写:
git fetch origin +refs/heads/normalbranch:refs/strangeref
这将指示您的 Git 将他们(本地的,非常正常的)分支 normalbranch
复制到您自己的存储库中命名为 refs/strangeref
的本地引用。
现在,我上面说过,一对名称是 refspec 的第二简单形式。您正在使用最简单的形式:单个名称 master
。没有冒号;没有第二个名称。这仍然是一个有效的 refspec,但在 git fetch
和 git push
中的含义是不同的。由于我们只关心 git fetch
,让我们 看看它在那里的含义,即:
<refspec>
<refspec>参数的格式是一个可选的加号+,后跟源<src>,再后跟冒号`: `,再后跟目标引用<dst>。当<ds>为空时,可以省略冒号。...
匹配<src>的远程引用将被获取,如果<dst>不是空字符串,则使用<src>快进匹配它的本地引用。...
由于您没有:
和目标,因此<dst>部分为空,并且没有本地引用被快速转发。(前导加号+
会告诉Git强制更新本地引用,即使快速转发失败,但首先省略了本地引用,因此+
强制标志对其没有影响。)
这意味着
git fetch
带来的提交仅记录在旧的、向后兼容Git版本1.5的
FETCH_HEAD
文件中。因此,您需要
git merge FETCH_HEAD
来合并保存在
FETCH_HEAD
中的提交ID——另一个Git的
master
分支的尖端提交。
其他选择
如果您在命令行上提供了一个不存在的目标refspec:
git fetch origin master:refs/heads/tmpbranch
在这种情况下,您可以创建一个名为tmpbranch
的新本地分支,然后将其作为参数提供给git merge
:
git merge tmpbranch
然后将其删除:
git branch -D tmpbranch
这样你就可以为下一次做好准备(没有tmpbranch
留在那里,可能会导致git fetch
失败)。
或者,你可以使用强制标志来强制创建或更新你自己的master
分支:
git fetch origin +master:master
这依赖于Git的自动限定,将master
转换为refs/heads/master
——如果您正在编写脚本,最好明确说明;自动限定是为懒惰的人类而不是计算机设计的。然后您可以使用git merge master
。
请注意,如果您已经创建了自己的本地master
并正在使用它,则此操作将覆盖它。出于这个原因,您可能希望改用远程跟踪名称:
git fetch origin +master:refs/remotes/origin/master
然后你可以运行 git merge origin/master
。
最后,你可以将你的 Git 设置为默认获取其他 Git 的 master
分支:
git config --add remotes.origin.fetch '+refs/heads/master:refs/remotes/origin/master'
现在你可以直接运行:
git fetch origin
git merge origin/master
现在从origin
获取,因为有两个remote.origin.fetch
设置,将获取另一个Git的所有分支,mybranch
和master
,并将获取到的哈希ID放置到您的远程跟踪名称中,refs/remotes/origin/mybranch
和 refs/remotes/origin/master
。
(与默认的refspec进行比较,+refs/heads/*:refs/remotes/origin/*
,它告诉您的Git获取所有分支,并创建或更新其名称与其他Git中分支名称匹配的远程跟踪名称。)
-t branchname
可以实现这一点。你可以在我的回答中找到详细信息。 - Marina Liu