假设我从路径克隆了一个 git 存储库/path/to/repo
。原始存储库将是一个名为“origin”的远程存储库。我可以使用命令从原点获取对象git fetch origin
。这将从远程“原点”检索所有对象,包括所做的任何分支。
奇怪的是,如果我使用 command 从同一个存储库中显式获取git fetch /path/to/repo
,我似乎检索到了所有提交对象,但没有检索到任何分支。
这是为什么?在这两种情况下,我做的事情不是完全相同吗?Git 的行为怎么会如此不同?
命名远程使用他们的配置,他们refspec
在获取此远程时设置模式:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = /path/to/repo
所以,这两种格式是等价的:
git fetch origin
git fetch /path/to/repo +refs/heads/*:refs/remotes/origin/*
基本上:git fetch <path> <source>:<destination>
。目的地在这里很重要,因为它是存储远程 HEAD 和分支指针的地方。
通过这样做git fetch /path/to/repo
,您不会设置任何 refspec。因此,它只获取提交,而不是对象,因为git
没有被指示获取和存储它们。
这里可能有一些细节或命名约定不正确,请随时编辑。但全球的想法应该是正确的
主要区别在于,从 URL 获取不会将远程存储库中分支的状态存储到远程跟踪分支(例如,远程分支到refs/heads/master
aka中) ,而仅存储在.master
origin
refs/remotes/origin/master
origin/master
FETCH_HEAD
一次性使用使用URL而不是设置远程通过git remote add
,即:
$ git pull <URL> <branch or tag>