为什么git要获取originmaster:master快进本地分支?

为什么git要获取originmaster:master快进本地分支?,git,version-control,git-fetch,Git,Version Control,Git Fetch,我一直在玩弄git,并坚持使用git fetch的概念 我尝试并观察了以下情况: (一) $git fetch 获取所有远程分支,并更新所有相应的远程跟踪分支。我知道它查看.git/config文件,并使用默认的远程存储库位置和默认的fetch refspec,通常是“refs/heads/:refs/remotes/origin/”。它不快进任何本地分支 (二) $git获取来源 观察结果与表1相同) (三) $git获取原始主机 仅获取主分支,并更新远程跟踪分支原点/主分支。不快进本地“主”

我一直在玩弄git,并坚持使用git fetch的概念

我尝试并观察了以下情况:

(一)
$git fetch

获取所有远程分支,并更新所有相应的远程跟踪分支。我知道它查看.git/config文件,并使用默认的远程存储库位置和默认的fetch refspec,通常是“refs/heads/:refs/remotes/origin/”。它不快进任何本地分支

(二)
$git获取来源

观察结果与表1相同)

(三)
$git获取原始主机

仅获取主分支,并更新远程跟踪分支原点/主分支。不快进本地“主”分支

(四)
$git获取原始主机:主机

仅获取主分支,并更新远程跟踪分支原点/主分支。快进本地“主”分支

理解1)和2)很简单。然而,3)和4)使我困惑

fetch命令与本地分支有什么关系?为什么它会快速推进本地分支机构?(它影响本地分支的证据是当我尝试
git fetch origin master:master
时,当主分支签出时,它抛出以下错误:
致命:拒绝提取到非裸存储库的当前分支refs/heads/master

根据我的直觉,在任何类型的fetch命令中,更新远程跟踪分支都是默认行为。但是,当执行
git fetch origin master
时,它还有一个更新fetch\u头的额外行为。当执行
git fetch origin master:master
时,它还有一个更新本地分支“master”的行为。我的直觉正确吗

它是否将
git-fetch-origin-master:master
解释为
git-fetch-origin-refs/heads/master:refs/heads/master
?(可能与我之前的问题重复)


它是否将
git fetch origin master
解释为
git fetch origin refs/heads/master:

当您在
中明确提到目的地时,更新匹配的本地ref是预期的行为

格式如下:

git fetch [options] <remote> <refspec>
(显然,对于“来源”和“目的地”)

据说

获取与
匹配的远程引用,如果
不是空字符串,则尝试更新与之匹配的本地引用

您还可以查看上述特定语法


并回答附带问题:

但是,当执行
git fetch origin master
时,它还有一个更新
fetch\u HEAD
的额外行为。当执行
git fetch origin master:master
时,它还有一个更新本地分支“master”的行为。我的直觉正确吗

不完全正确。如果
不是作为
给定的,则给定的名称将被视为
,因此当您执行
git fetch origin master
时,它与
git fetch origin master:master
相同
FETCH\u HEAD
用于内部,即那些
git pull
的内部,并可用于脚本编写,但您不需要在日常git使用中费事

“它是否将git
fetch-origin-master:master
解释为
git-fetch-origin-refs/heads/master:refs/heads/master
?(可能对我前面的问题是多余的)”

是。

它是否将
git-fetch-origin-master
解释为
git-fetch-origin-refs/heads/master:

,如果
一侧为空,则不会更新任何内容,因为您没有指向任何内容。(不要与上面提到的省略
本身的情况相混淆。有趣的是,相反的
:我的分支
正在删除
我的分支
,因为它更新了一个空引用)

基本上是正确的,但遗漏了一些项目

首先,我们必须注意Git版本早于1.8.4的一个特例。提及

  • “git fetch origin master”与“git fetch origin”或“git fetch”不同 未更新“参考/远程/源/主”;这是一个很早的决定 保持远程跟踪分支更新的设计决策 这是可以预测的,但在实践中,人们发现这一点更多 无论何时我们有一个 我们在运行“git push”时一直在更新它们 已经打破了最初的“可预测性”
因此:

git fetch origin master
在Git 1.8.3和更早版本中表现不同。在1.8.4及更高版本中,这将更新
refs/remotes/origin/master
(默认情况下,但这取决于默认的获取refspec)

refspec的描述正确,但缺少一项:通常语法为:

  • 可选的前导加号
    +
    表示
    --force
    (仅适用于此特定参考规范)
  • 源参考
  • 分隔符
    ;及
  • 目的地参考号
源和目标都可以完全限定,例如,
refs/heads/master
,也可以不限定,例如,
master
。如果你使用了一个不合格的变体,Git会找出完全合格的拼写

通常,可以省略源和目标中的一个(有时甚至两个)。对于
git fetch
git push
,这种refspec的含义是不同的。省略源需要包含冒号,而省略目标也可以省略冒号。即:

  • master:master
    ,或
    branch1:branch2
    ,或
    tag:tag
    ,等等,都提供源和目标
  • master
    是一个没有目标的源
  • m
    
    git fetch origin master
    
    git fetch origin