假设我从路径/path/to/repo
克隆一个git存储库。原始存储库将是一个名为"origin"的远程存储库。我可以用命令git fetch origin
从原点获取对象。这将从远程"原点"检索所有对象,包括任何分支。
奇怪的是,如果我用命令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
即master
分支在远程origin
中存储到refs/remotes/origin/master
即origin/master
),而只存储在 FETCH_HEAD
中。
使用URL而不是通过git remote add
设置远程用于一次性拉取即:
$ git pull <URL> <branch or tag>