Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
`git pull`和git fetch`不一致地解释参数:(设计)bug还是(设计)特性?_Git - Fatal编程技术网

`git pull`和git fetch`不一致地解释参数:(设计)bug还是(设计)特性?

`git pull`和git fetch`不一致地解释参数:(设计)bug还是(设计)特性?,git,Git,这个问题比典型的SO问题更“理论化”,所以我觉得有一定的理由。我在使用git时遇到的一个困难是,我发现自己一直在做一些我认为“应该有效”的事情,但事实并非如此。即使在过去10个月左右的时间里每天都使用git,并且比我工作中使用的任何其他软件工具都更深入地研究它,这仍然是正确的。这意味着,在内心深处,git对我来说根本没有意义。因此,这个问题的目的只是理解git,并希望减少我认为“应该有效”与实际有效之间的不匹配。(顺便说一句,“阅读文档”并不是解决方案;有些东西可以被详细记录下来,但仍然毫无意义

这个问题比典型的SO问题更“理论化”,所以我觉得有一定的理由。我在使用git时遇到的一个困难是,我发现自己一直在做一些我认为“应该有效”的事情,但事实并非如此。即使在过去10个月左右的时间里每天都使用git,并且比我工作中使用的任何其他软件工具都更深入地研究它,这仍然是正确的。这意味着,在内心深处,
git
对我来说根本没有意义。因此,这个问题的目的只是理解git,并希望减少我认为“应该有效”与实际有效之间的不匹配。(顺便说一句,“阅读文档”并不是解决方案;有些东西可以被详细记录下来,但仍然毫无意义。)

这个问题是我之前问的一个问题的后续问题:。特别是,我建议运行该问题中给出的示例脚本,并检查其输出

git pull
命令应该是
git fetch
git merge
的组合

因此,如果
是当前分支,那么运行

git pull --no-edit <REMOTENAME> <BRANCHNAME>
git pull--无需编辑
更新跟踪分支
/
1,而

git-fetch
保持
/
不变,因此尝试将其与
合并通常是不可行的

有没有办法理解这种明显的不一致性?或者,
git fetch
为什么不直接失败,或者至少给出一个警告?它所做的是一个值得保留的常见用例吗

简言之,这种明显的不一致性是
git
接口设计中的一个缺陷,还是一个特性,如果是后者,它又是一个特性

编辑:只是澄清一下:这个问题是不可知的/与上面描述的行为与文档的一致性问题无关。这个问题试图确定的是,在解释它们的参数时,
git pull
git fetch
遵循的约定之间的差异是一个(设计)缺陷还是一个(设计)特性。


1Plus它在
和更新后的
之间执行任何必要的合并,或者至少它启动了此合并。

git fetch手册页上说

获取的引用的引用名称及其对象名称存储在.git/FETCH\u HEAD中。此信息留给git merge稍后执行的合并操作

运行
git fetch origin master
将在
fetch\u HEAD
ref中存储提取结果。您可以使用
git merge fetch\u HEAD
将其合并到当前分支中

手册页还说

参数的格式是可选的加号+,后跟源ref
,后跟冒号
,后跟目标ref

获取与
匹配的远程引用,如果
不是空字符串,则使用
快速转发与之匹配的本地引用

您可以告诉git fetch使用
git fetch原始主机:refs/remotes/origin/master

更新ref

参考规范 首先,让我们揭穿所谓的“refspec”是什么,因为这将是未来需要的

refspec代表“参考规范”。引用是指向提交或其他引用的东西。分支是引用,标记是引用
HEAD
是一种特殊的(所谓的“符号”)引用。现在让我们忽略各种引用之间的区别

通常将引用简称为“refs”

参照规范的形式如下:

[+]source[:destination]
  • source
    指定从中获取一系列提交的引用
  • 目标
    ,如果指定,则指定一个引用,以使用从
    获取的一系列提交进行更新
  • 如果包含加号,则即使
    目标
    指向的提交行未完全包含在
    指向的提交行中,也会强制进行更新
refspec用于抓取和推送,在这些情况下,源和目标ref的含义显然是相反的:当我们抓取时,源ref位于远程repo中,而当我们推送时,源ref位于本地repo中

对于纯Git(我指的是它的引用实现),ref只是名称相对于其存储库根目录的文件(对于普通存储库,这是“.Git”目录,对于裸存储库,这是存储库根目录)

一些引用,如
HEAD
(或
ORIG\u HEAD
MERGE\u HEAD
FETCH\u HEAD
)位于存储库的根目录中,而另一些引用,如分支和标记以及远程分支,则位于名为“refs”的目录中它们在各自的子目录下进一步分类:

  • 分支位于“refs/heads”子目录中
  • 标记位于“参考/标记”中
  • 远程分支位于其相应远程分支的“refs/remotes/”目录中
  • 注释在“参考/注释”中
因此,表示名为“master”的分支的ref的全名实际上是“refs/heads/master”,而从命名的远程存储库“origin”获取的名为“foo”的远程分支是“refs/remotes/origin/foo”

Git使用智能查找机制,允许您在大多数情况下缩写ref名称,但当您希望严格执行的时间存在任何歧义时,可以使用完整(或“更完整”)名称。T
[+]source[:destination]
git fetch git://server/repo.git master devel test
From git://server/repo.git
 * branch            master     -> FETCH_HEAD
 * branch            devel      -> FETCH_HEAD
 * branch            test       -> FETCH_HEAD
git fetch git://server/repo.git master devel:foo test:bar
From git://server/repo.git
 * branch            master     -> FETCH_HEAD
 * [new branch]      devel      -> foo
 * [new branch]      test       -> bar
$ git config --get remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
$ git fetch origin
(this created the "origin/foo" branch)
$ git chekcout -b foo origin/foo
(this created a new local branch "foo" tracking "origin/foo")
$ git commit ...
$ git push origin foo
git checkout foo
git pull origin foo