`git pull`和git fetch`不一致地解释参数:(设计)bug还是(设计)特性?
这个问题比典型的SO问题更“理论化”,所以我觉得有一定的理由。我在使用git时遇到的一个困难是,我发现自己一直在做一些我认为“应该有效”的事情,但事实并非如此。即使在过去10个月左右的时间里每天都使用git,并且比我工作中使用的任何其他软件工具都更深入地研究它,这仍然是正确的。这意味着,在内心深处,`git pull`和git fetch`不一致地解释参数:(设计)bug还是(设计)特性?,git,Git,这个问题比典型的SO问题更“理论化”,所以我觉得有一定的理由。我在使用git时遇到的一个困难是,我发现自己一直在做一些我认为“应该有效”的事情,但事实并非如此。即使在过去10个月左右的时间里每天都使用git,并且比我工作中使用的任何其他软件工具都更深入地研究它,这仍然是正确的。这意味着,在内心深处,git对我来说根本没有意义。因此,这个问题的目的只是理解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
,如果指定,则指定一个引用,以使用从目标
获取的一系列提交进行更新源
- 如果包含加号,则即使
指向的提交行未完全包含在目标
指向的提交行中,也会强制进行更新源
HEAD
(或ORIG\u HEAD
或MERGE\u HEAD
或FETCH\u HEAD
)位于存储库的根目录中,而另一些引用,如分支和标记以及远程分支,则位于名为“refs”的目录中它们在各自的子目录下进一步分类:
- 分支位于“refs/heads”子目录中
- 标记位于“参考/标记”中
- 远程分支位于其相应远程分支的“refs/remotes/”目录中
- 注释在“参考/注释”中
[+]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